我想通过网络将块设备内容直接传输到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
不接受大小参数。
答案1
标准输入不是可寻找,这就是 qemu-img convert 在这里尝试做的事情。
要解决这个问题,请使用文件系统或块设备上的文件作为输入图像,这两者都是可查找的。
答案2
通过 QCOW2 映像模拟设备
虽然这是一个老问题,但我认为值得展示一个有趣的替代方案。我遇到了同样的问题,但提供的答案来自迈克尔·汉普顿对我来说不太合适,因为我需要传输的数据量太大,而且我执行操作的时间也不够。所以下面是我做的:
创建一个空的 QCOW2 映像
在目标中,创建一个空的 QCOW2 映像,例如:
$ qemu-img create -f qcow2 myimage.qcow2 500g
使用 NBD 将 QCOW2 映像连接到设备
有一个工具可让您在 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 文件,无需中间件
答案3
使用或类似方法流式传输磁盘映像dd
不是一个好主意,因为它不会保留稀疏性。不过,如果你不关心这一点有一个 nbdkit 插件可以做你想做的事。您仍然需要提前知道虚拟大小,因为 qcow2 需要知道该大小才能创建 qcow2 容器。