Я хочу передать содержимое блочного устройства по сети прямо в qcow2
образ. Я начал с небольшого моделирования:
[root@okvmh1 default]# dd if=/dev/zero bs=1M count=100 | qemu-img convert -p -f raw -O qcow2 /dev/stdin aaa.qcow2
qemu-img: Could not open '/dev/stdin': Could not refresh total sector count: Operation not permitted
qemu-img: Could not open '/dev/stdin'
Кажется, что qemu-img
не знает желаемого размера изображения. В VirtualBox
Я бы сделал:
<net-command> | VBoxManage convertfromraw stdin aaa.vdi $size --format VDI
Но qemu-img convert
не принимает параметр размера.
Хотя это старый вопрос, я думаю, что стоит показать интересную альтернативу. У меня была такая же проблема, но предоставленный ответ от Майкл Хэмптон не подходил для меня, так как объем данных, который мне нужно было передать, был слишком большим, и времени, которое мне нужно было выполнить, будет недостаточно. Итак, вот что я сделал:
В пункте назначения создайте пустой образ QCOW2, например:
$ qemu-img create -f qcow2 myimage.qcow2 500g
Есть инструмент, который позволяет эмулировать устройство поверх образа QCOW2. Это в основном используется для доступа к содержимому QCOW2, но устройство доступно для чтения и записи, поэтому вы можете рассматривать его как стандартное блочное устройство:
$ modprobe nbd
$ qemu-nbd --connect /dev/nbd0 myimage.qcow2
Теперь у вас есть /dev/nbd0
устройство, которое является блочным устройством, как и любое блочное устройство, но любая операция, выполняемая над ним, будет выполняться над образом QCOW2
Вы можете использовать любую сетевую команду, например ssh
и dd
чтобы волшебство сработало:
$ dd if=myoriginalimg bs=100M | pv -tebrap --size 500g | ssh myhost dd of=/dev/nbd0 bs=100M
Я добавил плюс, используя pv
так что вы можете следить за прогрессом. Я также советую вам запускать эту команду внутри screen
или tmux
сеанс, если он может занять очень много времени, чтобы вы не потеряли работу!
После завершения передачи у вас будет готовый преобразованный образ QCOW2 на myimage.qcow2
, но убедитесь, что вы отключили эмулятор, чтобы ядро не злилось на вас!
$ qemu-nbd --disconnect /dev/nbd0
Вы сделали! Теперь у вас есть готовое преобразованное изображение, переданное из необработанного формата из сетевого источника напрямую в файл QCOW2 без промежуточных звеньев.
Стандартный ввод не доступный, что и пытается сделать qemu-img convert.
Чтобы обойти проблему, используйте входное изображение, которое является файлом в файловой системе или блочном устройстве, оба из которых доступны для поиска.
Потоковая передача образов дисков с использованием dd
или подобное - не лучшая идея, потому что она не сохраняет разреженность. Тем не менее, если вас это не волнует есть плагин nbdkit, который может делать именно то, что вы хотите. Вам все равно нужно будет знать виртуальный размер заранее, потому что qcow2 необходимо знать это для создания контейнера qcow2.