如何将多部分 VMDK 磁盘映像转换为 qcow2?

如何将多部分 VMDK 磁盘映像转换为 qcow2?

我有一个 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,该命令允许它将其作为变量替换两次到命令末尾。s0xargs%qemu-img

相关内容