你试过把文件存进虚拟磁盘,然后整个盘都读不出来吗?
前两天一个客户慌慌张张找到我,说他用Hyper-V挂载了一个VHDX虚拟磁盘,往里面拷贝了一个重要的设计稿——在虚拟磁盘中存储一个文件之后,再卸载重新挂载时,系统提示“文件或目录损坏且无法读取”。这问题其实挺典型,但每次遇到还是得从头捋一遍,因为虚拟磁盘的故障原因差别太大了。可能是宿主机的突然断电导致VHDX元数据写坏,也可能是文件本身在写入过程中被截断,甚至可能是虚拟磁盘格式不对齐。 www.fixhdd.cn
我让他先别慌,把原始VHDX文件拷贝到一个外置硬盘上,避免反复挂载造成二次破坏——这是所有数据恢复的第一步,但很多人会忽略。然后我们用十六进制编辑器看了一眼文件头,发现JET(Exchange用的那种)和VHDX的签名都还在,但系统日志里报了不少“因为I/O错误导致无法读取”。这让我怀疑,问题可能出在虚拟磁盘的内部文件系统上,而不是整个虚拟磁盘的扇区损坏。 www.fixhdd.cn
先判断:虚拟磁盘“坏了”到底坏在哪?
当你在虚拟磁盘中存储一个文件后,如果突然发现打不开,通常有几类可能:
www.fixhdd.cn
- 虚拟磁盘文件本身物理损坏(比如存储介质的坏道、复制过程中中断)
- 虚拟磁盘格式的元数据逻辑错误(比如VHDX的差异链断裂、父盘丢失)
- 内部文件系统(NTFS/ext4等)的目录结构损坏(最常见,比如断电导致$MFT写了一半)
- 宿主机的驱动程序或挂载工具冲突(比如Windows更新后Hyper-V与第三方虚拟化软件抢驱)
上面的客户属于第三种。我让他别直接用diskpart去挂载,先尝试用“只读”方式挂载到一台干净的Windows Server上,结果还是报错。这说明文件系统的关键元数据已经受损,普通的chkdsk很可能把目录结构弄得更乱。这时候用chkdsk是禁忌——除非你确定要放弃恢复某些文件。
www.fixhdd.cn
经验案例:一次VHD恢复让我学会的第一课
很多年前我刚入行时,遇到一个公司财务的虚拟磁盘打不开,里面存了全年发票扫描件。那时候我直接用了技王数据恢复的一个早期版本去扫描虚拟磁盘文件,结果只恢复了部分文件,丢了几个关键文件夹。后来复盘发现,问题出在我直接扫描了整个VHD镜像,而没有先修复虚拟磁盘的差分链。从那以后我养成了习惯:在虚拟磁盘中存储一个文件之前,最好先确认父盘和子盘的sha256哈希一致,差分盘不要跨宿主机移动。 技王数据恢复

修复步骤:从挂载失败到文件重建
针对那个客户的情况,我走了以下流程——你可以参考,但切忌照搬,因为每块虚拟磁盘的“伤情”不一样: www.fixhdd.cn
第一步:创建全量镜像
用ddrescue或者WinHex把原VHDX文件复制一份到另一个无损硬盘上,避免原始文件进一步受损。复制过程中如果遇到坏块,标记跳过,但尽量保留好区。 www.fixhdd.cn
第二步:尝试虚拟磁盘修复工具
对于Windows下的VHD/VHDX,可以试试diskpart里的attach vdisk加上readonly参数,再用fsutil或者chkdsk /f但只分析不写。这里要小心:chkdsk /f在只读挂载下不会真的修复,但如果挂载成功就可以直接拷贝文件。 技王数据恢复
第三步:直接解析内部文件系统
如果虚拟磁盘无法挂载,就用数据恢复软件直接打开VHDX文件作为“物理驱动器”扫描。例如技王数据恢复的虚拟磁盘恢复模式,可以识别VHD/VHDX/VMDK甚至RAW格式,然后按扇区扫描NTFS或FAT32的文件记录。那个客户的VHDX就是通过这种方式找到了$MFT的镜像副本,进而恢复了整个目录树。关键是要在扫描前设定正确的簇大小和起始扇区偏移——有时候VHDX的元数据藏了好几个偏移,需要手动计算。
第四步:重组碎片文件
如果文件是连续的,恢复很简单;如果碎片严重,就需要通过文件系统的FRS(文件记录段)里的run list去拼接。这个过程比较依赖工具,但逻辑其实不复杂:每个文件的记录里都存着字节偏移和簇数,按顺序读取即可。但注意虚拟磁盘内部的碎片可能因为快照或动态扩展而变得非常复杂——我遇到过VHDX里一个100MB的PDF文件分成300多个碎片,用技王数据恢复的底层重组功能花了4小时才拼完。
关于“在虚拟磁盘中存储一个文件”最常见的一个误区
很多人以为只要虚拟磁盘文件没坏,里面的文件就永远安全。实际上恰恰相反——在虚拟磁盘中存储一个文件,文件本身是跨扇区分布在虚拟磁盘内部的,而虚拟磁盘的元数据(比如VHDX的block allocation table)和内部文件系统元数据(NTFS的$MFT)是两层独立的逻辑。任意一层出问题,文件就不可见。你有多种故障可能,不能只靠一种方法解决。
一次在数据恢复论坛上看到有人问:“我往虚拟磁盘里存了一个Word,然后宿主机重启,虚拟磁盘再也挂不上了,怎么办?”下面有回复说“用chkdsk修复”。结果那位老兄跑了chkdsk /f,Word文档变成了CHK文件,彻底乱了。这就是典型的误操作——应该先做镜像,再跑只读扫描。
结论:预防永远比恢复容易,但万一出事也别慌
记住这几条:
- 在虚拟磁盘中存储一个文件后,立刻做一次元数据校验(比如用
Integrity Check或挂载后运行sfc /scannow类似的内部检查)。 - 定期对虚拟磁盘做全量快照,并保管好父盘。差分盘越多,链越长,出问题的概率指数上升。
- 如果虚拟磁盘已经无法挂载,第一时间停止所有写入操作。不要尝试反复挂载或运行修复工具,除非你明确知道故障的类型。
- 数据恢复的第一原则:抢救原始介质,用镜像操作。
回到开头那个客户,我们最终恢复了所有120GB数据,包括他那个设计稿。过程虽然折腾,但让他深刻理解了在虚拟磁盘中存储一个文件并不像本地硬盘那样“直接”,虚拟化层的任何抖动都可能造成文件“假丢失”。而作为数据恢复工程师,我的工作就是帮他们揭掉这层假象,把文件从二进制废墟里拽出来——只要扇区还在,就还有希望。
下次你在虚拟磁盘中存重要文件前,不妨多想一步:万一这个虚拟磁盘坏了,我的备份在哪?如果没有,那就多留个心眼吧。