![如何将多部分 VMDK 磁盘映像转换为 qcow2?](https://linux22.com/image/956329/%E5%A6%82%E4%BD%95%E5%B0%86%E5%A4%9A%E9%83%A8%E5%88%86%20VMDK%20%E7%A3%81%E7%9B%98%E6%98%A0%E5%83%8F%E8%BD%AC%E6%8D%A2%E4%B8%BA%20qcow2%EF%BC%9F.png)
我有一个 VMDK 磁盘映像,它以多个文件的形式存在:
2.0G guest-s001.vmdk 1.8G guest-s003.vmdk 128K guest-s005.vmdk
2.0G guest-s002.vmdk 1.7G guest-s004.vmdk 4.0K guest.vmdk
当运行qemu-img
将其转换为 qcow2 格式时,我应该指定哪些输入文件名? 仅指定guest.vmdk
,全部指定,还是指定guest-*.vmdk
?
答案1
过去,我必须先将它们转换为原始图像,将它们连接在一起,然后将生成的原始图像转换为 qcow2:
qemu-img convert guest-s001.vmdk guest-s0001.raw
qemu-img convert guest-s002.vmdk guest-s0002.raw
qemu-img convert guest-s003.vmdk guest-s0003.raw
qemu-img convert guest-s004.vmdk guest-s0004.raw
qemu-img convert guest-s005.vmdk guest-s0005.raw
cat guest-s0001.raw guest-s0002.raw guest-s0003.raw guest-s0004.raw guest-s0005.raw > guest.raw
qemu-img convert guest.raw guest.qcow2
如果最后一个文件的大小小于 2146762752 字节,请不要惊慌。某些 VMware 产品会创建大小不同的 vmdk 跨度。大小应与主 vmdk 文件中范围描述中列出的扇区数的 512 倍相匹配(可使用任何文本编辑器或“cat”读取)。
也许可以一次性完成所有操作,但我还没有尝试过:
qemu-img convert guest-s001.vmdk guest-s002.vmdk guest-s003.vmdk guest-s004.vmdk guest-s005.vmdk guest.qcow2
或者,如果它们实际上不是连续的磁盘映像,那么我不确定该建议什么。:)
祝你好运!
一次转换所有图像的快速终端脚本是:
for i in *.vmdk; do qemu-img convert -f vmdk $i -O raw $i.raw; done
cat *.raw > tmpImage.raw
qemu-img convert tmpImage.raw finalImage.qcow2
rm *.raw
答案2
看起来 qemu-img 命令现在已得到增强。我刚刚使用以下命令将一堆 VMware 多部分映像转换为 qcow2:
$ qemu-img convert <base of the image without the S0001,2etc>.vmdk new-image.qcow2
答案3
从 QEMU 7.1.0 开始,这些答案实际上都不起作用。它变得像处理引用其他较大 vmdk 映像文件的单个小型 .vmdk 文件一样简单。假设您有以下文件集合:
'your-vm-s001.vmdk'
'your-vm-s002.vmdk'
'your-vm-s003.vmdk'
[...]
'your-vm-s011.vmdk'
'your-vm-s012.vmdk'
'your-vm.vmdk'
然后你应该简单地调用qemu-img
如下命令:
qemu-img convert -fvmdk -Oqcow2 your-vm.vmdk your-vm.qcow2
答案4
我本来可以parallel
这样做,但是这里有一个可以执行目录的方法:
ls *s0??.vdmk | xargs -n 2 -I % qemu-img convert % %.img
进而:
cat *.img >> imagename.raw
管道之前的部分将打印所有以一个和两个通配符ls
结尾的 vdmk,该命令允许它将其作为变量替换两次到命令末尾。s0
xargs
%
qemu-img