株式会社コーソル

コーソルDatabaseエンジニアのブログ

技術ブログ

VirtualBoxのvboxファイルにおける共有ディスクの扱い

個人メモ的なエントリです。Oracle VM VirtualBoxにおいて、仮想ディスクの割り当てを含めたVMに関する設定情報は、拡張子vboxの XMLファイル(以後vboxファイルと呼ぶ)に記載されています。

共有ディスクを使用したVMをいろいろ扱っていると、vboxファイル内の共有 ディスクに関する記載が適切でないものになるケースがあるようです。

自分の場合は、VMの登録、削除やVMのグループ化のなどの作業を行った後、 VMを再度登録しようとしたとき、以下のようなエラーに出くわしました。

仮想マシン"/u01/VirtualBox/xxx/oel58n02/oel58n02.vbox"を開けませんでした。

Cannot register the hard disk '/u01/VirtualBox/xxx/oel58n02/../oel58Shared/oel58crs01.vdi' 
{9acef472-8614-4166-a6e1-817a26f9488d} because a hard disk 
'/u01/VirtualBox/xxx/oel58n01/../oel58Shared/oel58crs01.vdi' with UUID 
{9acef472-8614-4166-a6e1-817a26f9488d} already exists.

終了コード : NS_ERROR_INVALID_ARG (0x80070057)
コンポーネント: VirtualBox
インターフェース: IVirtualBox {3b2f08eb-b810-4715-bee0-bb06b9880ad2}

この問題への正式な対処方法は不明ですが、XMLファイルを手編集することで 対処できたのでメモしておきます。

vboxファイルにおける共有ディスクの扱いとエラーへの対処

以下に2ノードで1つの共有ディスクを構成した時のvboxファイルの抜粋を示します

ノード1のvboxファイル(抜粋)

    <MediaRegistry>
      <HardDisks>
        <HardDisk uuid="{c1f5a005-5c8d-42a2-a6c0-361f06dd838f}" location="test1.vdi" format="VDI" type="Normal"/>
        <HardDisk uuid="{2e9d39e2-46f3-4aaf-9dcd-98b94037ee39}" location="shared1.vdi" format="VDI" type="Shareable"/>
      </HardDisks>
        : 
      <StorageController name="SAS" type="LsiLogicSas" PortCount="8" useHostIOCache="false" Bootable="true">
        <AttachedDevice type="HardDisk" port="0" device="0">
          <Image uuid="{c1f5a005-5c8d-42a2-a6c0-361f06dd838f}"/>
        </AttachedDevice>
        <AttachedDevice type="HardDisk" port="1" device="0">
          <Image uuid="{2e9d39e2-46f3-4aaf-9dcd-98b94037ee39}"/>
        </AttachedDevice>

ノード2のvboxファイル(抜粋)

    <MediaRegistry>
      <HardDisks>
        <HardDisk uuid="{952bb35d-0540-4f94-beed-6135bdbf8df8}" location="test2.vdi" format="VDI" type="Normal"/>
      </HardDisks>
        : 
      <StorageController name="SAS" type="LsiLogicSas" PortCount="8" useHostIOCache="false" Bootable="true">
        <AttachedDevice type="HardDisk" port="0" device="0">
          <Image uuid="{952bb35d-0540-4f94-beed-6135bdbf8df8}"/>
        </AttachedDevice>
        <AttachedDevice type="HardDisk" port="1" device="0">
          <Image uuid="{2e9d39e2-46f3-4aaf-9dcd-98b94037ee39}"/>
        </AttachedDevice>

注意いただきたいのはノード1の<MediaRegistry>タグで囲まれた部分には 共有ディスクshared1.vdiに関する<HardDisk>エレメントがある一方、 ノード2の<MediaRegistry>タグで囲まれた部分には 共有ディスクshared1.vdiに関する<HardDisk>エレメントがないことです。

しかし、<StorageController>タグ内の<AttachedDevice>には、両ノードとも 共有ディスクに対応するUUIDで<Image>エレメントが存在します。

これから、以下の点が言えそうです。

  • 仮想ディスクの実体1つに対して、<MediaRegistry>内の<HardDisk>でメディアを定義し、UUIDを割り当てている。
  • メディアの定義はいずれかのVMだけで実施すればよい。したがって、共有ディスクについては、クラスタ内のいずれかのノードでメディア定義を実行すればよい
  • 仮想ディスクへの接続定義は、<StorageController>内の<AttachedDevice>内の<Image>において、メディア定義で割り当てたUUID指定で行う。

今回エラーが発生した環境を見ると、理由は不明ですが、1つの共有ディスクに対して複数のVMにおいてメディア定義が行われていました。 このため、同一のUUIDを使用したメディア定義が複数回実行されることになり、先のエラーが出たものと考えています。

このため、ノード1以外のノードで<MediaRegistry>内の<HardDisk>を削除したところ、エラーは消え、正常にVMを登録することができるようになりました。めでたしめでたし。

プロフィール

On7tWW6m1Ul4

渡部 亮太

・Oracle ACE
・AWS Certified Solutions Architect - Associate
・ORACLE MASTER Platinum Oracle Database 11g, 12c 他多数

カテゴリー

アーカイブ