通过 QCOW2 映像模拟设备

通过 QCOW2 映像模拟设备

我想通过网络将块设备内容直接传输到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 映像上执行

通过模拟设备执行传输

您可以使用任何网络命令,例如sshdd来发挥魔法的作用:

$ dd if=myoriginalimg bs=100M | pv -tebrap --size 500g | ssh myhost dd of=/dev/nbd0 bs=100M

我添加了一个加号,以便您可以监控进度。如果可能需要很长时间,我进一步建议您在或会话pv内运行此命令,这样您就不会丢掉工作!screentmux

关闭模拟器

传输完成后,您就拥有一个已准备好并已转换的 QCOW2 图像myimage.qcow2,但请确保断开模拟器的连接,以免内核对您生气!

$ qemu-nbd --disconnect /dev/nbd0

大功告成!现在,您有了一个转换后的图像,该图像从网络源的原始格式直接传输到 QCOW2 文件,无需中间件

答案3

使用或类似方法流式传输磁盘映像dd不是一个好主意,因为它不会保留稀疏性。不过,如果你不关心这一点有一个 nbdkit 插件可以做你想做的事。您仍然需要提前知道虚拟大小,因为 qcow2 需要知道该大小才能创建 qcow2 容器。

相关内容