故障现象:某次重启esxi主机后,一台vm挂载的3个虚拟磁盘vmdk文件全部丢失,无法开机启动,提示XX000001.vmdk磁盘文件无效等信息,该机有做过快照,需要重建磁盘头vmdk文件和快照的磁盘头文件。

1、首先查看虚拟磁盘文件位置并做好记录

右键出故障的虚拟机,点编辑设置,记录下每块磁盘所对应的目录位置如下:

磁盘1:[local-disk0] recovery/oa/15g-000001.vmdk //虚拟机系统C盘

磁盘2:[local-disk0] recovery/oa/NEW15G-000001.vmdk //虚拟机系统D盘

磁盘3: [local-disk0] recovery/oa/40g-000001.vmdk //虚拟机系统E盘


2、vmdk文件丢失后,通过SSH进入虚拟机目录,发现所剩文件如下:

225931377.jpg

上述文件具体信息如下:

(15g-000001-delta.vmdk :15g-flat.vmdk虚拟磁盘的快照文件)

(15g-flat.vmdk :15g这块磁盘的主体文件)

(40g-000001-delta.vmdk :40g-flat.vmdk虚拟磁盘的快照文件)

(40g-flat.vmdk :40g这块磁盘的主体文件)

(NEW15G-000001-delta.vmdk :NEW15G-flat.vmdk虚拟磁盘的快照文件)

(NEW15G-flat.vmdk :NEW15G这块磁盘的主体文件)

所幸还好所有的数据文件主体还在,现在缺少的是每个flat.vmdk文件的描述文件和每个xx000001-delta.vmdk文件的描述文件。


3、首先重建*-flat.vmdk文件的描述文件

*-flat.vmdk文件的描述文件命名方式是*-flat.vmdk名去掉flat,例如:15g-flat.vmdk的描述文件为 15g.vmdk。

重建flat.vmdk描述文件的方法请参考:http://hujizhou.blog.51cto.com/514907/1138850


4、创建完15g.vmdk文件后,复制一份该文件,并命名为15g-000001.vmdk,在当前虚机目录下使用命令

cp 15g.vmdk 15g.vmdk 15g-000001.vmdk


5、编辑15g-000001.vmdk文件,具体编辑方法不列出,我将两个vmdk文件的对比列出来:

重建包含快照的vmdk描述文件。_第1张图片


在修改两种vmdk文件时,如果发现有isNativeSnapshot="no"语句,请务必删掉。


6、其它几个文件的修改方法如上,不一一赘述,所有描述文件恢复出来后,应该如下所示:

# ls -l

-rw------- 1 root root 520130560 Oct 28 15:24 15g-000001-delta.vmdk

-rw------- 1 root root 627 Oct 28 14:52 15g-000001.vmdk

-rw------- 1 root root 17179869184 Aug 20 09:45 15g-flat.vmdk

-rw------- 1 root root 490 Oct 28 14:24 15g.vmdk

-rw------- 1 root root 2415935488 Oct 28 15:24 40g-000001-delta.vmdk

-rw------- 1 root root 600 Oct 28 14:59 40g-000001.vmdk

-rw------- 1 root root 5637144576 Aug 20 09:45 40g-flat.vmdk

-rw------- 1 root root 468 Oct 28 14:55 40g.vmdk

-rw------- 1 root root 33591296 Oct 28 15:24 NEW15G-000001-delta.vmdk

-rw------- 1 root root 636 Oct 28 14:52 NEW15G-000001.vmdk

-rw------- 1 root root 17179869184 Aug 20 09:45 NEW15G-flat.vmdk

-rw------- 1 root root 472 Oct 28 14:46 NEW15G.vmdk

/vmfs/volumes/51320390-e229cd10-c92d-d43d7e0ecfc6/recovery/oa #


7、重新编辑虚机,添加已存在的虚拟磁盘,把上述*-000001.vmdk文件挂载上,重新开机,虚机正常启动。


注意:在重建vmdk描述文件时,一定是用flat.vmdk文件来创建,而不是用*-000001.vmdk文件来创建