0

私が最近発見したことは、VM の外部からVMWareに仮想ディスク (*.VMDKファイル)をマウントするのは危険な場合があるということです。

シナリオの説明:新しい仮想マシン ( VM B と呼びましょう) を作成しました。そこでは、そのような仮想ディスク (別の仮想ディスクに属する) から読み取ったイメージング ツール( Parted Magicなど) を含む ISO イメージから起動しました。別の外部物理ディスクにコンテンツを書き込むために、VM Aという名前のマシン)。その仮想ディスク ファイルはマウントされただけで、その構造に変更を加えていません。

ここに画像の説明を入力

問題: VM B をシャットダウンし、もう一方のVM Aを起動しようとした後、驚いたことに、それ以上起動しませんでした。マシンのログファイル (vmware.log) を調べると、 VM Aのログに「コンテンツ ID の不一致」エラーが見つかりました。

どうしたの?どうすればこれを修正できますか?

4

1 に答える 1

1

以下にいくつかの背景を示します (提供される情報はVMWare Workstation 9に対して有効です。別のバージョンを使用している場合、完全に適用できるとは限りません)。

VMWare は、スナップショットごとに新しい VMDK ファイルを作成します。これらのファイル内には、次のようなディスク記述子と呼ばれる構造があります。

# Disk DescriptorFile
version=1
CID=acd1cf11
parentCID=ffffffff
createType="vmfs"

このような VMDK ファイルにアクセスすると、VMWare は新しい一意のファイルを作成し、CID内部に保存します。すべての VMDK ファイルには parentCID があり、最初のファイルは でマークされておりffffffff、VMWare にそれ以上の親が存在しないことを伝えます。後続のすべては、以前に作成された親を参照するため、この方法でリンクされparentIDたリストを構築しています。

私が遭遇した問題は、別の仮想マシンに属する VMDK ファイルを別の仮想マシンに追加し、マウントすると、新しい CID が作成され、リンクされたリスト が壊れる可能性があることです。

このような場合、この 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の記事があります( 「子が作成されてから親仮想ディスクが変更されました」エラー (1007969) )。以前のバージョンの VMDK ファイルをマウントしようとしましたが、チェーンの最初のファイルである VMWINDOWS7X64.VMDK が他のどのファイルからも参照されていないため、マウントできませんでした。

上記の VMWare の記事で提案されているように、これらのファイルをテキスト エディターで編集することはできません。

  1. テキストエディタでバイナリファイルに触れない
  2. Windows でこのような大きなファイルを処理できるエディタは見つかりませんでした。

Stackoverflow で C# の検索と置換コードを求める記事をいくつか見ましたが、まだ満足のいく答えは見つかりませんでした。次に、Windows用の大きなバイナリファイルを処理できる16進エディターを見つけました。その名前はHxDです。商用・非商用を問わず無料でご利用いただけます。

このエディターを使用すると、上記の質問で言及されている構造を特定し、CID にパッチを適用して、壊れたチェーンを修復できます。

VMDK の例

行動:

  • 仮想マシン全体をバックアップします。コピーで作業します。
  • 以前に作成した CID と親 CID のリストを使用します (質問に示されているものと同様)。
  • 各parentCIDが適切なCIDに向けられるように更新します(スナップショットファイルの番号付けはここで役立つかもしれませんが、私の場合、スナップショット番号が常に昇順であるとは限らないことがわかりましparentFilenameHintた.VMDKファイルに含まれているものを最初に取ります.エクスプローラーで VMDK ファイルを日時の降順で並べ替えることはまだ明確ではありません - 最も古いものはルート ファイル ( ) です。これは、CIDのリンクされたリストparentCID=ffffffffを見たときに得られる順序とほぼ同じであることが判明しました)。
  • エディターを使用して各 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 にパッチを適用しても、VM が動作状態に戻るという保証はありません。
  • このシナリオでは、スナップショットが依存している VMDK に書き込んでいないことを前提としています。
  • CID のリンクされたリストを復元するいくつかの方法を見つけることができます - それらをすべて書き留めてから試してください (覚えておいてください: バックアップがあることを忘れないでください!)。すべてを完全に回復します。私の場合、リンクされたリストを再作成する方法は 2 つあります。1つは部分的に回復することができ、もう1つは最終的に問題が発生する前の状態にすべてを復元しました.
  • 修正が成功したら、仮想マシンの現在の状態から新しいディレクトリに完全なクローンを作成することをお勧めします。これにより、クリーンで一貫性のあるファイルが提供されます。
于 2012-11-13T12:33:06.630 に答える