スナップショットチェーンが「途切れて」しまったとき
月曜日の朝、手に持ったコーヒーがまだ温かうちに、モニタリングシステムが鳴り響きました。容量500GB近い重要なSQL Server仮想マシンが、夜間のバックアッププロセス中に不具合が発生した後、突然起動できなくなったのです。vCenterで「パワーオン」をクリックすると、すぐに真っ赤な通知が表示されました:“The parent virtual disk has been modified since the child was created…”
システム管理者にとって、これは典型的なCID mismatchエラーです。私が管理している8台のESXiホストクラスターでは、このエラーは停電やVeeamが処理の途中でフリーズした際によく発生します。落ち着いてください。データは通常そのまま残っています。スナップショットファイル間の「リンク」が1箇所ずれているだけなのです。
CIDとParent CID:数字が語る意味
エラーを修正するには、その本質を理解する必要があります。各仮想ディスク(.vmdk)は、実際のデータファイル(-flat.vmdk または -delta.vmdk)と、記述子(descriptor)というテキストファイルの2つの部分で構成されています。この記述子ファイルは数KBと非常に軽量ですが、ナビゲーションにおいて極めて重要な役割を果たします。
記述子ファイルの中には、ディスクの内容の状態を識別するための8桁の16進数コードであるCID (Content ID)というパラメータがあります。
- CID: 現在のファイル自体の識別子。
- parentCID: 依存している「親」ファイルの識別子。
スナップショットを作成すると、VMwareは新しいdeltaファイルを生成します。このファイルのparentCIDは、元のファイルのCIDと一致するように設定されます。何らかの理由で元のファイルのCIDが変更されると、VMwareはデータの不整合を防ぐための保護メカニズムとして、仮想マシンの起動を即座にブロックします。これはデータを守るための仕組みですが、急いでサービスを復旧させる必要がある場合には悪夢となります。
なぜCID mismatchエラーが発生するのか?
これまでの実戦経験から、最も一般的な3つの原因をまとめました:
- バックアップソフトウェアの不具合: VeeamやNakivoなどのツールは、データをコピーするために一時的なスナップショットを作成します。プロセスが突然中断されると、親ファイルのCIDは更新されたものの、子のスナップショットファイルの更新を忘れてしまうことがあります。
- 手動によるVMDKファイルの操作: 誰かが興味本位で記述子ファイルを開いて修正したり、データを取得するためにディスクを別の仮想マシンにマウントして戻したりした場合です。
- メタデータの破損: 予期せぬ停電により、データストア上のメタデータが誤って上書きされることがあります。
CID mismatchエラーの具体的な解決手順
コマンドラインから記述子ファイルを直接修正します。rootアカウントを準備し、SSHを有効にしておいてください。
ステップ1:ログから途切れたリンクを特定する
大量のスナップショットファイルの中から当てずっぽうに探さないでください。データストア上の仮想マシンディレクトリにアクセスし、vmware.logファイルを探します。grepコマンドを使用して、エラーの正確な場所を特定します。
grep -i "CID mismatch" vmware.log
すると、次のような結果が表示されます:
Parent CID (fb123456) does not match expected CID (ab654321)
このログは、子ファイルが親のIDをab654321と期待しているのに、実際の親はfb123456であることを示しています。
ステップ2:ESXiホストにSSHでアクセスする
vSphere ClientからホストのSSHサービスを有効にします(ホスト > 管理 > サービス > TSM-SSH > 開始)。その後、PuTTYやターミナルを使用してログインします。
仮想マシンが格納されているディレクトリ(通常は /vmfs/volumes/[データストア名]/[仮想マシン名]/)に移動し、記述子ファイルをリストアップします:
ls -l *.vmdk
注意点として、-flat や -delta という接尾辞が付いていないファイルのみを操作対象とします。
ステップ3:CIDチェーンを再同期する
親ファイルのCIDを修正するか、子ファイルのparentCIDを修正するかの2つの選択肢がありますが、最も安全な方法は、子ファイルのparentCIDを親の実際の値に合わせて修正することです。
viエディタを使用して子ファイルを開きます:
vi Sheehan-000003.vmdk
parentCIDの行を探します。iキーを押して編集モードに切り替え、古い値をステップ1で見つけた実際の値(例:fb123456)に変更します。その後、Escを押し、:wqと入力してEnterを押して保存します。
より根本的で安全な解決策
スナップショットチェーンが長すぎる場合、手動ですべてのファイルを修正するのは間違いの元です。その場合は、以下の2つのヒントを活用してください:
- スナップショットの統合 (Consolidate Snapshots): CIDを修正して仮想マシンがディスクを認識できるようになったら、仮想マシンを右クリック > スナップショット > 統合 を実行します。これにより、すべてのdeltaファイルがベースディスクに集約されます。
- 仮想マシンのクローン (Clone): リスクを懸念する場合は、仮想マシンのクローンを作成してください。クローン作成プロセス中にすべてのスナップショットが自動的にフラット化(統合)され、完全に同期された新しいCIDセットが作成されます。
管理者のための「鉄則」
仮想化システムを運用する上で、以下のルールを覚えておいてください:
- 修正前に必ず記述子ファイルをバックアップする:
cp file.vmdk file.vmdk.bakと入力するのに2秒しかかかりませんが、誤って内容を削除してしまったときにあなたを救ってくれます。 - ベースディスクのルール: ベースディスク(Base Disk)には親がないため、
parentCIDは常に固定でffffffffです。この数字は絶対に変更しないでください。 - 操作時は仮想マシンをシャットダウンする: 書き込み権限の競合を避けるため、記述子ファイルを操作する前に仮想マシンが完全に停止していることを確認してください。
CID mismatchの解決は、「親子の関係」を理解していれば難しくありません。数テラバイトのデータをリストアするのに5〜6時間費やす代わりに、数行のテキストを修正するだけで5分もかかりません。この経験が、VMwareのエラーログに直面した際の自信に繋がれば幸いです。

