這裏的一些背景(提供的信息是有效的的VMware Workstation 9如果您使用的是不同的版本,它不能保證它是完全適用。):
的VMWare將爲每個快照新的VMDK文件。裏面那些文件,有一個名爲磁盤描述結構,如下所示:
# Disk DescriptorFile
version=1
CID=acd1cf11
parentCID=ffffffff
createType="vmfs"
當這樣的VMDK文件被訪問,然後VMWare的創建一個新的獨特的CID
和內部存儲。每個VMDK文件都有一個父母ID,第一個標記爲ffffffff
,它告訴VMWare,沒有父母存在。 每一個後續parentID
指的是較早創建的父項。
我遇到的是,如果添加屬於VMDK文件到不同的虛擬機到另一個,並且它安裝,創建一個新的CID的問題和linked list可以打破。
在這種情況下,此VMDK文件所屬的虛擬機不再啓動,並且存在問題。
例子:
---------- C:\DATA\VMWARE\VMWINDOWS7X64.VMDK
CID=acd1cf11
!OK! parentCID=ffffffff
---------- C:\DATA\VMWARE\VMWINDOWS7X64-000003.VMDK
CID=e54a0beb
!OK! parentCID=627c6ec2
---------- C:\DATA\VMWARE\VMWINDOWS7X64-000002.VMDK
CID=627c6ec2
?NOTFOUND? parentCID=b43e1a6f
---------- C:\DATA\VMWARE\VMWINDOWS7X64-000006.VMDK
CID=0454e2f0
!OK! parentCID=8f139197
---------- C:\DATA\VMWARE\VMWINDOWS7X64-000001.VMDK
CID=92718e8b
?NOTFOUND? parentCID=ad44b86e
[...]
你可以看到,在那裏我已經添加OK!在parentCID的行中,表示存在具有有效CID的父VMDK。但在完整的實際案例中,總共找不到2個(在本例中標記爲?NOTFOUND?)。 VMWare上存在一個描述此問題的article。我試圖裝載早期版本的VMDK文件,但沒有成功,因爲鏈中的第一個文件VMWINDOWS7X64.VMDK不再被任何其他文件引用。
編輯這些文件使用文本編輯器上面提到的VMWare的文章的建議是不是一種選擇,因爲
- 我不會碰的二進制文件用文本編輯器
- 我還沒有發現一個可以在Windows中處理這些大文件的編輯器。
我看到一些在Stackoverflow中的文章,要求在C#中查找和替換代碼,但沒有找到滿意的答案。 然後我發現了一個十六進制編輯器,它可以處理Windows的大型二進制文件,它的名字是HxD。它是免費的商業和非商業用途。
有了這個編輯器,你可以找到在這個問題上面提到的結構,修補的CID和修復斷鏈,如:
操作:
- 備份整個虛擬機。在副本上工作。
- 使用之前創建的CID和父CID的列表(如問題所示)
- 更新它,以便每個parentCID引導到適當的CID(快照文件的編號會幫忙,但是在我的情況我發現快照數並不總是按照升序排列,如果順序仍然不清晰,則在VMDK文件中首先包含
parentFilenameHint
,在瀏覽器中按日期時間降序排列VMDK文件 - 最老的是根文件(原來,這幾乎是您查看CID的linked list時得到的順序)。
- 使用編輯器修補每個VMDK文件,但僅修補那些不適合的CID/parentCID
- 嘗試啓動VM。如果成功,你很幸運,並已修復它。如果它不啓動,請刪除虛擬磁盤,並使用鏈中的另一個嘗試它。在我的情況下,經過一些嘗試後,它接受了文件
VMWINDOWS7X64-000003.VMDK
並正確啓動。這意味着並非所有的快照都恢復了,但機器再次運行。另請參閱下面的註釋,我終於能夠完全修復它。
終於工作定盤(標有!FIX!
變化):
---------- C:\DATA\VMWARE\VMWINDOWS7X64-000003.VMDK
CID=e54a0beb
!OK! parentCID=627c6ec2
---------- C:\DATA\VMWARE\VMWINDOWS7X64-000002.VMDK
CID=627c6ec2
!FIX! parentCID=92718e8b
---------- C:\DATA\VMWARE\VMWINDOWS7X64-000001.VMDK
CID=92718e8b
!FIX! parentCID=acd1cf11
---------- C:\DATA\VMWARE\VMWINDOWS7X64.VMDK
CID=acd1cf11
!OK! parentCID=ffffffff
注:
- 沒有保證修補的CID將帶回的虛擬機一個工作狀態。
- 該方案假定您尚未寫入快照所依賴的VMDK。
- 這可能是因爲你找到了幾種方法來恢復CID的鏈接列表 - 把它們全部寫下來,然後嘗試它們(記住:你有一個備份!),如果你幸運的話,你找到正確的,然後你'能夠完全恢復一切。在我的情況下,有兩種可能的方式來重新創建鏈表。一個讓我部分恢復,另一個最終恢復了一切,就像問題發生之前一樣。
- 我建議成功修復後您應該從虛擬機的當前狀態創建一個完整的克隆在新目錄中。這爲您提供乾淨,一致的文件。