ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

qcow2转vmdk完整指南:用qemu-img让VMware Workstation直接加载

qcow2转vmdk完整指南:用qemu-img让VMware Workstation直接加载 简介一份专为系统运维与虚拟化测试人员编写的实操手册解决在VMware Workstation中直接运行qcow2格式镜像的需求适合需要本地部署麒麟V10或评估qcow2镜像兼容性的工程师阅读参考。内容覆盖环境准备与完整操作流程包括VMware Workstation 15.x安装、qemu-img 9.1.0部署与环境变量配置、麒麟V10 ISO系统安装以及qcow2镜像迁移至VMware后的运行步骤其中还针对虚拟磁盘创建方式给出单个文件存储等配置建议帮助规避多文件混乱问题。资源为1个doc文档压缩包大小3.77MB内容聚焦、步骤清晰无需额外资料即可按章操作已有2023人学习并参考适合需要快速搭建虚拟机环境、开展系统部署与镜像测试的用户阅读。1. VMware Workstation 与 qcow2 的格式边界为什么不能直接打开qcow2 是 QEMU/KVM 体系下的磁盘镜像格式VMware Workstation 的虚拟磁盘层只认自己的 vmdk。把 qcow2 文件直接改名为 vmdk 没用哪怕用的是 Workstation Pro 17.x 也一样Workstation 读不到 qcow2 的块分配表和写时复制元数据新建虚拟机时会在启动阶段报「找不到可引导设备」或直接挂载失败。问题不在客户机系统而在宿主机侧的格式层。你多半是这种情况机器上只装了 VMware Workstation却从发行版 Cloud 镜像目录下载了 CentOS、Rocky、Ubuntu 的 qcow2 系统盘或者同事交付的 Linux 镜像就是 qcow2你要在本机复现环境、调脚本、出截图。解决路径只有一条——用 qemu-img 做格式转换把镜像从 QEMU 生态搬进 VMware 生态。后面每一章对应这条链上的一个环节准备工具、转换参数、挂载启动、收尾与压缩。2. 准备 qemu-imgWindows 与 Linux 下的转换工具链qemu-img 是 QEMU 官方磁盘镜像管理工具qcow2 转 vmdk 的标准做法就是它。不要试图用 Workstation 自带的 File - Import 功能去开 qcow2那个入口实际调用的是 ovftoolovftool 只吃 OVF/OVA 包装选 qcow2 文件时对话框直接是灰的。类似 StarWind V2V Converter 的图形工具也能转但功能更新慢对新版本 qcow2 的兼容性不如 qemu-img 及时命令行方式还能写进脚本做批量转换所以先准备 qemu-img 是通用路径。2.1 Windows 上获取 qemu-img 的两种途径Windows 上没有官方单独发布的 qemu-img 小工具常见做法是装完整 QEMU 安装包安装目录里带 qemu-img.exe。装完把安装目录默认是C:\Program Files\qemu加入系统 PATH然后打开 PowerShell 验证qemu-img --version看到类似qemu-img version 8.2.2的输出即可。这里有两个细节一是 PATH 不生效时要重开终端二是版本建议 6.0 以上老版本对 vmdk 的 subformat 参数支持不完整。若不想装完整 QEMU也可以用包管理器choco install qemu winget install QEMU.QEMU上述命令在管理员权限的 PowerShell 中执行装完同样检查 PATH。完整 QEMU 约几百 MB它同时包含 qemu-system-x86_64.exe后续如果要在本地做 KVM 模拟调试同一个环境可以复用不需要再装第二套工具。2.2 Linux 发行版安装 qemu-imgLinux 上按发行版分组安装包名并不完全一样下表是常见发行版的对应关系发行版安装命令实际包名Debian / Ubuntusudo apt install qemu-utilsqemu-utilsRHEL / CentOS / Rocky / AlmaLinuxsudo dnf install qemu-imgqemu-imgopenSUSEsudo zypper install qemu-toolsqemu-toolsRHEL 系如果你的环境还是 yum直接用sudo yum install -y qemu-img效果相同。安装后确认qemu-img --version这里提醒一点qemu-kvm或qemu-system-x86这类包不一定会把 qemu-img 带进来尤其是最小化安装的服务器优先按表里的独立工具包装避免装了完整虚拟化栈却找不到 qemu-img。2.3 先用 qemu-img info 检查 qcow2 镜像状态转换之前先读镜像信息这一步很多人跳过后面在磁盘空间、快照、压缩几个问题上容易踩坑qemu-img info /path/to/disk.qcow2 ls -lh /path/to/disk.qcow2 du -h /path/to/disk.qcow2info 输出的几个字段分别对应virtual size 是客户机看到的磁盘大小disk size 是文件实际占用。ls 显示的是文件的逻辑大小对稀疏文件它按虚拟大小算du 显示真实占用qcow2 和 vmdk 都是稀疏分配两个数字差距大是正常的。转换前用 du 估算磁盘空间最准给目标盘留出 disk size 的 1.2 倍就够而不是 virtual size 的 1.2 倍。同一份信息里如果有 Snapshot list 段落说明镜像内部带快照。内部快照在 convert 时会被展平只保留当前活跃层内容如果快照是你业务数据的一部分先确认当前层就是你要的版本。另外可以顺手检查文件完整性qemu-img check /path/to/disk.qcow2check 输出No errors were found on the image说明基础完好有错误且是数据文件时建议先回原环境修复不要在坏源上直接转换否则转换出的 vmdk 会把损坏块也原样带过去。3. qemu-img convert 转换 qcow2 到 vmdk 的参数与格式选择3.1 convert 命令完整写法转换这条命令是全流程的核心。基本形态如下qemu-img convert -f qcow2 -O vmdk -p /path/to/disk.qcow2 /path/to/disk.vmdk参数含义分解-f qcow2声明源格式省略时 qemu-img 会自动探测但显式声明可以避免探测误判-O vmdk声明目标格式大写 O 表示输出注意和-o小写输出格式选项区分-p显示转换进度镜像大时强烈建议加上否则长时间无输出会让人分不清是慢还是卡死。转换完成后第一步验证是看目标文件qemu-img info /path/to/disk.vmdk file /path/to/disk.vmdkvmdk 输出应该显示file format: vmdk并且 virtual size 与原 qcow2 一致。用 file 命令能看到VMware4 disk image字样这是描述符文件还是数据文件的标识取决于 subformat见下节。提示源路径和目标路径不要写同一个文件qemu-img convert 默认会覆盖已存在的目标转换失败时源文件不一定被保护转换前先备份或使用不同目录。3.2 subformat 选择给 Workstation 还是给 vSpherevmdk 在 qemu-img 里分成几个 subformat不指定时用的是 monolithicSparsesubformat文件形态用途monolithicSparse单文件稀疏 vmdk默认值Workstation 直接用monolithicFlat单文件固定大小附带描述符老 VMFS 场景Workstation 可用但不推荐streamOptimized流式优化单文件上传 ESXi 数据存储或交付给 vSpheretwoGbMaxExtentSparse拆成 2GB 小文件老文件系统FAT32或跨平台传输默认转换出来就是 Workstation 可直接加载的类型。如果你最终要把镜像上传到 vSphere 或交付给使用 ESXi 的同事用 streamOptimizedqemu-img convert -f qcow2 -O vmdk -o subformatstreamOptimized -p disk.qcow2 esxi.vmdk反过来如果别人给你的是 streamOptimized vmdkWorkstation 打开时会有个解包过程首次启动会变慢本地复现建议先转回 monolithicSparseqemu-img convert -f vmdk -O vmdk -o subformatmonolithicSparse esxi.vmdk local.vmdkvmdk 这层还有个小坑-o compat6。它是让生成的 vmdk 描述符采用 ESX 3.0 时代的兼容字段对 Workstation 17 没有任何好处网上有些老教程默认加它实际项目里不用加。3.3 带快照的 qcow2 转换后快照去哪儿了qcow2 的快照机制是内部快照所有快照数据都写在同一个文件里。convert 命令读的是镜像当前活跃层输出的 vmdk 等于把当前状态完整铺平历史快照不会带到 vmdk。这是很多人转换后才发现「数据对不上」的根源。qemu-img snapshot -l disk.qcow2 qemu-img convert -f qcow2 -O vmdk -p disk.qcow2 flattened.vmdksnapshot -l列出当前快照列表后如果目标是保留某个快照分支用qemu-img snapshot -a tag先切换到那个快照再转换转换完成后挂载验证时注意快照时间点是否是你真正需要的。vmdk 没有内部快照概念Workstation 的快照是外部快照 状态文件所以这条路是单向展平回溯能力在转换后丢失。考虑到不少 CentOS 7 时期的老 qcow2 镜像在分发时就被打了多个快照实际项目里我会先执行 snapshot -l 再决定是否直接转换而不是上来就跑 convert。4. 在 VMware Workstation 里加载 vmdk 与启动排错4.1 新建虚拟机并选择已有 vmdk转换完成后打开 VMware Workstation菜单 File - New Virtual Machine选 Custom 模式硬件兼容性选 Workstation 17.x保证 vmx 配置项完整如果镜像要给别人用 16.x 环境降级到 16.x 也安全。安装来源选「稍后安装操作系统」不要选安装光盘镜像否则后续会引导到安装流程。客户机操作系统按实际系统选 Linux - CentOS 7 64-bit 或 Ubuntu 64-bit 等。这里只是影响 vmx 模板和默认设备不影响 qcow2 转换结果。处理器和内存cloud 镜像一般要求不高给 2 核 4G 起步比较稳。网络类型NAT 即可桥接留给需要外部访问的场景。磁盘页选「使用现有虚拟磁盘」浏览到刚才生成的 disk.vmdk。此时如果之前转换用了 monolithicSparse只会有一个文件用 twoGbMaxExtentSparse 时会看到多个 .vmdk选中描述符文件通常是最小的那个。挂载完成后在虚拟机设置里确认磁盘控制器默认经常是 SCSI但对 qcow2 转出来的镜像SATA 更稳。具体见下一节。4.2 固件、磁盘控制器与引导方式的三处配置很多 qcow2 转 vmdk 后启动失败不是转换错了是 Workstation 这三处设置和镜像原本的启动方式不匹配。先讲确认方法转换前用 parted 或 fdisk 看分区表类型有 ef02 分区或 ESP 分区说明是 UEFI否则大概率 BIOS。Workstation 里对应设置如下镜像引导方式Workstation 设置BIOS MBR默认固件 BIOS 即可不用改UEFI GPT虚拟机设置 - 选项 - 高级 - 固件类型选 UEFI磁盘控制器按内核支持选CentOS 7内核 3.10用 SATA 或者 IDE 都稳NVMe 设备在 CentOS 6.5 之前没有驱动能用但启动慢Ubuntu 22.04 这类新镜像 SATA 和 NVMe 都支持。保守选择是 SATA。修改方式虚拟机设置 - 添加/选择硬盘 - 高级 - 虚拟设备节点改成 SATA 0:0。还有一个隐藏问题Workstation 默认给 Linux 虚拟机挂的是 LSI Logic SAS 控制器而很多精简 qcow2比如 Alpine、BusyBox 构建的最小镜像内核里只有 virtio 和 ahci没有 mptsas 驱动。表现是 GRUB 正常但挂载根文件系统时报Unable to find root device。处理方法就是把虚拟设备节点改成 SATA 0:0 或 IDE 0:0再做一次引导。如果界面上某些版本没有固件选项直接编辑 vmx 文件虚拟机目录下同名 .vmx加或改这几行firmware efi sata0.present TRUE sata0:0.fileName disk.vmdk改完保存并重新打开虚拟机。注意修改固件类型后磁盘顺序不会变但如果之前在光驱里挂了安装 ISO启动顺序要手动调整——把硬盘放在第一位。VM Options - Advanced - Boot options 里勾选「启动时强制进入 BIOS/固件设置」是排查引导问题最常用的入口。4.3 启动黑屏、网络不通与 vhv 嵌套虚拟化报错先给一张错误对照表常见现象和处理方式启动报错常见原因处理方法找不到可引导设备 No bootable device固件类型与镜像分区表不符按 4.2 表切 BIOS/UEFI卡在 VMware 启动画面后黑屏磁盘控制器驱动不在 initramfs换成 SATA 或 IDE 控制器启动后网卡没有 IPcloud 镜像把网卡名从 eth0 变成 ens33进控制台配置新网卡或重启网络服务模块「hv」启动失败未能启动虚拟机主机启用 Hyper-V / 内核隔离嵌套虚拟化不完整关闭 vhv 相关设置或关内核隔离最后一行「hv」报错是 Workstation 17 上比较典型的问题。完整错误是「vmware workstation 在此主机上不支持嵌套虚拟化。模块‘hv’启动失败。未能启动虚拟机」。原因不在客户机而是 Windows 主机开了内核隔离内存完整性或者 Hyper-V/Linux 子系统导致 Workstation 检测到 VT-x 能力被虚拟化层接管。处理方式分两步确认客户机是否需要嵌套虚拟化即客户机里是否要再跑 KVM 或其他虚拟化不需要就去 vmx 里去掉或设为vhv.enable FALSE hypervisor.cpuid.v0 FALSE需要时比如要在 VM 里再跑 QEMU/KVM则关闭 Windows 功能设置 - 隐私和安全性 - Windows 安全中心 - 设备安全性 - 内核隔离关掉内存完整性并重启如果仍报错再考虑bcdedit /set hypervisorlaunchtype off但这是全局关闭 Hyper-V会同时关掉 WSL2、Docker Desktop 等依赖它的特性慎用。4.4 cloud 镜像的首次登录与 cloud-init 处理下载的 qcow2 很大概率是 cloud 镜像Cloud Image / GenericCloud这类镜像启动时会执行 cloud-init向 metadata 服务请求主机名、用户数据和 ssh key。Workstation 没有提供 metadata 服务cloud-init 会超时后落到默认状态Ubuntu cloud 默认用户 ubuntu 可以登录但密码策略因镜像而异CentOS 7 cloud 的 root 默认锁定。结果就是转好的 vmdk 能启动却登不进去。常见的补救办法是用 cloud-localds 生成一个 seed.iso挂到虚拟光驱作为 NoCloud 数据源。先生成用户数据sudo apt install -y cloud-image-utils # Debian/Ubuntu # RHEL 系: sudo dnf install -y cloud-utils mkdir -p /tmp/cloudseed cd /tmp/cloudseed cat user-data EOF #cloud-config password: ChangeMe_123 chpasswd: { expire: False } ssh_pwauth: True EOF cloud-localds seed.iso user-datacloud-localds 生成一个 fat 格式的 ISO里面包含 user-data 和 meta-data。把 seed.iso 挂到虚拟机光驱后启动cloud-init 会读到 NoCloud 数据源按 user-data 里设置的密码创建/更新用户并开启密码 SSH 登录。参数说明chpasswd 的 expire 设为 False 表示首次登录不强制改密ssh_pwauth 控制是否允许 root 通过密码 SSH。验证方法登录后执行cloud-init status --wait输出 done 说明初始化消费完成。这个技巧在处理几乎所有从 Cloud 镜像转来的 vmdk 时都能省掉一晚上折腾。5. 收尾技巧qcow2 压缩、稀疏占用与反向转换5.1 压缩 qcow2 再转换的顺序下载的 qcow2 如果之前被反复删除过文件文件内部会留下大量闲置簇disk size 明显偏大。转换前先压缩一轮可以让后续 vmdk 更小qemu-img convert -p -O qcow2 -c big.qcow2 compact.qcow2 qemu-img convert -p -O vmdk compact.qcow2 final.vmdk-c参数只对 qcow2 目标格式生效直接写-O vmdk -c时 qemu-img 会忽略压缩请求这是网上转 qcow2 教程里贴得最多但实际无效的写法。第二轮压缩后 vmdk 的 disk size 会明显小于直接转换未压缩 qcow2 的结果。对 8.x 以上版本还可以先预估qemu-img measure -O qcow2 compact.qcow2输出 required 和 fully allocated 两行required 是仅含有效数据的理论大小fully allocated 是全部分配的保守大小。按 required 预留空间比较激进生产上按两者之间预留更稳。5.2 用 qemu-img 反向把 vmdk 转回 qcow2这是同一套工具的反方向流程。测试环境里在 Workstation 中验证过的镜像要迁回 KVM或者交付方要求 qcow2 时qemu-img convert -f vmdk -O qcow2 -p disk.vmdk back.qcow2 qemu-img check back.qcow2转换后记得跑一遍 check 验证。vmdk 描述符里的 UUID、快照信息不会带到 qcow2 里客户机内部的磁盘 UUID 也保持不变因为转换只改外层格式不动分区内容。批量场景可以直接脚本化for f in *.qcow2; do qemu-img convert -f qcow2 -O vmdk -p $f ${f%.qcow2}.vmdk || echo failed: $f done循环里-p会刷屏且难以分辨每个文件的进度建议去掉或用-q安静模式失败项靠||输出到日志文件。镜像统一命名、统一目录、转换后立即用 qemu-img info 比对 virtual size是这套流程在交付环节的最后一道保险。本文还有配套的精品资源点击获取
返回列表