VirtualBox の 仮想ハードディスクの登録が消え失せる件

http://ir9.jp/hd13/0228_00.png

↑意訳)「disk見つからねぇんだけど… おまえマジふざけてるの…? マジ意味わかんねぇ。猫のウンコでも踏んどけよ…」

いやいやいやいや、濡れ衣だよ… 俺何もしてねぇよ…! おめーが見失ってるだけなんだよォ!


…というわけけ、仮想HDDイメージが見つからないエラーが出るようになってしまった 我が家の VirutalBox 4.2.6 さん。 バージョンアップを繰り返していたらいつの間にかこんな症状になってしまいました…

ただ、仮想HDDイメージファイルである vdi ファイルが消えたわけではなく再設定してあげれば普通に起動するようになります。

なおす - 一時的に

http://ir9.jp/hd13/0228_01.png

  • [ファイル] → [仮想メディアマネージャ] を開いて、不足している vdi イメージを D&D で登録。スナップショット取ってる仮想マシンの場合は、そのスナップショットのファイルも投げてあげないとダメです。
  • 登録後、vdi 見失ってる仮想マシンを選択して、右側にある「最新の状態に更新」ボタンを押してあげれば復活!


ただし! VirtualBox を再起動させると… vdiファイルの登録が…… 再び消えちゃうんだよね…………

なおす - 恒久的に

どうも 古いVirutalBox の設定ファイルの書式を受け付けなくなってる様子です…(?)

■ダメな例
<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.10-windows">
  <Machine uuid="{cdc4873c-5f73-4582-95bf-6ab5ffc602fc}" name="Windows 95" OSType="Windows95" lastStateChange="2010-08-04T05:18:07Z">
    <ExtraData>
      <ExtraDataItem name="GUI/LastCloseAction" value="powerOff"/>
      <ExtraDataItem name="GUI/LastGuestSizeHint" value="640,400"/>
      <ExtraDataItem name="GUI/LastWindowPostion" value="192,110,640,448"/>
        :
        :


■良い例
<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.12-windows">
  <Machine uuid="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" name="Windows NT4" OSType="WindowsNT4" snapshotFolder="Snapshots" lastStateChange="2013-02-03T16:24:43Z">
    <MediaRegistry>
      <HardDisks>
        <HardDisk uuid="{zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz}" location="c:/path/to/Windows NT4.vdi" format="VDI" type="Normal" />
      </HardDisks>
      <DVDImages/>
      <FloppyImages/>
    </MediaRegistry>
    <ExtraData>
      <ExtraDataItem name="GUI/InfoDlgState" value="400,450,normal"/>
      <ExtraDataItem name="GUI/LastCloseAction" value="powerOff"/>
      <ExtraDataItem name="GUI/LastGuestSizeHint" value="800,600"/>
        :
        :

つまるところ、HDDの設定が仮想マシンの設定ファイル内に記述されていないのが問題のようです。 というわけで追記してあげましょう。あと VirutalBox要素の version属性も "1.12-windows" に修正しないとダメでした。

HDD の uuid は…本来であれば対象vdiのuuidを調べるために云々するんでしょうが、どうで元々接続していた vdi と同じイメージ使うわけですから、元の設定ファイルの下の方に書いてある値をコピペすれば良いです。

■修正した例
<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.12-windows">
  <Machine uuid="{cdc4873c-5f73-4582-95bf-6ab5ffc602fc}" name="Windows 95" OSType="Windows95" lastStateChange="2010-08-04T05:18:07Z">
    <MediaRegistry>
      <HardDisks>
        <!--             ↓ここのuuidは、下の方の… -->
        <HardDisk uuid="{qqqqqqqq-qqqq-qqqq-qqqq-qqqqqqqqqqqq}" location="c:/path/to/Windows 95.vdi" format="VDI" type="Normal"/>
      </HardDisks>
      <DVDImages/>
      <FloppyImages/>
    </MediaRegistry>
    <ExtraData>
      <ExtraDataItem name="GUI/LastCloseAction" value="powerOff"/>
      <ExtraDataItem name="GUI/LastGuestSizeHint" value="640,400"/>
      <ExtraDataItem name="GUI/LastWindowPostion" value="192,110,640,448"/>
        :
        :
    <StorageControllers>
      <StorageController name="&#x30B9;&#x30C8;&#x30EC;&#x30FC;&#x30B8; &#x30B3;&#x30F3;&#x30C8;&#x30ED;&#x30FC;&#x30E9;" type="PIIX4" PortCount="2" useHostIOCache="true">
        <AttachedDevice type="HardDisk" port="0" device="0">
          <!--         ↓ここからコピれば良いかと -->
          <Image uuid="{qqqqqqqq-qqqq-qqqq-qqqq-qqqqqqqqqqqq}"/>
        </AttachedDevice>
        <AttachedDevice passthrough="false" type="DVD" port="1" device="0"/>
      </StorageController>
    </StorageControllers>
  </Machine>
</VirtualBox>

http://ir9.jp/hd13/0228_02.png
↑復活

うむ!

…起動テストとかしてないけど(ぉ

なおす - スナップショットがある場合

ちょっと面倒です。スナップショットとして保存してある差分のHDDを、<HardDisk>要素をネストしつつ元の通りの tree 構造を再現させないとダメっぽいです。

また VirutalBox/Machine/StorageControllers/ 内の <AttachedDevice type="HardDisk"> の Image の uuid は最新の差分の値になるようです。

<VirtualBox xmlns="http://www.innotek.de/VirtualBox-settings" version="1.12-windows">
  <Machine uuid="{cdc4873c-5f73-4582-95bf-6ab5ffc602fc}" name="kanaria" OSType="kanaria" lastStateChange="2010-08-04T05:18:07Z">
    <MediaRegistry>
      <HardDisks>
        <HardDisk uuid="{qqqqqqqq-qqqq-qqqq-qqqq-qqqqqqqqqqqq}" location="c:/path/to/kanaria.vdi" format="VDI" type="Normal"/>
          <HardDisk uuid="{vvvvvvvv-vvvv-vvvv-vvvv-vvvvvvvvvvvv}" location="snapshots/{vvvvvvvv-vvvv-vvvv-vvvv-vvvvvvvvvvvv}.vdi" format="VDI" type="Normal">
            <HardDisk uuid="{wwwwwwwv-wwww-wwww-wwww-wwwwwwwwwwww}" location="snapshots/{wwwwwwww-wwww-wwww-wwww-wwwwwwwwwwww}.vdi" format="VDI" type="Normal" />
          </HardDisk>
        </HardDisk>
      </HardDisks>
      <DVDImages/>
      <FloppyImages/>
    </MediaRegistry>
      :
      :
    <StorageControllers>
      <StorageController name="&#x30B9;&#x30C8;&#x30EC;&#x30FC;&#x30B8; &#x30B3;&#x30F3;&#x30C8;&#x30ED;&#x30FC;&#x30E9;" type="PIIX4" PortCount="2" useHostIOCache="true">
        <AttachedDevice type="HardDisk" port="0" device="0">
          <Image uuid="{wwwwwwwv-wwww-wwww-wwww-wwwwwwwwwwww}"/>
        </AttachedDevice>
        <AttachedDevice passthrough="false" type="DVD" port="1" device="0"/>
      </StorageController>
    </StorageControllers>
  </Machine>
</VirtualBox>

スナップショットが1個なら、ほぼ問題無くtreeを再現できるかと思いますが、複数のスナップショットがある場合は手動ではツリー構造の再現はマズ出来なそう……

ということで「親ディスク」と「スナップショットの差分ディスク」を「仮想メディアマネージャ」に全部ぶち込みましょう。 tree を自動で再現してくれて楽ちんです(ぉ

で、スナップショットの差分ディスクはファイル名がuuidなのでそのままコピペできるのですが、親ディスクの uuid の取得はコマンドプロンプト開いて VBoxManage showhdinfo root.vdi するしかないかも知れません…?

なおす - 最も安全な方法

何れも手動でファイルの中を弄くって強制的に直す感じです。 とりあえずは動いてくれそうですが…もしかしたら、何か問題が発生するかも知れません。

そういう時はアレですよ。




仮想マシン作り直しましょう :-]



うむ。