理系学生日記

おまえはいつまで学生気分なのか

vSphere でスナップショットをマージするときにコンフリクトを発生させたら

マージとはなんだったのか…。

まずは前段。 ***vSphere とは VMWare 社が提供しているサーバ仮想化ソフトウェア群。特定のソフトウェアを指すのではない。この中に、 -ESXi (ハイパーバイザ) -vCenter Server (統合管理ソフトウェア) などの具体的なソフトウェアなどを含んでいる。

***スナップショットとは ESXi 上で作成した仮想マシン (VM) の状態を保存したもの。バックアップとは根本的に異なっていて、ベースとなる VM からの差分のみを保存している。公式の言うことによると CoW (Copy-On-Write) とのこと。

VMware Knowledge Base> スナップショットとともに作成された子ディスクはスパース ディスクです。スパース ディスクは COW (copy‐on‐write) メカニズムを採用しており、書き込み処理によってコピーされるまでデータは仮想ディスクに格納されません。この最適化により、ストレージの容量を節約できます。 <<

(VMware Knowledge Base より引用)

上記引用の通りだけれど、スナップショットを作成すると新しい子ディスクが作成され、当該 VM を動かし続けると、この子ディスクに差分が蓄積されていくという仕組みになっている。

***スナップショットのマージ 差分が蓄積されていくのは子ディスクなので、いつかは VM 本体のハードディスク (vmdk ファイル) にその差分を反映してやらないといけない。これがマージ。これが発生するのは、子ディスクに対して差分を蓄積している状況下において、その子ディスクに紐づくスナップショットを削除したとき。このとき、差分が親ディスクに確定されるという、(個人的には)非直感的な動作をするようになっている。

http://www.hitachi.co.jp/Prod/comp/soft1/manual/3021/0308530D/AOSR0267.HTM> VMware vSphere環境において,仮想サーバの指定されたスナップショットを削除します。 現在使用中のスナップショットを削除対象に指定した場合は,スナップショット作成元の仮想ディスクに変更が確定されます。 <<

**親子がでてきたときに発生する問題

親子がでてきてマージもでてくると、問題になるのがコンフリクトとなるのは VCS の文脈からも明らかなのですが、実際に以下のような階層関係を持ったスナップショットを作成することができる。 -元となる VM (base) --スナップショット A --スナップショット B

要するに互いに兄弟関係にあるようなスナップショット。言い替えれば trunk に対する 2 つの branch が存在する状態。

ここで、スナップショット A とスナップショット B とで、互いにコンフリクトするような差分を作成し、その後 base にマージさせる場合、vSphere はどのような動作をするのか、というのが問題意識だった。考えられる動作としては以下の 2 つ。 -コンフリクトしたというアラートを出し、ユーザによるコンフリクト解消を求めてくる (svn や git と同じ) -そしらぬ振りをして無視する (先勝ち、もしくは後勝ち)

結論としては、後者、かつ、後勝ちだった。

**検証 vSphere 5.1 で確認。Windows Server 2003 を VM とした。手順は以下のとおり。 +スナップショット A のデスクトップに[test1.txt][test2.txt]を作成。それぞれのファイルの内容は[a]と[b] +スナップショット B のデスクトップに[test1.txt]のみを作成。ファイルの内容は [c] +スナップショットAをActiveにした後、スナップショットマネージャからAを削除 (スナップショットA の差分が、親である base の仮想ディスクに確定される) +スナップショットBをActiveにした後、スナップショットマネージャからBを削除 (スナップショットB の差分が、親である base の仮想ディスクに確定される)

結果、base のデスクトップ上には [test1.txt] のみが存在する状態になり、その内容は [c] だった。つまり、スナップショット A の差分は失われた状態になった。せめて、コンフリクトの発生していない test2.txt は残ってほしかったのだけど。。。

**結論 互いに兄弟関係にあるようなスナップショットを取るときは気をつけましょう (というか、原則取るな、とも言える気がする)