Назад | Перейти на главную страницу

qemu-img: не удалось открыть '/ dev / stdin': не удалось обновить общее количество секторов: операция не разрешена

Я хочу передать содержимое блочного устройства по сети прямо в 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

Хотя это старый вопрос, я думаю, что стоит показать интересную альтернативу. У меня была такая же проблема, но предоставленный ответ от Майкл Хэмптон не подходил для меня, так как объем данных, который мне нужно было передать, был слишком большим, и времени, которое мне нужно было выполнить, будет недостаточно. Итак, вот что я сделал:

Создайте пустой образ QCOW2

В пункте назначения создайте пустой образ QCOW2, например:

$ qemu-img create -f qcow2 myimage.qcow2 500g

Подключите образ QCOW2 с помощью NBD к устройству

Есть инструмент, который позволяет эмулировать устройство поверх образа 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.