北京 井超
在筆者單位VMware 服務器虛擬化的測試環境vSphere webclient 上,管理員執行了重啟虛擬機后,系統提示虛擬機啟動不了,找不到vmdk 虛擬磁盤文件,無法打開vmdk 文件的報錯。
后續進行問題排查,選擇該出現問題的虛擬機后右鍵選擇“編輯設置”,發現硬盤1 的大小變為0Mb。
瀏覽這臺出現問題的虛擬機所在數據存儲,進入該虛擬機所在的文件夾,查看這臺虛擬服務器的摘要信息,對比datastore 上其他正常可用的虛擬機,發現出現問題的虛擬機上確實缺少一個vmdk 磁盤文件,但是可以看見一個50G 的xxxflat.vmdk 文件;而正常可用的服務器只有xxx.vmdk 文件,沒有flat.vmdk,關機之后兩個文件都存在,但是真實的磁盤容量從vmdk 轉移到了flat.vmdk。

圖1 虛擬機硬盤1 的大小變為0Mb
虛擬主機在運行的時候實際在使用的是xxx-flat.vmdk,然而xxx.vmdk 是可以同時被刪除的,才導致了該問題。
這里需要說明,虛擬機的每個磁盤驅動器都包含了一對.vmdk 文件。一個是文本文件,包含了關于虛擬硬盤的描述數據;另外一個是磁盤的實際內容。例如,一個名為examplevm 的虛擬機連接有一個硬盤。這個磁盤由如下兩個文件構成:一個小于1KB的examplevm.vmdk 描述文件和一個10GB 大小的examplevm-flat.vmdk 平面(數據)文件,該文件包含虛擬機的實際數據,而這些數據又是以二進制的形式存放在物理磁盤上,examplevm.vmdk 描述文件就是描述這種映射關系的。
(1)用ssh 登錄該出問題的ESXi 物理主機,找到xxx-flat.vmdk 這個文件所在的位置和目錄,記錄文件的大小。


注意,ESXi 宿主機默認沒有開啟ssh,需要通過vsphere client 登錄服務器,在“配置”選項卡中找到“安全配置文件”進入“服務”后選擇“屬性”,進行手動放開。
(2)重命名xxx-flat.vmdk 文件


(3)虛擬機目錄下使用vmkfstools 工具手工創建xxx.vmdk 和對應的flat.vmdk 文件,這個flat.vmdk文件的大小和之前重命名的文件一樣大。這樣做的目的是在生成flat.vmdk 文件的同時生成與其大小對應的vmdk 文件。


(4)最后將原來的(tmp_)xxx-flat.vmdk 覆蓋剛創建的同樣大小的xxxflat.vmdk,這樣該flat.vmdk 文件就可重新和剛生成對應的vmdk 文件匹配成功。

重命名操作很快完成,啟動虛擬機即可恢復。(改完名后新建虛擬機-flat.vmdk文件就不見了)
xxx.vmdk 本身是一個不到1k 的文本文件,它的內容與大小和對應的flat.vmdk 文件相關,通過vi 編輯查看可知真正存放數據的是flat.vmdk 磁盤文件,所以只要該文件還存在,就可以恢復。使用手工創建指定大小的flat.vmdk 文件就會新生成對應的vmdk 文件,然后將原有的(tmp_)xxx-flat.vmdk 文件覆蓋過來就可完成vmdk 文件的重新生成。