技術ブログ
個人メモ的なエントリです。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ファイルを手編集することで 対処できたのでメモしておきます。
以下に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つの共有ディスクに対して複数のVMにおいてメディア定義が行われていました。 このため、同一のUUIDを使用したメディア定義が複数回実行されることになり、先のエラーが出たものと考えています。
このため、ノード1以外のノードで<MediaRegistry>内の<HardDisk>を削除したところ、エラーは消え、正常にVMを登録することができるようになりました。めでたしめでたし。