ESXi仮想マシンのスナップショットのチェーンはどのように維持されている?


VMware ESXiのスナップショット機能は仮想マシンの機能では最もポピュラーな機能です。
重大な変更の前に予めスナップショットを取得しておけば、いざ変更により問題が生じたとき、そのスナップショットの段階まで仮想マシンの状態を巻き戻すことが可能です。
複数のスナップショットを保持することが可能なので段階を分けてスナップショットを取得することもできます。

複数のスナップショットを保持している場合、たいていは階層化されて保存されています。
この階層チェーンを保持するのに使われているのはコンテントID(以下、CID)というものです。
このCIDはそれぞれのvmdkファイルに一意に割り当てられるハッシュ値です。

ベースとなる親vmdkファイルのCIDと、スナップショットとなる子vmdkファイルのCIDはになります。
この親と子を結びつけるために使われるのはparentCIDという項目で、子のvmdkファイルのparentCID値は親ファイルのCID値と同一になります。

つまり、通常は以下のようになります。

cid_relation

このparentCIDとCIDを使うことにより、延々とスナップショットを作成し続けても、つながりが維持されます。
しかし、もしスナップショット操作で問題が生じたとき、parentCIDが親のCIDと異なる値になることがあります。これはCID mismatch errorという事象で、仮想マシンが起動できなくなる恐ろしいエラーです。

ここからが本題です。
上の場合は、起動状態の仮想マシンに対し、スナップショットを取得した場合の話です。
停止状態の仮想マシンに対し、スナップショットを取得したときはまた別の動作をします。

スナップショットのvmdkファイルを開いてCIDとparentCIDを確認しましょう。
驚くべきことに、CIDとparentCIDが同一です!自分自身を参照しているようです。
自分自身を参照していては、CID mismatch errorが起きてしまうのではないでしょうか?

ubuntu_snapshot_no_write2

ご安心ください。ここで親のvmdkファイルを開きます。
そうすると、親のCID値が子のparentCID値と一致します。
ちゃんとチェーンが保たれていますので、CID mismatch errorは起きません

ubuntu_parent_vmdk_2

では、なぜスナップショットのCID値とparentCID値は同一なのでしょうか。

ドキュメント上明記されているわけではないので推測となりますが、VMwareの仕様として、
スナップショット自身の管理情報が書き込まれているのみで差分データがない、
つまり仮想マシンの実データが書き込まれていないスナップショットvmdkファイルのCID値は、親のvmdkファイルのCID値と同一になるようです。

もしここで仮想マシンを起動すれば差分データが発生しますが、その瞬間にスナップショットvmdkファイルのCID値は一意のものに変更されます。

ubuntu_snapshot_written2

仮想マシンを止めて変更を撤回(Revert)すれば割り振られたCID値も戻ります。

関連トピックス:

カテゴリー: VMware, vSphere タグ: , , , , , パーマリンク

コメントを残す

メールアドレスが公開されることはありません。

 

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

この記事のトラックバック用URL