ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

vmdk转qcow2实战:从VMware到KVM迁移的磁盘格式转换与空间优化指南

vmdk转qcow2实战:从VMware到KVM迁移的磁盘格式转换与空间优化指南 前一阵帮一个客户做平台迁移遇到一个特别典型的场景客户的生产环境跑在VMware vCenter管理的一堆ESXi主机上新业务因为成本和生态的原因要迁到基于KVM/QEMU的虚拟化平台上。迁移方案想了很多种最后落到虚拟机磁盘格式转换上——把ESXi里的.vmdk转成KVM能跑的.qcow2。真正动手的时候才发现小文件实验怎么转都对一旦到了几十GB上百GB的正式业务磁盘各种问题全冒出来了。这篇博文就把我这次实战中踩过的坑、验证过的流程、以及最后怎么把磁盘空间瘦下来的思路完整记录下来。内容主要分四块转换前怎么判断格式和工具、StarWind V2V Converter 的完整操作流程、转换时到底发生了什么、以及最容易被忽略的 qcow2 空间优化技巧。全程以实际操作记录为主涉及的命令、参数都是我在真实环境里验证过的适合正在做 VMware 到 KVM/OpenStack 迁移、或者想把手头 vmdk 变成 qcow2 跑测试的朋友直接参考。1. 转换前的需求判断与格式认知1.1 vmdk 和 qcow2 到底差在哪里很多人上来就问“怎么把 vmdk 转成 qcow2”但很少有人先想清楚这两个格式是不是真的等价转换之后虚拟机能不能正常启动我见过不止一个同事用 qemu-img 硬转完 vmdk结果 Linux 起来直接 kernel panicWindows 直接蓝屏最后折腾半天才发现是磁盘控制器类型没对上。先说 vmdk。它是 VMware 的虚拟磁盘格式家族里其实分好几种子类型monolithicSparse单文件稀疏格式最常用、monolithicFlat预分配的大平文件ESXi 里厚置备延迟置零就是这种底子、splitSparse2GB 分片稀疏格式VMware Workstation 默认会切成 2GB 一个小文件、streamOptimized流优化格式OVA 导出时就是这个。不同子类型在转换时的表现不一样尤其 splitSparse 那种直接拿 qemu-img 转也认但速度会很慢稍微不注意还会漏掉后面的 -f vmdk 参数。qcow2 是 QEMU 的镜像格式全称 QEMU Copy On Write v2。它的核心特点是“按需分配”——镜像文件本身只记录实际写入的数据块没写过的地方在文件里就是稀疏的“空洞”。再加上支持快照、压缩、AES 加密虽然现在我一般不建议用和 backing file外部快照链在 KVM/OpenStack 生态里基本是默认镜像格式。两者最大的区别不在“能不能装系统”而在“底层分配策略和兼容层不一样”。vmdk 更多强调和 VMware 整个生态vCenter、vSphere、HA、DRS的配合qcow2 是为 QEMU 的存储栈设计的天然配合 libvirt、OpenStack Glance/Cinder。转换的过程本质上就是把 VMware 的 on-disk metadata 重新映射成 QEMU 能识别的 layout同时把你虚拟机的“皮”虚拟机配置、BIOS/EFI 设置换一套。1.2 什么时候需要转、什么时候不建议转先泼一盆冷水不是所有 vmdk 都适合转 qcow2。如果你只是想把 VMware 里的虚拟机导出来在本地用 VirtualBox 跑一跑优先考虑保留 vmdk 格式VirtualBox 直接认 vmdk没必要多转一道。如果你是要把 VMware 的虚机迁到 Hyper-V应该转 VHDX而不是 qcow2。只有你确定目标平台是 KVM/QEMU 生态比如 Proxmox VE、OpenStack、oVirt或者纯 libvirt 环境才值得转 qcow2。还有一种情况不建议直接转源虚拟机里有数据库、ERP、中间件这类对 IO 延迟极其敏感的业务而且源盘是厚置备thick provisioning。这种盘转成 qcow2 理论上没问题但 qcow2 在随机写入场景下会比 vmdk 多一些 metadata 开销。哪怕是现在 QEMU 的 qcow2 性能已经优化得很好生产环境我还是建议转完后做一轮性能压测再切流量。另外如果虚拟机安装的是 Windows尤其是 Windows Server 2016 以后的版本转换前一定要确认系统里有没有装 VirtIO 驱动或者 SCSI 控制器对应的驱动。因为 VMware 默认的磁盘控制器多半是 LSI Logic SAS 或 VMware PVSCSI转换到 KVM 后libvirt 默认可能给你配 virtio-scsi 或 virtio-blk没有对应驱动Windows 直接蓝屏给你看。1.3 工具选型为什么选 StarWind V2V而不是只靠 qemu-img转换 vmdk 到 qcow2 的工具其实不少最常用的是 qemu-img一行命令搞定qemu-img convert -f vmdk -O qcow2 source.vmdk target.qcow2那为什么还要用 StarWind V2V Converter两个原因。第一qemu-img 只能处理“你手头已经拿到文件”的场景。如果 vmdk 还在 ESXi 存储上你得分几步走先用 vSphere Client 把 vmdk 下载下来或者用 vmware-vdiskmanager 导出、再上传到转换机上、然后才能 convert。StarWind V2V 可以直接连接 vCenter Server 或 ESXi host把远端虚拟机磁盘拉下来转省掉中间文件的搬运环节这在批量迁移数十台虚拟机时能省下大量时间。第二StarWind V2V 对 vmdk 子类型的兼容性做得比较细腻尤其 splitSparse 和 streamOptimized 这类变体GUI 里直接选一下就行。qemu-img 虽然也认但某些版本对 streamOptimized 的 vmdk 处理会报错或者转出来的 qcow2 有损坏风险。我踩过一次一个从 OVA 里解出来的 vmdk 是 streamOptimized直接 qemu-img convert 看着转完了但 qemu-img check 一下全是 leaked clusters虚拟机根本起不来。后来用 StarWind V2V 转一次通过没有出错。当然 StarWind V2V 也有短板。它是 GUI 工具不适合做大规模自动化脚本而且它只能做“整盘转换”不能像 virt-v2v 那样顺手帮你重装 virtio 驱动、调整虚拟硬件配置。如果你打算迁移几百台机器我建议的姿势是用 StarWind V2V 做小规模和验证性转换同时把命令行的 qemu-img / virt-v2v 流程跑通后续批量化用脚本压。提示StarWind V2V Converter 目前是免费软件官方下载不需要付费但新版安装后偶尔会提示试用授权选“Free”或“Community”即可功能上不受限制。转换过程中它会要求 .NET Framework建议提前装好。2. StarWind V2V Converter 完整实操流程2.1 下载安装与关键入口StarWind V2V Converter 可以从官网下载安装包不到 100MB装起来也很傻瓜一路 Next 就行。需要注意两点第一安装时它会顺带装一个 StarWind 的驱动组件这个必须保留vCenter/ESXi 连接和 vmdk 解析都靠它。别手贱把勾选去掉。第二软件需要 .NET Framework 4.8 或以上我实测在 Windows Server 2019 和 Windows 10 上都正常Windows 7 就别试了新版基本不支持。装完之后打开主界面你看到的其实是一个向导式的窗口第一步就是问你“你想做什么”。核心选项有四个转换本地文件Local File转换已经在 vCenter/ESXi 上的虚拟机磁盘Virtual Machine转换 Hyper-V 虚拟机Hyper-V直接把物理机转成虚拟机P2V我们要走的是前两个。本地方案适合你已经拿到 vmdk 文件的情况比如从 vCenter 里导出、或者从 OVA 里解出来的vCenter 直连方案适合磁盘文件还在生产存储上、不想先导出来再导进去的情况。注意StarWind V2V 在连接 vCenter 时默认走 vCenter 的 SDK 接口443 端口。如果你只想连某一台 ESXi直接把 vCenter 地址换成那台 ESXi 的 IP 或域名也可以不需要额外装代理。2.2 本地文件转本地文件标准 vmdk 转 qcow2我最常用的场景是手里已经拿到 vmdk 文件比如迁移离线备份、或者客户给了打包好的 OVA 包。操作路径打开 StarWind V2V Converter选 Local File然后 Browse 定位到你的 vmdk。选源镜像类型。如果文件是从 OVA 解出来的选 “VMware virtual machine” 一般都能识别。选择目标镜像格式。这里列表里有 VHD、VHDX、VMDK、QCOW2直接选 QCOW2。选目标位置。可以新建一个目录或者放同目录下命名建议别带空格和中文否则后边 qemu-img 处理会有意想不到的麻烦。它会问你要不要用压缩选项。这里我一般选“No compression”或“Default”因为压缩会拖慢转换速度而且压缩后的 qcow2 在 KVM 里运行时会有额外 CPU 开销。如果你只是用来归档存储再单独另存一个压缩副本就好。确认后点 Convert等进度条走完。转换速度取决于源 vmdk 的实际数据量而不是虚拟磁盘大小。假设一个 200GB 的 vmdk 但实际只写入了 60GB 数据StarWind 转换时间大概 10-30 分钟取决于磁盘速度。转完后别急着部署先验证一下 qcow2 文件是否完整qemu-img check /path/to/your-disk.qcow2 qemu-img info /path/to/your-disk.qcow2如果 check 出来没有错误、info 显示的 virtual size 和源盘一致那再拿去启动虚拟机。这一步养成习惯能帮你避开不少低级事故。2.3 从 vCenter/ESXi 直接拉取虚拟机磁盘转换如果 vmdk 还在 vCenter 上不想先导出StarWind V2V 提供了一条更快的路打开主界面选 Virtual Machine然后选 “VMware vCenter Server” 作为源类型。填 vCenter 地址、用户名、密码。如果遇到证书过期警告先点“Ignore”或“Accept”跳过证书问题后面单独讲怎么处理。连接成功后界面会列出 vCenter 里所有的集群、主机、虚拟机。展开到你目标虚拟机注意它默认列的是虚拟机不是直接列 vmdk 文件。选中虚拟机之后下面的列表会显示它挂载的磁盘每个磁盘对应一个 vmdk。选好要转换的磁盘后面的步骤和本地转换一样选 QCOW2 输出。这里有个小细节StarWind V2V 在从 vCenter 拉取 vmdk 时如果你选的是“Increment”或“Full”这类选项要注意源虚拟机是否开着机。虽然 vCenter 支持在虚拟机运行状态下做快照但如果虚拟机一致性没做好数据库没用 VSS 或文件系统没冻结转出来的 qcow2 可能是不一致的启动后 FS 检查会报错。稳妥做法是在线转换仅用于对一致性要求不高的虚拟机数据库类的一定要先做静默快照或者干脆关机转。提示如果你发现 StarWind V2V 连接 vCenter 后列出的虚拟机里没有目标机器大概率是权限不够。vCenter 的只读账号有时候看不到虚拟机的磁盘拓扑建议至少给一个能读取虚拟机和存储的只读角色。3. 转换原理与参数细节拆解3.1 V2V 转换时到底发生了什么很多人以为 V2V 就是“把文件格式换个外壳”其实没这么简单。StarWind V2V 做转换时干的活可以拆成三步第一步解析源 vmdk 的 metadata。vmdk 文件除了数据还有一套描述文件.vmdk 里面有一段 descriptor指向具体数据和各种 extent。分片 vmdk 还要把多个 extent 拼成一个逻辑上完整的磁盘视图。StarWind 会按顺序把 extent 读出来重新组织成一条连续的虚拟磁盘数据流。第二步按目标格式的规范重新封装。qcow2 的 metadata 是 L1/L2 表结构每 64KB 一个 clusterStarWind 需要把源盘的块映射到 qcow2 的 cluster 上同时维护 refcount 表。这本质上是在做一次“数据 元数据”的双重重写所以转换过程中 CPU 和磁盘 IO 都会比较高。第三步处理 sparse 和 hole。源 vmdk 如果是稀疏的文件中会有很多没有实际分配的区域转换成 qcow2 时这些区域应该变成 qcow2 的“未分配”状态而不是真的把零字节写进去。StarWind V2V 和 qemu-img 都能识别这种 hole但前提是源文件本身有正确的 sparse 标识。如果源 vmdk 是从 fat32/NTFS 分区拷贝过来的sparse 标识可能已经被抹掉了那转换出来的 qcow2 就会变得出奇的大。3.2 关键设置压缩、格式子类型与控制器转换时界面里几个选项每一个背后都有讲究。首先是压缩选项。StarWind V2V 转换到 qcow2 时如果你勾选了压缩它内部会用 zlib 对每个 cluster 做压缩处理。好处是镜像体积小坏处是转换时间明显变长而且虚拟机运行时读取压缩 cluster 需要额外解压CPU 占用会高一些。我的建议是生产运行镜像不压缩归档镜像单独压缩。其次是 vmdk 的子类型。如果你选源文件后StarWind 没自动识别出来可以手动指定是 monolithicSparse 还是 streamOptimized。streamOptimized vmdk 在 OVA 导出时很常见它内部数据是按流的方式组织的某些工具不识别。StarWind 能识别但在转换前会提示“源镜像可能是流优化格式”不用慌直接继续即可。最后是控制器类型。StarWind V2V 毕竟是磁盘转换器不是虚拟硬件迁移器它不会帮你把虚拟机的控制器从 LSI 换成 virtio。这意味着转换完的 qcow2 在 KVM 里启动时需要你在 virt-manager / OpenStack flavor 里手动指定源机器原本的控制器类型比如用-device lsi或 SATA 控制器来引导系统等系统起来后再换成 virtio 并安装 virtio 驱动。如果你不想这么麻烦后面提到的 virt-v2v 能一条龙处理。3.3 转换后的磁盘文件验证转换完一定要做三件事缺一个都可能让后续部署翻车。第一件用 qemu-img info 查看虚拟大小virtual size和实际大小disk size。虚拟大小应该和源 vmdk 的虚拟大小完全一致如果差了哪怕 512 字节说明转换过程中有数据没对齐坚决不能用。第二件用 qemu-img check 检查镜像完整性。如果有 leaked clusters 或 refcount 错误多半是转换时源文件被占用/变更导致。这时候重新转一次转换前确保源 vmdk 没有被其他进程写入。第三件把 qcow2 挂到一个临时虚拟机上做一个 sanity boot。Linux 的话能起来、能看到根文件系统、能登录就基本没问题Windows 的话只要能过滚动条不蓝屏就算成功一大半。# 简单验证命令 qemu-img info converted.qcow2 qemu-img check converted.qcow2 # 临时启动一个测试虚拟机 qemu-system-x86_64 -m 2048 -hda converted.qcow2 -boot c -nographic4. qcow2 空间优化技巧从膨胀到苗条4.1 为什么你转出来的 qcow2 比你想象中大这是所有做 V2V 的人都会遇到的事明明源 vmdk 只用了 40GB转成 qcow2 后发现文件 200GB完全没体会到 qcow2 的“动态分配”优势。问题出在两个层面。第一个层面源 vmdk 是厚置备格式。ESXi 上如果虚拟机磁盘创建时选了“厚置备延迟置零”或“厚置备快速置零”那 vmdk 文件的实际大小从一开始就是完整容量比如你创建了 200GB 的盘vmdk 就是 200GB。转换时如果工具把整个 vmdk 从头到尾都读了一遍还会把“未使用但已置零”的区域也当作有效数据处理qcow2 为了保持语义一致性往往会把那些区域也分配进 L2 表或标记为已分配结果就是 qcow2 保留了 200GB 的“已分配”状态。虽然数据本身是零但从 qcow2 的 metadata 看它可能并不稀疏。第二个层面guest 内部删除文件并不会真正把磁盘块置零trim/zero。Windows 的 NTFS 分区里删除 100GB 文件后文件系统只是标记这些块为“未使用”但块里的数据还保留着同样Linux ext4/xfs 默认删除也不会自动 discard。这些块在 vmdk 里看就是“有效已分配”的数据——哪怕里面的内容是垃圾。转换时被当作有效数据保留下来qcow2 自然瘦不了。说白了空间优化的核心不是“转换时压缩”而是“转换前把 guest 内部的有效数据整理好、把垃圾数据清零”。4.2 最直接的瘦身手段qemu-img convert -c不管用 StarWind 转完后体积多大你都可以再用 qemu-img 重新转一遍带上-c参数做压缩顺便把稀疏属性理顺qemu-img convert -O qcow2 -c converted.qcow2 converted-compressed.qcow2这个命令会把 converted.qcow2 里所有已分配但内容可压缩的 cluster 做压缩最终文件往往能缩小 30%-50%。但要注意它只压缩有数据的 cluster对“已经是稀疏空洞”的 cluster 不产生影响也就是说guest 内已删除但未清零的数据还在压缩效果取决于这些数据本身能不能被 zlib 压缩。所以如果你想追求极限瘦身还是得先处理 guest 内部的已删除数据。4.3 真正的救星virt-sparsifylibguestfs 工具集里的 virt-sparsify 是我处理 qcow2 空间问题时最推荐的工具。它可以把镜像里所有“文件系统认为空闲的区域”识别出来然后“真正地”把对应块置零最后重新生成一个稀疏的新镜像。基本用法virt-sparsify converted.qcow2 sparse.qcow2它内部会调用 guestfish 打开 guest 文件系统遍历 inode 分配表把所有未分配的数据块写零然后重新构建 qcow2 的分配表只保留有数据的 cluster。注意它是离线的不能在虚拟机运行时执行。另外目标文件不能是源文件本身不能原地 sparse必须先输出到新文件。如果 Windows guest 的 NTFS 无法被 libguestfs 识别可以先在 VMware 里对 Windows 做一次“磁盘碎片整理 sdelete -z”把空闲区清零然后再转。Linux guest 则可以在源机里执行fstrim -av如果虚拟机支持 discard/trimfstrim 会把未使用块通知给底层存储vmdk 会变成稀疏然后再做转换效果会很显著。不过 ESXi 上的 vmdk 默认不一定开了 trim 透传所以更稳妥的还是转换后用 virt-sparsify。我自己在实战里测试过一个 300GB 的 Windows 虚拟机vmdk 实际使用 120GB直接转 qcow2 后 300GB因为源就是厚置备然后我用 virt-sparsify 处理后最终 qcow2 只有 112GB说明文件系统内部还有 8GB 可压缩数据和若干 metadata 开销基本上达到了理论极限。4.4 空间优化的完整组合拳把上面所有手段串起来我一般这样操作在源虚拟机内做数据整理。Linux 删掉无用的日志、缓存Windows 清理临时文件和回收站。对 Windows 执行sdelete -z c:清零空闲区对 Linux 执行fstrim -av或dd if/dev/zero of/tmp/zero bs1M后删除该文件。关机用 StarWind V2V 从 vCenter 导出并转为 qcow2。对新 qcow2 依次执行qemu-img check和virt-sparsify。最后如果还要归档再执行一次qemu-img convert -O qcow2 -c得到一个体积最小、可长期归档的镜像。这套流程跑下来我基本没有碰到过“转完比源盘还大”的尴尬情况哪怕是厚置备源盘也能做到 qcow2 文件大小接近虚拟机内实际数据量。优化步骤作用位置效果注意事项源机内清理垃圾文件guest 文件系统减少有效数据量需停机或静默sdelete / fstrim 清零空闲区guest 文件系统让空闲块可被识别为稀疏Windows 需管理员权限StarWind V2V 转换跨格式转换完成 vmdk-qcow2别开压缩virt-sparsifyqcow2 镜像层找回 sparse 空洞不能原地操作qemu-img convert -cqcow2 镜像层压缩有效数据增加 CPU 开销5. 常见问题排查与避坑指南5.1 vCenter 证书过期导致连接失败做 vCenter 直连转换时最常见的问题就是“certificate has expired”或“unable to connect to server”。VMware vCenter 自签证书默认有效期很短过期后很多 SDK/API 客户端都会拒绝连接StarWind V2V 也不例外。处理办法分两种。临时办法在 StarWind 的连接界面弹出的证书警告中点 Accept/Ignore跳过校验就能连上。但如果在较新的版本里直接报错且没有跳过的按钮那就得先在浏览器里登录一下 vCenter打开https://你的vCenter地址确认证书问题是否在 Web 层已经出现。如果是整个 vCenter 的证书链过期了最快的修复方式是用 vSphere Client 连上 vCenter在“证书管理”里重新生成证书或者直接重启 vCenter 服务让系统自签证书重新加载。如果客户环境不允许动 vCenter还有一条路跳过 vCenterStarWind V2V 直接连接 ESXi host 的 443 端口用 ESXi 的 root 账号登录也能看到该主机上所有虚拟机的磁盘。这种方式绕过了 vCenter 的证书和授权层但只能一台一台主机处理。注意ESXi 的证书也会过期。如果直接连 ESXi 也提示证书问题同样先浏览器访问https://ESXi地址/ui接受一次自签证书再回来重试很多客户端就会放下戒心。5.2 转换后虚拟机无法启动症状很多归纳起来主要三类第一类Linux 内核 panic提示VFS: Unable to mount root fs。大概率是磁盘控制器变了KVM 给虚拟机默认配置的 virtio-blk 在 initramfs 里没有对应驱动。解决办法启动临时虚拟机时手动指定磁盘控制器为 IDE 或 SATA用-drive filexxx.qcow2,ifide或 virt-manager 里把磁盘总线改成 SATA进系统后重新生成 initramfs把 virtio 相关模块加进去再改回 virtio 启动。第二类Windows 蓝屏常见的 STOP 代码是 INACCESSIBLE_BOOT_DEVICE。这是 Windows 加载不到对应磁盘驱动的经典表现。处理方式转换前就在源 Windows 里安装 virtio-win 驱动或者在转换后用 virtio-win 驱动盘挂载到新虚拟机进恢复模式注入驱动。StarWind 本身不做这个操作所以这个坑躲不开。第三类uefi 引导机器转换后黑屏或提示找不到引导项。如果源虚拟机是 UEFI 引导KVM 那边也要配置 UEFI 固件OVMF否则固件不认引导分区。virt-manager 里新虚拟机开机时如果界面变黑多半就是这里没配好。5.3 空间越转越大问题出在哪前面已经解释过原理源盘厚置备、guest 未清理空闲区、转换时把零数据也当作有效数据处理都会导致 qcow2 膨胀。排查时按顺序确认qemu-img info看 disk size 和 virtual size 的比例。virt-sparsify --in-place或输出到新文件看是否能瘦下来。如果 virt-sparsify 提示无法识别文件系统多为 Windows 或加密分区那就回到源虚拟机做 sdelete -z 再重新转。如果连 sdelete 都做了还是很大检查是否启用了 qcow2 的 preallocationmetadata 或 full。有些虚拟化平台在创建 qcow2 时默认预分配了 metadata虽然占的空间不大但如果手动指定过 full那 qcow2 会按照完整容量预分配看起来就是 200GB。5.4 高频问题速查表现象大概率原因快速处理连接 vCenter 超时端口不通或证书过期检查 443 端口、浏览器先访问 vCenter 接受证书转换进度卡在 99%源 vmdk 有快照链将多个 vmdk 快照整合快照删除后再转换qcow2 启动报 “trying to acquire lock”qcow2 正被另一进程占用检查是否有 qemu 或 qemu-img 还在操作该文件Windows 蓝屏 0x7B缺磁盘控制器驱动转换前装 virtio-win 驱动Linux 起不来且无报错UEFI/BIOS 引导不匹配确认 KVM 固件类型必要时改用 SeaBIOSqemu-img check 报 leaked clusters源文件在转换时被写入关机或快照后再转换qcow2 无法挂载为 NTFSguest 分区有残留错误在源系统里执行 chkdsk /f 后再关机转换5.5 StarWind V2V 与其他工具的组合姿势最后分享一下我现在的标准作业流程。单个虚拟机、十几台以内的迁移直接 StarWind V2V virt-sparsify 组合超过二十台我就会切换到 qemu-img virt-v2v 脚本化批量处理。virt-v2v 是红帽出品的整套迁移工具它能直接读 vCenter/ESXi 的虚拟机自动注入 virtio 驱动、调整引导配置、生成 libvirt XML甚至还能根据源系统类型自动选择 BIOS/UEFI。唯一的问题是它对 Windows virtio 驱动的注入需要一份 virtio-win 镜像文件且版本匹配要仔细。StarWind 则胜在简单直接不挑环境GUI 点点就行。我个人的习惯是遇到 Windows 虚拟机优先 StarWind V2V 转换磁盘然后手动挂载 virtio-win 驱动遇到 Linux 虚拟机如果时间充裕直接 virt-v2v 一把梭无论哪种方式转换后的 qcow2 一定会跑一遍virt-sparsify qemu-img check才敢上线。最后再分享几个实操中的小细节前面该讲的操作都讲了这里再补几条我实际工作中反复验证过的经验。第一转换前尽量给虚拟机做一个快照或者干脆关机。不是每次都会出问题但一旦在转换过程中源 vmdk 有写入你得到的就是一个损坏的 qcow2排查起来相当痛苦。StarWind 的在线转换虽然方便但我只用来处理负载极低、只读性质的虚拟机正式业务一律关机转或快照后转。第二转换完的 qcow2 不要马上丢到 OpenStack Glance 里先在本地用 qemu-system 启动验证一下。OpenStack 那边镜像一旦注册错了后续一系列 flavor 和 network 的排查会把时间无限拉长。本地启动验证 10 分钟能帮你省下半天。第三如果转换的 vmdk 是从 OVA 解压出来的先看 OVA 里有没有 .mf 校验文件有的话先校验一遍再转。有些 OVA 下载不完整解压出来的 vmdk 本身就已经损坏直接转换大概率失败。第四qcow2 文件建议放在支持 sparse file 的文件系统上Linux ext4 没问题Windows NTFS 对稀疏文件支持一般。如果你把 qcow2 放在 NTFS 分区里稀疏属性可能不会被保留文件会显得很大。做空间对比时一定要在同一文件系统上比较否则数据没有参考意义。第五如果是给生产环境做迁移转换后在目标 KVM 主机上跑一轮 fio 或 dd 读写测试确认磁盘性能没有异常波动再切换流量。遇到很多次转换后“系统能启动但读写很慢”的情况最后定位是压缩标志没关虚拟机的每个读操作都要做一次解压CPU 成了瓶颈。这套 vmdk 转 qcow2 的流程我前前后后跑了几十次从最开始踩各种坑到后来形成一套固定打法StarWind V2V 在其中是一个非常顺手的“第一公里”工具但真正决定成败的还是转换前的清理和转换后的验证。希望这篇实战记录能帮你少走一些弯路。
返回列表