那天下午,我正在喝咖啡,突然接到同事电话:"老张,我不小心把生产环境的Windows 10虚拟机删除了!"听到这话,我差点把咖啡喷出来。但作为一名有十年经验的VMware管理员,我知道慌乱解决不了问题。虚拟机误删虽然可怕,但只要存储卷还在,数据就有救。
这里的关键在于理解VMFS数据存储的工作原理。VMFS是VMware专门为虚拟化环境设计的集群文件系统,它有个重要特性:当虚拟机被删除时,实际数据并不会立即从底层存储设备上擦除。就像Windows里删除文件只是去掉文件索引一样,vCenter删除虚拟机也只是移除了对VMFS数据存储中文件的引用。
在本次案例中,虚拟机有两块磁盘:
设备ID是这个恢复过程中的GPS坐标。每个存储卷都有唯一的设备ID(如6000d31004c0e2000000000000000003),就像身份证号码一样不会重复。通过这个ID,我们可以在Dell存储阵列中精确定位到原始卷的位置。
首先登录vCenter,查看剩余的数据存储清单。虽然虚拟机被删除了,但存储集群配置还在。在我的案例中,发现四个关键数据存储:
| 存储卷名称 | 设备ID | 对应盘符 |
|---|---|---|
| Dell-SAN-DISK-1 | 6000d31004c0e200000000000000000a | D盘 |
| Dell-SAN-LAN-1 | 6000d31004c0e2000000000000000003 | 可能C盘 |
| Dell-SAN-LAN-2 | 6000d31004c0e2000000000000000004 | 可能C盘 |
| Dell-SAN-LAN-3 | 6000d31004c0e2000000000000000005 | 可能C盘 |
接下来登录Dell存储管理界面进行交叉验证。在"卷管理"页面,每个物理卷的详细信息里都标注了设备ID。我创建了一个对照表:
text复制Dell存储显示名称 设备ID 对应vCenter存储卷
New Volume 7 6000d31004c0e200000000000000000a Dell-SAN-DISK-1
New Volume 1 6000d31004c0e2000000000000000003 Dell-SAN-LAN-1
New Volume 2 6000d31004c0e2000000000000000004 Dell-SAN-LAN-2
New Volume 3 6000d31004c0e2000000000000000005 Dell-SAN-LAN-3
这个映射关系是后续恢复的基础。建议在正常运维时就记录这些对应关系,紧急情况下能节省大量时间。
找到原始卷只是第一步,接下来要用存储快照功能回到删除前的状态。Dell存储的快照不是VMware的快照,而是存储阵列级别的块级快照,恢复粒度更细。
操作步骤:
这里有个关键细节:不要直接恢复原卷!而是通过快照创建新卷,这样既保留了原始数据,又能避免影响其他可能还在使用该存储的虚拟机。
创建的新卷会自动生成新设备ID,例如:
注意:不同存储厂商的快照操作略有差异,但核心逻辑相同。华为存储叫"Clone",NetApp称为"FlexClone",实质都是创建快照的时间点副本。
新创建的卷就像刚买来的移动硬盘,需要先连接到电脑才能使用。在存储管理界面:
映射完成后,在ESXi的存储设备列表中应该能看到新设备。可以用SSH登录ESXi执行以下命令验证:
bash复制esxcli storage core device list | grep -iE 'Display Name|Device ID'
输出示例:
text复制 Display Name: Dell iSCSI Disk (6000d31004c0e2000000000000000017)
Device ID: eui.6000d31004c0e2000000000000000017
如果看不到新设备,可能需要重新扫描存储适配器:
bash复制esxcli storage core adapter rescan --all
现在来到最激动人心的环节——在vCenter中重新挂载包含虚拟机文件的数据存储。具体步骤:
挂载成功后,你会在数据存储中看到类似这样的结构:
code复制/snap-793bca84-Dell-SAN-LAN-2/
└── DT-Dev-ZHONGHAO/
├── DT-Dev-ZHONGHAO.vmx
├── DT-Dev-ZHONGHAO.nvram
├── DT-Dev-ZHONGHAO.vmdk # 这是磁盘描述文件
└── DT-Dev-ZHONGHAO-flat.vmdk # 这是实际磁盘数据
虽然找到了虚拟机文件,但直接注册原有虚拟机可能有问题。更稳妥的做法是:
在我的案例中,挂载后看到:
此时可以通过文件管理器直接复制需要的数据,或者使用robocopy等工具进行批量迁移:
powershell复制robocopy E:\重要数据\ D:\备份\ /MIR /R:3 /W:10 /LOG:恢复日志.txt
第一次做这种恢复时,我犯过几个典型错误:
坑1:选错快照时间点
有次选择了虚拟机删除后创建的快照,结果恢复出来的数据已经是删除后的状态。现在我会:
坑2:VMFS签名冲突
直接挂载时选了"保留现有签名",导致两个数据存储显示相同内容。正确的做法:
bash复制# 如果已经错误挂载,先卸载数据存储
esxcli storage filesystem unmount -l 数据存储名称
# 然后用新签名重新挂载
坑3:存储队列深度不足
大规模恢复时遇到IO性能问题,调整了ESXi的存储参数:
bash复制esxcli system module parameters set -m nvme -p "max_queue_depth=2048"
esxcli system module parameters set -m lpfc -p "lpfc0_lun_queue_depth=64"
与其事后恢复,不如提前预防:
对于关键业务虚拟机,我会额外配置:
整个恢复过程最耗时的其实是寻找正确的快照时间点。有次为了找一个精确到分钟的数据库状态,我恢复了6个不同时间点的快照才找到完整数据。所以现在我对重要虚拟机会每小时做一次存储快照,虽然多占点空间,但关键时刻真的能救命。