VMwareのBIOSを拡張する

gPXEとiSCSIを使ってWindows XPをネットワークブート(ディスクレスブート)する実験(くわしくはここ)の次にWindows 7ディスクレス・インストールしようとしてちょっとハマってしまった。その過程で、VMware仮想マシン(ゲストマシン)のBIOSを変更したり拡張できることが分かったのでメモしておく。

ここではBIOS全体を変えるのではなく、ネットワークカード部分のBIOS(いわゆるnbios)をVMwareの標準のAMD PCNET32(Am79C970A)からgPXE対応のEtherboot ROMに変更する方法を載せておく。

最初にgPXE対応のEtherboot ROMのバイナリイメージを次のページからダウンロードする。
http://rom-o-matic.net/gpxe/gpxe-1.0.0/contrib/rom-o-matic/
ここで、

1. Choose an output format: [ROM binary (flashable) image (.rom)]
2. Choose a NIC type: [pcnet32]
3. (optional - for binary ROM image format only)
PCI VENDOR CODE: [1022]   PCI DEVICE CODE: [2000]

を選択して[Get Image]ボタンでバイナリ・イメージをダウンロードする。ファイル名は“gpxe-1.0.0-10222000.rom”。

追記:2010/07/28
VMwareの仮想NICAMD PCNET32だけではなくIntel E1000の場合もある。最初、XPで試したときはPCNET32にだったが、最近Windows 7で試したらE1000になっていた。ゲストOSの種類で変えているのかもしれない。
Intel E1000の場合は次の様に指定する。

1. Choose an output format: [ROM binary (flashable) image (.rom)]
2. Choose a NIC type: [e1000]
3. (optional - for binary ROM image format only)
PCI VENDOR CODE: [8086]   PCI DEVICE CODE: [100f]

ダウンロードするファイル名は“gpxe-1.0.0-8086100f.rom”となる。
IntelのVendor Codeが“8086”というのは笑える。)

まず、普通にVMwareのゲストを起動してBIOSセットアップに入ると次のようなBootメニューが出てくる。

さて、仮想マシンをシャットダウンして、今ダウンロードしたROMイメージを仮想マシンディレクトリにコピーする。

# cp gpxe-1.0.0-10222000.rom /usr/lib/virtual_machines/test-pc/

そして、仮想マシンの設定ファイル(.vmx、この例ではtest-pc.vmx)の最後の次のような1行を追加する。

nbios.filename = "gpxe-1.0.0-10222000.rom"

これでゲストを再起動してBIOSセットアップに入ると、次のようになっている。

Intel E1000の場合は

e1000bios.filename = "gpxe-1.0.0-10222000.rom"
ethernet0.opromsize = 70144

を追加する。


このgPXEのエントリをブート優先順位の一番上に持って行き、リブートすると次のように行き成りgPXEが起動する。

今回はネットワークROMの変更だけメモしておいたが、同様の方法でBIOS全体の変更もできる。VMwareのオリジナルROMイメージを抽出して、文字列データやロゴイメージを変更することも可能だ。まだトライはしてないが、その内、暇があったらやってみよう。

参考:http://www.etherboot.org/wiki/vmwarebios