彷徨えるフジワラ

年がら年中さまよってます

VirtualBox 仮想 HDD の手動管理

要約すると、VirtualBox の仮想 HDD 管理の整合性を、手動で辻褄あわせする話。

仮想 HDD の実体ファイル破損などにより、特定の仮想 HDD へのアクセスがにっちもさっちもいかない場合、正当な手順では、スナップショットの削除や仮想 HDD の登録抹消ができないので、以下の様な手動管理が必要になる筈。

さて、事の発端は、仮想 HDD の実体ファイルを置いておいた物理 HDD の障害をなんとか復旧させた後で、不良 HDD を PC から取り外して再起動した際に表示された、VirtualBox からの警告メッセージ:

アクセスできない仮想ディスクがあるんだけど、どーする?(意訳)

ありゃ?!仮想マシンの設定上で仮想 HDD を切り離して OK かと思っていたら、どうやら『切り離し』と『登録抹消』は別の操作扱いらしい。

仮想メディアマネージャのヘルプによると:

  • 除去(remove) ⇒ 登録抹消 (+ 実体ファイルの削除)
  • 解放(release) ⇒ 仮想マシンからの切り離し

という区分になっているとのこと。

仮想マシンの設定画面において、『ストレージ』管理から実施する『割り当てを除去』は、おそらく『解放』に相当するのだろう。

さて、当該仮想 HDD のイメージファイルが入った物理 HDD は、PC から取り外してしまったので、いまさら繋ぎ直して設定変更云々などということは、あまりに面倒過ぎて、できることなら回避したいところ。

幸い VirtualBox の設定ファイル類は全て XML 形式で保存されているので、これを直接エディタで編集してしまうことに。
仮想マシンの設定ファイルに辿り着くには、まずはユーザ毎の仮想マシン管理ファイル ("${HOME}/.VirtualBox/VirtualBox.xml") の "MachineEntry" 要素から、対象仮想マシンの設定ファイル (*.vbox ファイル) の位置を取得する: Windows 環境において、HOME 環境変数が設定されていない場合は "C:\Users\ユーザ名\.VirtualBox\VirtualBox.xml" がデフォルト格納先の筈。

<VirtualBox ....>
  <Global>

    :

    <MachineRegistry>
      <MachineEntry
       ....
       src="....\opensolaris.vbox"
       />

"VirtualBox.xml" 側には仮想マシンの名称/説明等は記述されていないので、場合によっては参照先を個別に確認する必要があるかも。

当該仮想マシンの設定ファイルを特定したなら、次に設定ファイル中の "HardDisk" 要素列挙から、コメントアウトなり削除なりで、除外したい仮想 HDD に相当するエントリを無効化する。

<VirtualBox ....>
  <Machine ....>
    :
    <MediaRegistry>
      <HardDisks>
        :
  <!--
        <HardDisk
         uuid="{39e4bfe5-b8dd-4fd3-8e88-a6d7df5bdc12}"
         location="....\disk0.vdi"
         format="VDI" type="Normal"
        >
          <HardDisk
           uuid="{e85d5d64-2127-4557-90a2-4656788bb892}"
           location="Snapshots/{e85d5d64-2127-4557-90a2-4656788bb892}.vdi"
           format="VDI"
           />
        </HardDisk>
  -->

以上で当該仮想 HDD は無効になる筈なので、改めて VirtualBox マネージャを起動すると…… 整合性エラーが出る…… orz

うーむ、やっぱり手動編集は無理があったのか?

……あれ?そういえば、"HardDisk" 要素をコメントアウトする際に、属性値に "Snapshots〜" などという値を持った要素が入れ子になっるのを目にしたなぁ。

<VirtualBox ....>
  <Machine ....>
    :
    <MediaRegistry>
      <HardDisks>
        :
  <!--
        <HardDisk
         uuid="{39e4bfe5-b8dd-4fd3-8e88-a6d7df5bdc12}"
         location="....\disk0.vdi"
         format="VDI" type="Normal"
        >
          <HardDisk
           uuid="{e85d5d64-2127-4557-90a2-4656788bb892}"
           location="Snapshots/{e85d5d64-2127-4557-90a2-4656788bb892}.vdi"
           format="VDI"
           />
        </HardDisk>
  -->

ひょっとして……やっぱりあった!コメントアウトした "HardDisk" 要素の uuid を、"Snapshot" 配下の要素が属性として保持している!

<VirtualBox ....>
  <Machine ....>
    :
    <Snapshot ....>
      :
      <StorageControllers>
        <StorageController ....>
          :
          <AttachedDevice ....>
            <Image
             uuid="{39e4bfe5-b8dd-4fd3-8e88-a6d7df5bdc12}"
             />
          </AttachedDevice>

ということは、無効にした "HardDisk" 要素を元に戻し、VirtualBox マネージャを再起動した上で、仮想マシンに対して『スナップショットを削除』を実施してみると……予想通り、破棄した仮想 HDD の不在でエラーになる!

この要素が『参照先不在』要因になって、整合性エラーを起こしていたのか。

それなら、上記の "AttachedDevice" 要素を配下ごと無効化すれば大丈夫そうだな。

さて、仮に仮想マシンの状態をこのスナップショット時点の状態に戻したとしても、ハードウェア構成が変わってしまっているので、『スナップショットを復元 ⇒ 再実行』はそれほど簡単には行かない筈。

そうなると、このスナップショットは残しておいても、おそらく何の役にも立たないことは明らかなので:

  1. 仮想マシンの構成設定から、当該仮想 HDD に関するエントリを手動編集で無効化 ("HardDisk" 要素の無効化)
  2. 仮想マシンのスナップショット設定から、当該仮想 HDD に関するエントリを手動編集で無効化 ("AttachedDevice" 要素の無効化)
  3. 再起動した VirtualBox マネージャから『スナップショットを削除』を実施 ⇒ 当該仮想 HDD 以外の仮想 HDD イメージが統合

以上の手順で『仮想 HDD の登録抹消』と『関連するスナップショットの破棄』をまとめて済ませてしまうことに。

設定ファイルを手動編集してから、VirtualBox マネージャを起動すると……おぉ!警告無しにちゃんと起動できてる!『スナップショットを削除』も問題なく完了した!仮想メディアマネージャの画面からも、手動破棄した仮想 HDD のエントリが消えてる!

やれやれ、これでやっと不良仮想 HDD の破棄を本当に完了することができたわけだ。