VMDK恢复实战:从已卸载受损到崩溃虚拟机,内核级数据救援指南
2026/9/8 2:46:15 网站建设 项目流程

凌晨一点半,告警声把值班手机震得嗡嗡响。这种场景做了快十年虚拟化运维的人应该都不陌生:宿主机还亮着绿灯,vCenter 里的虚拟机却变成了灰色“无效”,点开事件一看,磁盘 I/O 错误不断,再切到存储端,某个数据库虚机的 VMDK 已经从“已连接”变成了“不可访问”。最让人头皮发麻的是接下来这一步——你想手动把 VMDK 卸载再重新挂载,结果发现文件系统直接拒绝识别,甚至 VMX 配置里已经找不到这块磁盘的引用。

这就是今天要聊的 VMDK 恢复问题。标题里的 Kernel VMDK Recovery 并不是空泛的术语堆砌,而是我这几年做虚拟化数据救援时沉淀下来的一套“内核级”恢复思路。很多人一听到 Kernel 就往 Linux 内核上想,但在这个场景里,它指的是直接绕开虚拟化软件层的报错逻辑,从 VMDK 底层描述结构和扇区布局入手,把已经卸载的受损 VMDK、崩溃虚拟机里那些看似救不回来的数据一趟趟捞出来。这篇文章我会把原理、工具、实操步骤和踩坑记录全部写透,适合虚拟化管理员、运维工程师,以及所有靠 VMware 生态吃饭的同行收藏。

1. 为什么VMDK会“凭空消失”:先把灾难现场看明白

1.1 从.vmdk文件到虚拟磁盘:一个容易被忽视的文件结构

在动手恢复之前,必须先搞清楚 VMDK 的真实存储结构。很多同行把它当成一个“大文件”,其实 VMDK 是带元数据描述符的容器格式,只是大多数时候被 ESXi 和 Workstation 封裝成了单一文件。真正能直接被虚拟化平台识别的,是一个文本格式的描述符文件,里面记录了磁盘的几何参数(柱面、磁头、扇区数)、每个 extent 指向的下层数据文件、磁盘类型(monolithicSparse、monolithicFlat、twoGbMaxExtentSparse 等)以及等于多少字节的容量。

我见过太多新手栽在这个细节上。有一次同事把 Linux 虚拟机整个目录从数据存储拷贝到本地,然后用 Workstation 打开 VMX,系统提示“找不到磁盘”。他急得直冒汗,跑来找我看,我只做了三件事:先看 VMDK 文件头部是不是描述符,再看 extent 指向的-flat 文件是否在同一个目录,最后检查描述符里的 CID 与父盘 CID 是否匹配。结果发现他拷贝的时候漏掉了那个几 GB 的 flat 数据文件,只拷了一个几十 KB 的描述符。所以记住:单文件 VMDK 里既有描述符又有数据,而 split 或 flat 型的 VMDK 必须保证多个文件齐全,否则虚拟机再新也会变成不识别。

从恢复的角度看,这个结构给了我们两个入口。第一入口是描述符层,如果描述符没坏,只是虚拟机配置引用丢失,那直接修复引用关系就能恢复。第二入口是数据层,如果描述符本身损坏、slice 头被覆盖,但底层数据扇区还在,就要靠扫描工具绕过元数据直接提取文件内容。这两个入口对应的操作手法完全不同,下面会分场景讲。

1.2 两种典型故障:已卸载受损VMDK与崩溃虚拟机中的数据丢失

把题目里的两句话拆开看,其实覆盖了虚拟化故障的两个大类。

第一类是“已卸载受损 VMDK”。VMDK 受损到这个程度通常有几个原因:存储快照失败导致 VMDK 头部写坏;数据存储空间耗尽,虚拟机在写入过程中被强制 I/O 错误;或者管理员手动分离 VMDK 之后再挂载,系统识别不到原有的 UUID 和磁盘签名。这些损坏通常集中在 VMDK 描述符、分区表和文件系统超级块,而不是整个文件被清零。所以恢复的重点是重建元数据,而不是做整盘扇区级扫描,后者太慢且没必要。

第二类是“崩溃虚拟机中的数据”。虚拟机崩溃的原因千奇百怪,可能是 vCPU 卡死、内存热添加失败、主机宕机后文件系统未做日志回放,也有可能是虚拟磁盘本身坏道触发蓝屏。一旦虚拟机无法启动,你担心的往往不是虚拟机的“复活”,而是里面那个数据库或者应用配置目录。此时数据恢复的优先级高于系统引导,你必须先把磁盘当“数据源”而不是“可引导设备”来对待。我一般会先把 VMDK 做成只读镜像,再在副本上尝试恢复出分区和文件,这样既能保住原始证据,也能反复试错。

2. 恢复前必须做的三件事:别让二次写入毁掉最后机会

2.1 立即停止写入:镜像优先原则

先讲最重要的一条纪律:从发现 VMDK 异常的那一刻起,立刻停止对原存储和原目录的一切写入操作。这个原则看起来是常识,但实际执行中特别容易被忽略。比如有的管理员习惯先重启虚拟机,或者先在 vCenter 里重新注册虚拟机,再或者直接对原 VMDK 运行 fsck 修复命令,这些都是二次写入行为。

为什么二次写入是数据恢复的天敌?因为 VMDK 的损坏往往是局部性的,绝大多数场景下原始数据扇区还完好,只是引用数据的元数据信息被破坏。一旦你写入新数据,文件系统可能认为某些区域已经释放,就会把新数据覆盖到原有扇区上,数据变成永久性丢失。这种情况在文件分配表、inode 位图和 NTFS 的 $MFT 区域尤其致命。

正确做法是先做“镜像优先”。我通常会先把涉及目标虚拟机的整个数据存储目录,或者至少是目标 VMDK 文件所在的子目录,做一次底层扇区镜像。在 Linux 环境里可以用 dd 配合块设备名操作,如果 VMDK 本身是文件形式,就把它复制到一个独立的备份存储上。这里有个细节:复制时必须用字节级拷贝工具,不能通过创建快照的方式完成,因为快照只是增量记录,原文件依然被引用。我经常对团队讲,恢复之前的半小时“什么都不做”比“急着做点什么”重要得多。

2.2 判断VMDK文件是否还能被识别:monolithic vs split

在镜像完成之后,先别急着上恢复工具,花两分钟判断 VMDK 文件本身的结构状态。打开 VMX 文件或者用编辑器看 VMDK 头部,如果第一行是# Disk DescriptorFile,说明是描述符型 VMDK;如果直接看到的是二进制内容(开头有KDMV之类的魔数),那它可能是 monolithicSparse 或 monolithicFlat 的单一文件。

判断的目标是区分“引用断裂”和“结构损坏”。如果描述符文件还在但 extent 指向的数据文件找不到,那么重建引用即可;如果描述符头部被篡改或截断,需要用扫描工具重建;如果 monolithicSparse 文件的描述符部分损坏但数据 extent 完整,恢复工具可以直接定位到数据区起点,按扇区扫描。这个过程我建议记录下 VMDK 的原容量和虚拟磁盘类型,因为后面恢复工具会让你确认这些参数,填错可能导致扫描范围和分区定位完全偏掉。

2.3 准备恢复环境:避免在本机直接操作

我的习惯是准备一台独立的数据恢复工作站,操作系统用 Windows Server 或者 Windows 10 x64 都行,内存建议 16GB 以上,磁盘留出至少目标 VMDK 三倍的空间。这台机器只做一件事:接上 VMDK 镜像文件,运行恢复工具。

为什么不建议直接在原来那台有 vSphere/Workstation 的宿主机上做?三个原因:第一,宿主机上挂着虚拟化服务,I/O 负载和驱动冲突会影响恢复工具对磁盘的原生访问;第二,虚拟化平台本身可能仍在尝试锁定 VMDK 文件,导致恢复工具无法以独占方式打开;第三,万一恢复操作出错,等于又向原始环境注入一轮写入。所以哪怕麻烦一点,也要先把 VMDK 文件拷贝到独立机器上,用本地磁盘路径打开它。这一步做好,后面所有操作都从容很多。

3. 恢复工具的选型与能力边界:Kernel VMDK Recovery能做什么、不能做什么

3.1 为什么“内核级扫描”比普通文件恢复更靠谱

市面上能恢复 VMDK 数据的工具不少,但真正能在“已卸载受损 VMDK”和“崩溃虚拟机”两种场景下同时出活的,必须是具备内核级访问能力的工具。这里说的“内核级”不是玄学,它意味着工具可以直接读取 VMDK 的物理扇区、解析虚拟磁盘的描述符结构和分区表,而不是依赖操作系统对虚拟磁盘的文件系统挂载。普通文件恢复软件之所以救不回 VMDK,就是因为它们拿到的只是宿主机文件系统里的“一个文件”,根本不会去解析文件内部的分区结构。

Kernel VMDK Recovery 这一类工具的做法是:把 VMDK 当作一个完整的虚拟磁盘容器来解析,先重建分区布局,再在分区内部扫描文件系统结构。它能识别 FAT/NTFS/ext2/ext3/ext4/HFS+ 等多种文件系统,这样跨平台虚拟机的恢复也能覆盖到。另外,它的扫描过程是只读的,不会对原始 VMDK 做任何写操作,恢复输出时必须指定一个独立路径,这一点从架构上就杜绝了二次覆盖的风险。

3.2 关键扫描模式:快速扫描、深度扫描与原始恢复

用这种工具时,扫描模式的选择直接决定恢复质量和耗时。我先给个对照表,方便你按场景快速决策。

模式适用场景扫描速度能恢复什么注意事项
快速扫描VMDK 头部/分区表轻微损坏,描述符可读快,几分钟到十几分钟完整分区、普通文件、目录结构依赖分区表和文件系统超级块的完整性
深度扫描分区表丢失或被覆盖,文件系统元数据部分损坏慢,取决于磁盘容量,可能几小时大量文件碎片、已删除文件、未分配空间数据扫描前需指定文件系统类型,否则误报率高
RAW 恢复极端损坏、无文件系统痕迹看磁盘大小,最慢按文件特征(文件头)找回照片、文档、压缩包文件会丢失文件名和目录结构,需要手工整理

我自己的经验是,绝大多数 VMDK 恢复场景先用快速扫描,因为生产环境的 VMDK 一般只是元数据个别扇区受损,分区表和超级块通常完好。如果快速扫描出来你能看到分区和文件结构,直接预览验证就完事了。只有快速扫描结果为空或者分区列表都是乱码时才升级到深度扫描。不建议一上来就深度扫,很多工具在深度扫描时如果文件系统类型判断错误,扫出来的东西全是噪声,反而干扰判断。

3.3 恢复前预览:在落地前先确认文件可读

恢复工具和备份软件最大的区别在于:备份软件追求“全量恢复”,恢复工具追求“精准找回”。所以这一步特别关键——扫描完成之后,务必做好预览验证再执行恢复。预览的画面一般会展示出分区树、文件夹树和文件列表,你可以点开一个典型的 Word 文档、Excel 表格或者数据库备份文件,看看工具能否正常解析文件内容并生成可预览的文本。

预览验证看起来是额外花了时间,实际上能救你大命。我有一次恢复一个 2TB 的 VMDK,扫描显示分区正常、文件都列出来了,但预览某个核心数据库的 .bak 文件时,工具只能显示一堆乱码。后来才发现,这个文件的 extents 被跨到另一个已损坏的 extent 上,预览能列名但内容没法完整拼接。如果没有预览这一步,直接恢复出来的会是几千个残损文件,到时候拿着文件回去交差,才发现根本不能用,风险就大了。宁可多花十几分钟预览验证,也不要赌“列表能显示就等于内容完整”。

4. 从容恢复已卸载受损VMDK的完整实操流程

4.1 第一步:从注册表/存储层找回被卸载的VMDK

现在正式进入操作环节。恢复“已卸载受损 VMDK”,第一步不是打开恢复工具,而是要想办法把虚拟机配置和磁盘之间的引用关系找回来。已卸载可能有两种情况:一种是在 VMware 里执行了 Remove from Inventory,但文件还在数据存储中;另一种是虚拟机配置里磁盘被整体 Detach,但 VMDK 还在原来的目录下。这两种情况下,数据其实都还在,只是虚拟化平台不再主动引用它们。

对于这种情况,我建议先在 vSphere Client 或 Workstation 的文件浏览器里定位到虚拟机目录,确认 .vmx、.vmdk 和 -flat.vmdk(或 -s001.vmdk 等分卷文件)是否都还在。若 VMX 还在,可以用文本编辑器先打开看里面的磁盘引用路径是否指向一个存在的文件。若 VMDK 文件本身还在,但虚拟机无法识别,先用 vmware-vdiskmanager 或 vmkfstools 的检查命令,看 VMDK 的链结构是否完整。这一步的目的是判断损坏层级,而不是直接做恢复。只要文件还在,后面就有八成把握能救回来。

4.2 第二步:用恢复工具重建虚拟磁盘索引

如果描述符损坏,或者工具无法把 VMDK 当作有效虚拟磁盘打开,就要执行“重建虚拟磁盘索引”了。以 Kernel VMDK Recovery 这类工具为例,启动后选择“Open Virtual Disk”,然后定位到 VMDK 文件。工具会先尝试解析描述符,如果失败,会自动进入扫描模式。

这里有几个参数需要认真填。第一个是虚拟磁盘类型,如果你不知道原来的类型,先按 Monolithic Sparse 试,实在不行再换 Flat。第二个是容量,工具一般允许手动指定,如果容量填错,分区表解析就全乱了,所以最好从 VMX 配置或者 vSphere 属性里查到原始容量再填。第三个是文件系统类型,如果分区表能识别出来会自动带出,识别不出来就按你最需要的数据类型手动选一个。

扫描过程中不要中断。特别是深度扫描,有些工具中间会提示“发现分区,是否停止扫描”,我建议除非已经能在预防览面板看到完整文件列表,否则就让扫描器跑完,因为早期发现的只是第一个分区,后面的分区可能还需要更长的时间才能扫出来。扫描结束后,工具会列出一个或几个可恢复的分区。这一步出来的分区列表是不是你熟悉的 C 盘、D 盘结构,是判断恢复方向是否正确的关键信号。

4.3 第三步:导出分区与文件

分区列表出来后,你可以在对应分区上执行文件级恢复。选择目标文件或整个目录,指定恢复输出路径。这里再强调一次:输出路径不能放在原 VMDK 所在的数据存储或物理磁盘上,最好是一个独立的大容量存储。

导出过程中有几个细节。文件级恢复时,如果目录结构损坏严重,工具可能只恢复出“丢失文件”列表,文件名变成$FAT1$FILE_0001这样的临时标题。这时候不要慌,先按文件类型排序,优先导出数据库备份、压缩包和文档类型,因为这些文件的内容关联性强,哪怕文件名丢了也能用。导出完成后,用压缩包管理器做个完整性测试,比如打开压缩包看能否列出文件,这一步是验证恢复质量的重要环节。

4.4 第四步:将恢复结果挂载回虚拟化平台

文件导出之后,整个最艰难的部分已经过去了。但你要知道,直接交付一大堆文件给业务方,很多时候不如交付一个“能开机的虚拟机”更省心。所以第四步是把恢复出来的 VMDK 重新注册回虚拟化平台。

做法有两种。第一种是新建一台完全干净的空虚拟机,然后编辑虚拟机设置,添加现有磁盘,指向恢复出来的 VMDK 文件。如果 VMDK 仍然是原始结构(描述符能识别),这样可以直接启动并验证。第二种是把恢复出来的文件复制到新目录,手动创建一个新的 VMX 文件指向该 VMDK。第二种适合原来 VMX 已经损坏、不想折腾原配置的场景。

启动之后,如果进入系统发现磁盘分区都正常,直接做一次文件系统检查并打一个新快照。如果操作系统能引导但个别服务起不来,也不要轻易回滚,先以管理员身份打开事件查看器或系统日志,确认只是驱动层级问题还是文件系统级问题。经过这一步验证,你才可以安心地告诉业务方:数据恢复了,系统能用了。

5. 崩溃虚拟机中数据的恢复:从“打不开”到“拿得回来”

5.1 崩溃虚拟机的三种状态:生产级恢复策略

崩溃虚拟机不能一概而论,不同崩溃层级对应不同恢复策略。我习惯把崩溃状态分为三层。

第一层是“虚拟化平台层崩溃”,也就是 vSphere/Workstation 报告虚拟机无法启动,比如.lck文件残留、VMX 语法错误、快照链断裂。这类问题通常不涉及 VMDK 数据损坏,恢复策略以“修复配置”为主,先把 .lck 删除,检查快照描述符,恢复好链结构,虚拟机就能重新开机。

第二层是“虚拟磁盘层崩溃”,表现为 VMDK 无法被 ESXi 识别、虚拟磁盘无法挂载、SCSI 控制器报错。这一层就要用恢复工具打开 VMDK,重建分区和文件系统结构,把数据文件导出。

第三层是“Guest OS 层崩溃”,VMDK 文件本身没问题,虚拟机也能启动,但 Windows 蓝屏或者 Linux init 失败。这一层更多是系统文件缺失、引导配置损坏,恢复策略可以先把虚拟磁盘以“第二块盘”方式挂到另一台正常虚拟机上,把业务数据拷贝出来,再做系统修复。

每种状态的处理策略差异很大,拿到一台崩溃虚拟机时,先按这三层做一个预判,能省很多冤枉路。我见过有同行遇到 VMX 配置错误,却跑去做深度扫描,花费大半天扫完整块磁盘,结果发现根本不需要。

5.2 当系统无法引导时:优先抢救文件还是镜像?

这是所有崩溃虚拟机恢复里最核心的决策。如果 Linux 虚拟机引导到一半崩了,或者 Windows 一直重启修复,你面前有两条路:一条是花几个小时修引导,试着把系统拉起来,然后正常进系统备份数据;另一条是放弃引导修复,直接把虚拟磁盘挂到恢复环境里,优先导出 /var、/home、/opt 或 D 盘等数据目录。

我的建议非常明确:只要系统引导时间可能超过一两个小时,尤其是数据库或核心业务服务在系统里,直接选择第二条路。因为修引导的过程本身就是一次对文件系统的高强度读写,开机过程中 fsck、系统日志服务、挂载临时分区都可能改动物理扇区。对一个已经处于崩溃状态的虚拟磁盘来说,这无异于在犯罪现场走来走去。直接挂载恢复环境,以只读方式访问文件系统,把数据文件先导出,这样就算后面修引导失败,你手里也已经握住了最重要的数据副本。

5.3 从恢复出的虚拟磁盘重建可引导虚拟机

把崩溃虚拟机里的数据导出来只是保底,业务方往往还想要一台能用的虚拟机。如果恢复出来的虚拟磁盘结构完整,可以试着重建引导环境。

在 Linux 场景下,导出核心数据后,可以新做一台同版本 Linux 空白虚拟机,然后把恢复出来的磁盘作为第二块盘挂载,用 chroot 进入原系统分区,修复 fstab 和引导项,最后再调整磁盘顺序让它作为第一启动盘。Windows 场景则复杂一点,通常需要用到安装镜像的修复模式,执行 bootrec /rebuildbcd 或者 sfc /scannow。但这些操作都要建立在“VMDK 已经能被识别且分区表完整”的基础上。如果恢复工具拿出来的只是散文件,就别硬重建了,老老实实交付文件给业务部门,自己导入到新系统反而是更稳的方案。

6. 常见问题与排查技巧实录

6.1 问题速查表

把这几年遇到的高频问题整理成下表,可以直接贴在运维手册里。

现象可能原因处理思路
VMDK 在数据存储中但虚拟机无法识别描述符损坏或 VMX 引用路径错误检查 VMX 引用,重新注册虚拟机,或直接打开 VMDK 修复描述符
打开 VMDK 提示“无法识别的虚拟磁盘格式”描述符头部被截断或 flat 文件缺失用恢复工具按 Flat 类型打开,或补齐 -flat.vmdk
恢复工具扫描到分区但文件列表为空分区表损坏或文件系统超级块错误手动指定文件系统类型,升级为深度扫描
恢复出来的文件损坏打不开extent 跨损坏区域,文件碎片未拼完整对目标分区做 RAW 扫描,按文件特征找回
虚拟机提示找不到系统引导文件引导扇区损坏,但分区数据完好挂载为第二块盘导出数据,或重建引导记录
快照链断裂,子 VMDK 无法访问快照描述符缺失检查父盘 CID,必要时用 vmkfstools -e 整合,恢复工具也能打开子盘

6.2 我的几个独家避坑心得

我对 VMDK 恢复这件事体会最深的一点是:恢复工具不是“扫描一下就能全回来”的魔法,它的输出质量取决于你输入的参数和操作纪律。参数填错、环境不对、中途写入,再好的工具也白搭。

第二个心得是,绝对不要把恢复任务寄托在一次扫描上。恢复到一半发现输出目录空间不够,这是低级错误;更常见的是扫描结果不理想,就马上换另一款工具重新扫描。我的习惯是同一个 VMDK 镜像至少保留两份,用两款不同引擎的工具交叉验证,一款扫描结果不好,另一款可能因为文件系统识别逻辑不同而取得突破。

最后一点,恢复成功后记得给 VMDK 打快照或者做一次全量备份,最好把恢复工具生成的日志文件也存档。很多同行在数据恢复成功后太兴奋,忘记记录整个恢复过程,结果几个月后同样故障再发生,又得从零开始踩坑。日志里记录着扫描参数、文件系统类型、分区偏移量,这些数据在故障复现时非常有价值。

最后分享一个小技巧:在恢复完成、把 VMDK 挂回虚拟化平台之前,先用工具打开 VMDK 的描述符,检查一下文件系统所处的分区模式是 MBR 还是 GPT。这个信息决定了挂载后虚拟机的固件类型,BIOS 固件的虚拟机和 UEFI 固件的虚拟机对启动方式要求完全不同,如果我忘了先核对这个参数,大概率又得在开机引导上折腾一个小时。根据我的经验,把这个检查流程插在“导出文件”和“挂载验证”之间,能让整个恢复链条顺畅不少。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询