虚拟机flat文件损坏后,先停机做只读副本,再校验描述符、用qemu-img或vmware-vdiskmanager做转换修复,最后只读挂载提取数据;不要在原盘上反复开机或执行写修复。
flat文件通常指VMware虚拟磁盘里的-flat.vmdk数据文件,它和同名的.vmdk描述符是一对搭档,描述符像目录,flat文件像仓库,仓库门牌错了,数据还在;仓库被乱写,才需要更谨慎地抢救,下面按实际恢复顺序讲,尽量让你少走弯路。
先分清是flat数据坏了还是描述符坏了
描述符和flat文件是一对搭档
据VMware官方文档,monolithicFlat类型的虚拟磁盘由文本描述符和-flat.vmdk数据文件组成,描述符里最关键的是RW后面的扇区数、FLAT后面的文件名,以及快照链里的parentCID,这几个字段对不上,虚拟机就可能报“无法打开磁盘”。
.vmdk描述符:文本文件,记录容量、几何信息、父盘关系。-flat.vmdk:实际数据面,不能当普通文本改。- 快照链:子盘描述符会指向父盘,单独修子盘通常没有意义。
- 副本目录:所有相关
vmdk、-flat.vmdk、-delta.vmdk一起复制,别只拿一个。
| 现象 | 更可能的问题 | 首要动作 |
|---|---|---|
| 开机提示无法打开磁盘 | 描述符路径、CID或父盘缺失 | 先看描述符和快照链 |
| flat大小正常但转换报错 | 扇区数不匹配或flat有坏块 | 复制后重建描述符再转换 |
| 文件大小明显变小 | flat被截断 | 停止写入,用ddrescue做镜像 |
| 能挂载但客户机文件打不开 | 客户机文件系统损坏 | 只读挂载,先拷文件 |
VMware虚拟机flat文件损坏怎么恢复数据:按顺序做这五步
第一步:停机、隔离、做只读副本
先关虚拟机,别挂起,挂起状态会留下内存和快照依赖,把整个虚拟机目录复制到另一块健康磁盘,ESXi上常见路径是/vmfs/volumes/数据存储名/虚拟机名/,复制前用ls -l记录每个文件大小,尤其是-flat.vmdk。
ls -l cp -a /vmfs/volumes/ds1/vm01 /vmfs/volumes/ds2/vm01_copy chmod -R a-w /vmfs/volumes/ds2/vm01_copy
副本目录只读,后续所有命令都在副本里跑,原盘不要再开机,也不要在原datastore里做dd或转换。
第二步:校验描述符并修正扇区数
先看描述符:
cat disk.vmdk stat -c %s disk-flat.vmdk
描述符里会有一行类似:
RW 41943040 FLAT "disk-flat.vmdk" 0
这里的RW扇区数应和flat文件字节数对应。扇区数 = flat文件字节数 ÷ 512,如果描述符写的是旧容量,或者复制过程中文件名变了,qemu和VMware工具都可能打不开,改之前先备份描述符,只改副本,不改原盘。
如果描述符丢失,可以手写一个最小描述符指向flat副本:
# Disk DescriptorFile version=1 CID=fffffffe parentCID=ffffffff createType="monolithicFlat" # Extent description RW 41943040 FLAT "disk-flat.vmdk" 0 # The Disk Data Base #DDB ddb.virtualHWVersion = "4"
RW后面的数字按实际字节数除以512重算,如果flat文件本身被截断,只能按实际大小重建描述符,能读多少算多少。
第三步:用qemu-img和VMware工具做只读转换
能打开描述符时,先看信息,再转换:
qemu-img info disk.vmdk qemu-img check disk.vmdk qemu-img convert -p -O raw disk.vmdk disk.raw
qemu-img check对VMDK的支持有限,能跑就跑;不支持时直接做convert,转换过程会暴露坏块,VMware环境还可以试:
vmware-vdiskmanager -R disk.vmdk
ESXi里常用克隆方式:
vmkfstools -i disk.vmdk repaired.vmdk -d thin
如果qemu连描述符都打不开,就退一步:用ddrescue对-flat.vmdk做镜像,再手写描述符指向镜像文件,然后转换。
ddrescue -f -n disk-flat.vmdk flat_copy.bin flat_map.log qemu-img convert -f vmdk -O raw repair.vmdk disk.raw
转换成功,说明描述符和flat基本能对上,转换失败,也别急着修原盘,先保留日志和镜像。
第四步:只读挂载raw,先救文件再修文件系统
拿到disk.raw后,优先只读挂载,Linux下常用:
losetup -r -f --show disk.raw kpartx -av /dev/loop0 mount -o ro,noload /dev/mapper/loop0p1 /mnt
NTFS分区可用ntfs-3g -o ro,挂载成功就先拷出业务文件,别在挂载点里做写操作,挂载失败再用testdisk看分区表,用photorec按文件签名恢复。不要对原盘执行fsck;确实要修文件系统,也先在raw副本上做。
第五步:重建虚拟磁盘并回迁数据
数据拷出来后,重建一个干净虚拟磁盘:
qemu-img convert -O vmdk -o subformat=monolithicSparse disk.raw fixed.vmdk
也可以在VMware里新建虚拟机,挂载恢复出来的raw或新vmdk,回迁后核对文件数量、大小和关键目录,数据库类业务还要做一致性检查,别只看文件能不能打开。
ESXi虚拟机flat文件损坏修复步骤:别在datastore里直接试
ESXi环境里没有qemu,直接在生产datastore上试工具风险高,先开SSH,把虚拟机目录复制到另一个datastore,再在副本上操作,常用命令是vmkfstools -i,把源盘克隆成新盘:
vmkfstools -i /vmfs/volumes/ds1/vm01/disk.vmdk /vmfs/volumes/ds2/repair/disk.vmdk -d thin
如果虚拟机有快照,先cat子盘描述符,确认parentCID和parentFileNameHint,父盘缺失时,只修子盘通常拿不到完整数据,行业共识认为,快照链损坏要先补齐父盘和子盘,再做合并或转换,flat文件特别大时,可以复制到Linux工作站,用qemu做只读转换,再把结果传回ESXi。
虚拟机flat文件损坏修复要多少钱
这个问题没有统一价,收费通常看四点:介质类型、故障复杂度、是否需要重组RAID、工期,个人版VMware单个flat文件逻辑损坏,软件修复成本通常较低,常见落在几百到几千元区间,ESXi阵列、多级快照、误写覆盖、需要开盘的情况,费用会明显上升,报价前让对方先说明检测项:是否做只读镜像、是否保留原盘、是否按恢复结果计费,别只看“低价检测”,要看恢复后数据能不能验证。
上海虚拟机flat文件数据恢复现场常见的三个误区
第一个误区是反复重启,虚拟机报磁盘错误后,有人连续开机试,flat文件的坏块可能被进一步写入,第二个误区是在原datastore里直接跑修复命令,正确做法是先复制到另一块盘,副本只读,第三个误区是只拷-flat.vmdk,忽略描述符和父盘,上海不少企业把ESXi放在机房,现场处理时更要先断业务、再镜像,业内专家指出,逻辑损坏阶段优先做只读提取,比直接修文件系统更稳妥。
flat文件修复的核心不是“点一个修复按钮”,而是保住原盘、对齐描述符、在副本上转换和挂载,顺序对了,数据才有更大机会完整回来。
虚拟机flat文件损坏修复数据问答
flat文件损坏后还能直接开机吗?
不建议,开机可能触发写入、快照合并或日志回放,把可恢复状态变复杂,先关机,复制整个虚拟机目录,再在副本上检查描述符和flat大小,原盘保持只读,是后续恢复的基础。
没有备份的flat文件损坏怎么恢复数据?
先做只读镜像,再用ddrescue尽量读出flat文件;能读出完整扇区就重建描述符,用qemu-img convert转成raw;挂载失败再用testdisk和photorec提取文件,没有备份时,恢复目标要放在“尽量提取可用文件”,而不是保证原系统完整启动。
修复后数据完整性怎么验证?
先核对文件数量和目录结构,再抽查关键文件能否打开,数据库业务要做一致性检查,虚拟机里可跑自带校验工具,最后把恢复盘挂到测试虚拟机,确认启动和业务读取正常,再回迁生产,恢复结果以实际可读文件为准。