VirtualBox VMのSMBIOS UUIDを変更する方法


はじめに

PCにはSMBIOSという製造元情報やシリアル番号が記録された領域があります。
PCの起動時にF12なんか押すと見れるこういうBIOS画面に表示される情報です。

普通に使っていれば縁のないBIOSですが、ソフトウェアの検証でBIOSのUUIDを任意の値に設定したくなりました。
実機ではBIOSの値を書き換えることが難しいため、VirtualBox VMでその値を変更することにしました。

はじめはこちらのVBoxManageでのBIOS設定方法紹介ページを見れば楽勝と思っていたのですが、意外と大変だったのでその方法を紹介します。

VBoxManage

VirtualBox VMの設定を色々弄れるユーティリティーです。
色々できます。でき過ぎてオプション覚えられません。
これを使って設定を行います。触りはこのページを見てください。

とりあえずSMBIOSの値を変更する

setextradataオプションを使えばOKです。

例)シリアル番号を変更する

VBoxManage setextradata VM-name "VBoxInternal/Devices/pcbios/0/Config/DmiSystemSerial" "new Serial"

例)ベンター名を変更する

VBoxManage setextradata VM-name "VBoxInternal/Devices/pcbios/0/Config/DmiSystemVendor" "new Vendor"

VM-nameには変更したいVMの名前が入ります。実際の値が何になるかは下記のlistオプションで確認してください。

VBoxManage list vms

UUIDの変更は?

この流れからすると、UUIDは下記のコマンドで行けそうですが、そうはいきません。

VBoxManage setextradata VM-name "VBoxInternal/Devices/pcbios/0/Config/DmiSystemUuid" "9852bf98-b83c-49db-a8de-182c42c7226b"

正常にコマンドは終了し、変更されたように見えるのですが、VMを起動すると元のUUIDに戻ってしまいます。

ちなみに起動されたVMでUUIDを確認する方法はコマンドプロンプトで下記のコマンドを実行するだけです。 
※Windowsの場合

> wmic CSPRODUCT get /value

Caption=コンピューター システム製品
Description=コンピューター システム製品
IdentifyingNumber=0
Name=VirtualBox
SKUNumber=
UUID=06EB385A-9ACE-4C92-8016-E92D94359B77
Vendor=innotek GmbH
Version=1.2

元に戻ってしまう理由ですが、SMBIOSのUUIDはVM自体のUUIDも兼ねており、SMBIOS上の値を書き換えたとしても
別のところにストアされている値でリカバリされてしまうようです。

VirtualBox上でUUIDがストアされている場所

  1. VMのvboxファイル
  2. VMのvdiファイル

それぞれ、下記の手順で変更を行います。

vboxファイル

  1. 一度VMを終了する
  2. Oracle VM VirtualBox マネージャーの一覧から該当のVMを削除する ※参照だけ削除すること
  3. vboxファイルを開き、Machineタグのuuid属性を書き換える
  4. 再度、Oracle VM VirtualBox マネージャーより該当のVMを追加する

vdiファイル

  1. 一度VMを終了する
  2. コンソールより下記のコマンドを実行する
VBoxManage internalcommands sethdparentuuid "vdiファイルパス" "new uuid"

尚、UUIDはWindowsであれば下記のコマンドで生成することができます。

PS C:> powershell -Command "[guid]::NewGuid().ToString()"

あとは普通に起動をすれば、変更後のUUIDが反映されているはずです。