很多人第一次拿到 .vhd 文件,是刚从 Hyper-V、Azure 或者某台实体机的备份里导出的镜像。结果在 VMware Workstation 里死活打不开——新建虚拟机时选“使用现有虚拟磁盘”,把文件类型切到“所有文件”,好不容易选中那个 .vhd,点确定后等来的却是一句冷冰冰的提示:“指定的文件不是虚拟磁盘,无法启动”。我第一次遇到时也以为镜像坏了,反复下载了三遍才意识到,这是 VMware 在格式层面对 .vhd 的拒绝。这篇就把这件事彻底讲透:VMware Workstation 到底能不能直接用 .vhd?如果不能,有哪些绕过或转换的可行路径?以及转换之后那些常见的启动崩溃、驱动蓝屏问题,应该怎么收拾。适合正在做 Hyper-V 到 Workstation 迁移、拿到 vhd 镜像想在本地测试、或者只是想从 vhd 里抢救几个文件的人。
1. 为什么 VMware Workstation 认不出 .vhd 文件
1.1 VHD 和 VMDK 的底层结构根本不是一回事
很多人以为虚拟磁盘格式就是换个后缀名的事,把 .vhd 改成 .vmdk 就能用,其实完全不是这样。VHD 是微软提出的虚拟磁盘规范,动态 VHD 的文件末尾有一个 512 字节的 footer,里面记录了磁盘容量、块大小、校验和,文件中间还有 Block Allocation Table(块分配表),用来维护哪些数据块已经被写入。而 VMDK 是 VMware 的格式,文件开头有 VMware 的魔数标识(KDMV),并且分成两种形态:一种是一个纯数据文件加一个文本 descriptor 描述文件,叫 split/flat 模式;另一种是把描述信息和数据封装在同一个文件里,叫 monolithicSparse 模式。
这两种格式的元数据、块映射、扇区寻址方式完全不同。VMware Workstation 的虚拟磁盘驱动层只认识 VMDK 内部的描述符和块结构,看到 VHD 的 footer 和 BAT 根本无从下手。所以问题从一开始就不只是“打不开”,而是 VMware 的存储栈压根不打算把 VHD 当成一块合法的虚拟磁盘来处理。
1.2 “指定的文件不是虚拟磁盘”到底是怎么触发的
这个报错其实是在虚拟磁盘库做格式鉴定时直接失败的。VMware Workstation 在“新建虚拟机 - 使用现有虚拟磁盘”这一步,会调用虚拟磁盘识别模块去读取文件头,判断它是不是自己支持的磁盘镜像。如果识别不到 VMDK 的魔数、VHD 的“conectix”标识,或者其他受支持的格式标志,就会返回一个通用的格式错误。界面上的文案就是那句“指定的文件不是虚拟磁盘,无法启动”。
有人会问,那既然 VHD 也是虚拟磁盘,VMware 干嘛不顺便支持一下?这里就要怪格式差异了,VMDK 的 descriptor 文件会记录磁盘的 CID、父盘信息、磁盘类型,这些在 VHD 里都没有对应概念。就算 VMware 强制把 VHD 挂上去,后续做快照、做磁盘扩展、做一致性校验都会出问题。所以 Workstation 干脆在入口就拦住了。有些版本的 Workstation 文件选择器甚至会直接把 .vhd 过滤掉,你只有切换到“所有文件”才能看到它,然后就是白折腾一次。
1.3 官方边界:Workstation 和 vSphere 对 VHD 的态度不同
这里要注意一个容易混淆的点:VMware 的 vSphere / ESXi 体系里是支持通过 VDDK(虚拟磁盘开发套件)读取 VHD 的,vCenter 的转换工具、虚拟机的导入导出功能也支持 VHD 作为来源。但这套能力并没有开放给 Workstation 的图形界面。Workstation 面向的是桌面级用户,官方文档里支持的客户机磁盘格式一直聚焦在 VMDK 以及少量辅助格式(如 .dsk、.flp),你找不到任何一项写着“支持 VHD 直连”。
所以在 Workstation 里,你面对的现实就是:要么转换格式,要么走旁路。下文要讲的四种办法,都是围绕这两条路展开的。
2. 方案一:不转换,在客户机系统里直接挂载 .vhd
2.1 这个方案的适用边界
既然 VMware 的存储层不认 VHD,那能不能绕开存储层,让虚拟机内部的 Windows 系统自己来认?完全可以。Windows 从 Vista 和 Server 2008 开始就原生支持 VHD 挂载,右键一个 .vhd 文件,选择“装载”,它就会变成一块新的磁盘出现在“此电脑”里。这个能力是操作系统自带的,跟 VMware 无关。也就是说,只要你能把 .vhd 文件以某种方式放进 VMware 虚拟机里,客户机就能直接读取它。
这个方案的适用场景很明确:数据盘、备份盘、或者你只是想从旧的 vhd 系统盘里捞几个文件出来。它不适合的场景是:你想让这个 vhd 作为操作系统盘启动。客户机里挂载的 VHD 只能作为附加数据盘存在,Windows 不允许同一个系统“活在”另一个 vhd 里再启动它自己。但如果你只是做数据迁移、拷贝文件、查看磁盘内容,这反而是最快、最不需要额外工具的办法。
2.2 实操步骤
第一步,让 VMware 虚拟机能看到宿主机上的 .vhd 文件。最简单的做法是开启虚拟机的共享文件夹:在“虚拟机设置 - 选项 - 共享文件夹”中添加一个指向 .vhd 所在目录的共享。
第二步,在客户机里打开“此电脑”,访问共享文件夹,把 .vhd 文件复制到客户机的本地磁盘(比如 C 盘临时目录)。这一步有必要,因为在网络路径上直接点击“装载”偶尔会失败,而且对共享文件做磁盘挂载有潜在锁问题。
第三步,右键复制的 .vhd 文件,选择“装载”。如果没有反应,就打开“磁盘管理”,点击菜单栏的“操作 - 附加 VHD”,浏览到该文件并确定。挂载成功后,磁盘列表里会多出一块磁盘,带一个盘符,里面的分区和文件都能直接浏览。
第四步,用完以后,在“此电脑”里右键该磁盘对应的盘符,选择“弹出”,或者在“磁盘管理”里“操作 - 分离 VHD”,避免长时间占用导致文件句柄锁住。
2.3 踩坑提醒:别把 VMware 存储层和客户机挂载搞混
这个方案看起来简单,但有个坑非常容易踩:有些人会想,既然客户机里能挂载 VHD,那我能不能直接把这个 VHD 文件放在 VMware 虚拟机的磁盘目录里,然后在“虚拟机设置 - 硬盘”里把它添加为第二个磁盘?答案是不行。你这么做的时候,VMware 还是会去识别文件格式,结果一样是“指定的文件不是虚拟磁盘”。客户机里的挂载是在操作系统内部完成的,VMware 的虚拟化层根本不知道客户机在干什么。所以一定要明确:vhd 文件对 VMware 来说始终只是一个普通数据文件,它的“磁盘身份”只存在于客户机 Windows 内部。
另外要注意,如果客户机是 Linux,想直接挂载 vhd 会比较麻烦,通常得装 qemu-nbd 或者 libguestfs 工具,不太适合普通用户。这就是为什么我说这个方案的前提是“客户机是 Windows”。如果你的 VMware 虚拟机是一个 Linux 系统,请直接跳到下面的转换方案。
3. 方案二:qemu-img 命令行转换,一条命令解决问题
3.1 qemu-img 为什么值得信任
接下来是重头戏:用 qemu-img 把 .vhd / .vhdx 转成 .vmdk。qemu-img 是 QEMU 虚拟化套件自带的磁盘镜像管理工具,免费、开源、跨平台,支持 vpc(VHD)、vhdx、vmdk、qcow2、raw 等几乎所有主流虚拟磁盘格式互转。我这些年给客户做镜像迁移,百分之八十的情况都是用它搞定,尤其适合一次转多个文件、或者要在脚本里自动批量处理的时候。
它跟 VMDK 的兼容性也足够好,转换出来的镜像可以直接被 VMware Workstation 加载。你别嫌它是个命令行工具,实际上核心操作就一条命令,比某些图形工具还省事。
3.2 转换命令详解(VHD / VHDX / 动态与固定)
Windows 上装 qemu-img 有两条路:一条是直接下载 QEMU for Windows 的安装包,装完以后 qemu-img.exe 就在安装目录里;另一条是用包管理器,比如 winget install QEMU,或者 choco install qemu。Linux 下更简单,sudo apt install qemu-utils,macOS 就用 brew install qemu。
然后进到 qemu-img.exe 所在目录,执行转换:
qemu-img convert -p -f vpc -O vmdk source.vhd target.vmdk几个参数的含义说一下。-f vpc 是声明源文件格式。VHD 在 QEMU 的格式命名里就叫 vpc,不管你的源文件是动态扩展还是固定大小,都用 vpc 作为源格式。如果是 Hyper-V 生成的新版 .vhdx 文件,源格式要改成 -f vhdx。-O vmdk 是目标格式。-p 是显示进度条,转换大磁盘的时候一定要加,不然你会以为程序卡死了。
这里有个细节值得展开:-f vpc 这个参数能不能省略?qemu-img 很多时候会自动探测文件格式,但对 vhd 的自动识别偶尔会出错,尤其是某些经过第三方工具修改过的非标准 VHD。所以最好显式加上 -f,宁可多打几个字符,也别让它在格式探测阶段翻车。
如果你想把转换结果输出为固定大小的 vmdk,可以加一个子格式参数:
qemu-img convert -p -f vpc -O vmdk -o subformat=monolithicFlat source.vhd target.vmdkmonolithicFlat 会生成一个描述文件和一个纯数据文件,对应 VMware 经典的 flat 格式,磁盘性能略好,但文件占用空间等于虚拟磁盘上限。默认的 monolithicSparse 是动态分配的,用多少占多少,日常使用更省空间,我建议默认场景就不加这个参数。
3.3 转换后的 vmdk 如何装进 VMware
转换完成后,你会拿到一个 target.vmdk 文件。如果生成的是 monolithicFlat 模式,还会多一个 target-flat.vmdk 描述文件,这时候 VMware 添加磁盘时通常要选带 -flat 后缀的文件?实际操作中,选不带后缀的描述文件即可,VMware 会自动关联。如果是默认的 monolithicSparse 单文件模式,直接选 target.vmdk 就行。
接下来在你需要的虚拟机里,关机状态下打开“虚拟机设置”,点击“硬盘 - 添加 - 使用现有虚拟磁盘”,浏览到 target.vmdk。如果你是要新建一个虚拟机来跑这个系统,就在创建向导里选择“使用现有虚拟磁盘”,指向转换好的 vmdk,虚拟机硬件配置按原系统情况选好就行。
3.4 MBR/GPT 与固件类型:最容易忽略的坑
这里必须先说一个最容易出问题的地方:转换只改变虚拟磁盘的容器格式,磁盘内部的分区表、引导扇区、文件系统都是原封不动的。如果原 vhd 是 GPT 分区、UEFI 引导,转换后的 vmdk 也必须用 UEFI 固件去启动;如果原 vhd 是 MBR 分区、BIOS 引导,虚拟机固件就要选传统 BIOS,或者 UEFI 带 CSM 兼容模式。这个对不上,最常见的表现就是虚拟机启动时黑屏、停留在引导菜单,或者直接提示找不到操作系统。
所以动转换前,先在磁盘管理里看一眼原 vhd 的分区类型。UEFI+GPT 的盘在磁盘管理中会显示“EFI 系统分区”和“Microsoft 保留分区”这样的结构。转换完后,在 VMware 的“虚拟机设置 - 高级 - 固件类型”里选对应的 UEFI 或 BIOS,再开机。这个步骤看似不起眼,实际上决定了你能不能看到 Windows 的登录界面。
4. 方案三:StarWind V2V Converter,图形化零门槛转换
4.1 为什么推荐给新手
如果你看到命令行就头疼,或者你只是想转换单个磁盘文件、不想折腾包管理器,那 StarWind V2V Converter 是一个非常好的图形化替代。它是免费的桌面工具,界面简洁,专门做虚拟磁盘格式互转,支持 VHD、VHDX、VMDK、QCOW2 等格式,还能把镜像直接推送到 vSphere 上。它的转换逻辑是逐块复制数据,对 VHD 的处理比某些半吊子工具可靠得多。
我用它帮朋友转过几个从 Hyper-V 导出来的 VHDX 系统盘,过程很稳,没有遇到过半路失败或者输出文件损坏的问题。唯一不方便的是,它默认只支持在 Windows 上运行,如果你手里的镜像在 Linux 服务器上,那就还是回到 qemu-img 吧。
4.2 完整转换步骤
第一步,从 StarWind 官网下载 V2V Converter。它会让你填一个邮箱拿下载链接,填完就能下,不用付费。安装过程比较常规,没什么要特别注意的。
第二步,打开软件,选择源镜像。界面第一步是选择“Local file”还是“Remote host”,我们选 Local file,然后浏览到你的 .vhd / .vhdx 文件。
第三步,选择目标镜像格式。这里会有 VMDK、VHD、VHDX、QCOW2 几个选项,选“VMware virtual machine disk (VMDK)”。
第四步,关键一步,选择目标平台。它会让你选 VMware Workstation、VMware ESXi、Microsoft Hyper-V 这些。如果镜像将来是在 Workstation 里用,选“VMware Workstation”即可。这个选择会影响 VMDK 内部 descriptor 的一些参数,选错了也能用,但保险起见按实际环境选。
第五步,选择输出目录,以及是否把 VMDK 拆分为 2GB 大小的分片。默认不拆分就行,Workstation 本身支持大文件。
第六步,确认配置,开始转换。转换过程中能看到进度条,时间长短取决于磁盘大小和实际数据量。转换完成后,去输出目录找生成的 .vmdk 文件,大小通常比源 VHD 稍小一点,因为 vmdk 的动态分配机制剔掉了一些冗余元数据。
4.3 转换完成后先别急着删原文件
每次转换完我都会特别叮嘱一句:先留着原 .vhd,别急着删。原因有两个。一是转换后的 vmdk 需要实际加载测试一下,确认能正常启动、数据完整,再删源文件。有时候 VHD 内部某些数据块有微小损坏,转换工具会跳过或补齐,导致转换后文件看起来正常但某些目录打不开。这时候还有个原始文件在,还能回头用 diskgenius 之类的工具先修复原盘。二是动态 VHD 的转换过程中,如果源文件正在被其他程序占用(比如你在 Hyper-V 里还挂着这块盘),转换得到的 vmdk 可能缺失部分数据。留一手总比事后拍大腿强。
5. 转换后启动排错与近期 Workstation 常见问题速查
5.1 系统盘转换后蓝屏、无法引导的修复思路
转换完系统盘 vmdk 之后,最常见的两个失败场景:一是 Windows 启动到一半蓝屏,报 INACCESSIBLE_BOOT_DEVICE;二是直接黑屏,连 Windows 徽标都看不到。
先说蓝屏。这个基本上是存储控制器驱动不匹配导致的。VMware Workstation 默认给虚拟机挂的是 LSI Logic SCSI 控制器,Windows 10、Windows Server 2016 及以上的系统自带这个驱动,通常问题不大。但 Windows 7、Windows Server 2008 R2 这些老系统就很容易翻车,因为它们没带 LSI 驱动。解决办法是在“虚拟机设置 - 硬盘 - 高级 - 虚拟设备节点”里,把默认的 SCSI 改成 IDE 0:0。IDE 控制器是所有 Windows 版本都内置驱动的,踢一脚进去总归能过。启动成功以后再装 VMware Tools,装完才能把磁盘改回 SCSI 或者直接用 NVMe 获得更好性能。
再说黑屏。如果 BIOS/UEFI 固件设对了、磁盘也能识别,但还是黑屏,那大概率是引导损坏。Windows 8 以上的系统,把 Windows 安装 ISO 挂载到虚拟机光驱,从光驱启动,进入“修复计算机 - 疑难解答 - 命令提示符”,然后用 bcdboot 重建引导:
diskpart list disk list vol找到 Windows 所在分区(一般是 C 盘)和 EFI 分区,假设 C 盘是系统盘,EFI 分区盘符是 S:,执行:
bcdboot C:\Windows /s S: /f UEFI如果是 BIOS+MBR 布局,进完命令提示符后直接执行 bootrec /fixmbr 和 bootrec /rebuildbcd。这一套下来,绝大多数转换后的系统都能救活。
5.2 近期 Workstation 用户高频问题速查表
这段时间大家在 VMware Workstation 上踩的坑,远远不止 VHD 转换这一件事。我把近期社区里问得最多的几个问题整理成一个速查表,有些是我自己遇到的,有些是帮人排查时记录的。
| 问题现象 | 原因与解法 |
|---|---|
| 新建虚拟机时选 .vhd 提示“指定的文件不是虚拟磁盘,无法启动” | Workstation 原生不识别 VHD,按第二章或第三章方案处理 |
| 打开虚拟机提示“替换缺少的文件时出错” | 通常是 vmx 里引用的 vmdk 路径移动了,或快照文件丢失。把 vmdk 路径改回正确位置,或新建虚拟机重新挂载 vmdk |
| 启动时出现不可恢复错误 (vcpu-1) exception 0xc0000005 | 常见于启用了 Windows 内存完整性(VBS)或 Hyper-V 的环境,关掉 VBS 或 Hyper-V 功能;也可以尝试升级 Workstation、降低虚拟机内存分配 |
| 新版 Workstation Pro 26H1 没有简体中文 | 官方安装包默认不附带中文,可以从旧版 Workstation 安装目录里复制 Languages 文件夹到新版对应位置,或者单独下载语言文件放入安装目录 |
| VMware Tools 提示不再随旧版客户机操作系统提供 | 新版本 Workstation 不再为 Win2000/XP 等旧系统捆绑 Tools,需要从旧版安装介质提取 tools-light 包,或是直接忽略 Tools,系统基本功能不受影响 |
| VMware Workstation Pro 现在收费吗 | 个人使用已经免费,官方直接下载即可,许可是个人用途许可,商用依然是另外的规则 |
5.3 小贴士:新虚拟机最好这样配
这里分享一个我的习惯:每次新建虚拟机跑从 VHD 转过来的系统盘时,先不要追求高配置,内存给 2~4GB,磁盘控制器先用 IDE,固件按原分区类型设置,一切稳定后再关机升级配置。很多人一上来就给它塞 8 核 CPU、16GB 内存、NVMe 磁盘,结果蓝屏了都不知道是驱动问题还是配置问题。先把系统拉起来,后面再谈性能。
另外,启动之前把虚拟机的“侧通道缓解”关掉也可以减少一部分莫名其妙的崩溃,这个选项在“虚拟机设置 - 选项 - 高级”里。虽然平时不太需要动它,但如果遇到频繁 access violation 这类崩溃,可以试试。
说到底,VMware Workstation 和 .vhd 之间没有那么复杂,无非是知道了格式不兼容这个事实,然后选一条对自己来说最省事的路。我个人的习惯是:数据盘一律用客户机内挂载,直接复制文件,连转换都省了;系统盘一律用 qemu-img 转换,一条命令加上固件设置注意一下,基本没有返过工。如果你手里有多个 vhd 要处理,完全可以写一个 for 循环批量跑转换,再配合自动生成 vmx 配置,那效率会更高。等你有一次成功地把一个跑了多年的 Hyper-V 系统盘搬进 Workstation 并且没有蓝屏的时候,回头看这次治理,其实就是一个格式认知问题加几条命令的事。