物理硬盘损坏导致VMDK只读时,必须先停用故障盘、只读提取完好的-flat.vmdk文件,再通过vmkfstools或vmware-vdiskmanager重建可写描述符文件,并修正.vmx配置后重新注册虚拟机启动。

物理硬盘损坏导致虚拟机VMDK文件被ESXi或Workstation识别为只读,无法开机、编辑、快照或写入任何数据,此时必须先隔离底层存储风险,再重建可写磁盘链路——不能直接在故障盘上尝试修复或覆盖操作。
第一步:确认物理硬盘真实状态并立即停用
登录ESXi主机SSH或Windows宿主机命令行,执行esxcli storage core device list(ESXi)或diskpart → list disk(Workstation宿主机),查看对应物理磁盘的Is SSD、Health Status、State字段;若出现offline、failed、SMART warning或IO errors,【必须立刻从vSphere/Workstation中移除该存储路径,断开所有虚拟机对该LUN或物理盘的访问】。继续挂载会加速坏道蔓延,导致flat.vmdk数据块不可逆损毁。
若物理盘已发出咔嗒声、通电无响应、BIOS/UEFI中不识别型号,停止一切软件层操作,直接送修——本教程仅适用于物理盘仍能被系统识别但报告I/O错误的逻辑性降级场景。
第二步:提取完好的-flat.vmdk数据文件
将故障物理硬盘安全接入一台健康Linux机器(推荐Ubuntu 22.04 Live USB),使用fdisk -l定位其分区,确认包含VMDK文件的分区(通常为ext4/xfs格式)后,执行只读挂载:
sudo mkdir /mnt/bad_disk && sudo mount -o ro,noload /dev/sdX1 /mnt/bad_disk
注意:【-o ro,noload参数强制只读且跳过日志重放,避免因文件系统损坏触发写操作】。进入虚拟机目录,确认CentOS-flat.vmdk(或类似命名)文件存在且大小与原始配置一致(如20GB),用sha256sum校验其完整性(如有备份哈希值)。若ls -la显示该文件权限为-r--r--r--且可正常dd if=xxx-flat.vmdk of=/safe/location/backup-flat.vmdk bs=1M拷贝成功,则flat数据完好。
拷贝完成后立即卸载:sudo umount /mnt/bad_disk。
第三步:重建可写的VMDK描述符文件
方法一:用vmkfstools快速生成新描述符(ESXi环境)
在ESXi SSH中切换到目标虚拟机目录,执行:
vmkfstools -c 20G -d thin new_disk.vmdk
这会生成一个20GB精简置备的新VMDK及其-flat.vmdk;接着用文本编辑器打开刚生成的new_disk.vmdk,删除全部内容,粘贴以下模板(按实际参数修改):
# Disk DescriptorFile<br>version=1<br>encoding="UTF-8"<br>cid=12345678<br>parentCID=ffffffff<br>isNativeSnapshot="no"<br>createType="thin"<br>adapterType="lsilogic"<br><br># Extent description<br>RDWR 41943040 SPARSE "CentOS-flat.vmdk"
其中41943040是扇区数(=20GB × 1024×1024×1024 ÷ 512),"CentOS-flat.vmdk"替换为你的实际flat文件名;保存后,运行vmkfstools -e new_disk.vmdk验证语法正确性。
方法二:用vmware-vdiskmanager重建(Workstation环境)
在Windows宿主机安装VMware Workstation,打开CMD(管理员),cd到VMDK所在目录,执行:
vmware-vdiskmanager -r "old.vmdk" -t 0 "repaired.vmdk"
该命令会忽略原描述符,直接基于flat数据重建标准厚置备描述符;完成后删除原损坏vmdk,将repaired.vmdk重命名为原名。
第四步:修正虚拟机配置并测试启动
步骤一:关闭虚拟机电源,编辑其.vmx文件,找到scsi0:0.fileName = "xxx.vmdk"行,确保指向你刚重建的VMDK文件名;
步骤二:检查scsi0:0.deviceType = "disk"和scsi0:0.present = "TRUE"是否启用;
步骤三:在vSphere客户端或Workstation中右键虚拟机→“清单”→“重新注册此虚拟机”,强制刷新元数据;
步骤四:启动虚拟机,观察是否跳过只读提示,进入GRUB或BIOS界面;若卡在“Loading initial ramdisk…”阶段,说明文件系统仍有损坏,需挂载修复:
fsck.ext4 -y /dev/sda1(CentOS/RHEL)或xfs_repair -L /dev/sda1(XFS格式,-L强制清除日志)。

















