VMware で同じ Guest OS を実環境と仮想環境で使う

IntelMac だと Parallels と BootCamp で Windows XP を共存できるらしいです。というのがうらやましかったので,Linux + Windows で似たようなことに挑戦してみました。「Use individual partitions」というのがどんな仕組みか知りたかったというのもあります。

一応 step by step で書いていきますが,こんなことできましたよーという例なので,同じようにやって壊れたといわれても何もできませんのでそのつもりで。

環境

  • Mother Board: 440BX マザー(RioWorks PDB
  • CPU: Pen3 600MHz×2
  • MEM: 1GB
  • VGA: GeForce 2 MX 400 PCI
  • Net: Intel EtherExpress Pro 100
  • Sound: CMI8738

VMware のエミュレートするチップセットが実環境と同じ 440BX + PATA なのでうまくいったというのが大きいかも。あと,通常版の Windows XP だと環境が変わるとアクティべーションがうんぬんとか面倒ぽかったんで,そういう縛りのない Win2k を採用。余っていたというのもあります。同時に立ち上げないからライセンス的に問題ない…はず。

Host OS のセットアップ

まず,Host の CentOS をインストールします。具体的な区切り量は忘れたけど,

  • hda1: /boot (ext3) 512MBくらい
  • hda2: LVM の PV をディスクの 50% くらい
    • lv_swap として swap
    • lv_root として / (ext3)
  • hda3: 残ったディスク(30%くらい)はほっておく

こんな感じで。将来的に hda3 に Windows 2000 をインストールするイメージです。

で,その上に VMware Server をインストールします。

インストールが終わったら,fdisk 等で hda3 に NTFSパーティションを確保します(フォーマットする必要はない)。

Guest OS 用 VM の作成

VMware で新しい VM を作ります。だいたい普通に作っていけばいいんですが,ディスクを指定するときに,

  1. 「Use a physical disk (for advanced users)」を選ぶ
  2. Device として物理 HDD を選ぶ(ここだと /dev/hda)
  3. Usage として「Use individual partitions」を選ぶ
  4. 今回の例だと,Partition 0 〜 Partition 2 が出現するので,Partition 2 を選択する

という手順を踏みます。

こうするとどうなるかというのは,実際に生成された vmdk ファイルを見てもらうのが早いでしょう。

# Disk DescriptorFile
version=1
CID=********
parentCID=ffffffff
createType="partitionedDevice"

# Extent description
RW 63 FLAT "dummy-pt.vmdk" 0
RW 1044162 ZERO
RW 100663290 ZERO
RW 54588870 FLAT "/dev/hda" 101707515
RW 5103 ZERO

# The Disk Data Base
#DDB

ddb.toolsVersion = "6532"
ddb.adapterType = "ide"
ddb.geometry.biosSectors = "63"
ddb.geometry.biosHeads = "255"
ddb.geometry.biosCylinders = "1024"
ddb.geometry.sectors = "63"
ddb.geometry.heads = "16"
ddb.geometry.cylinders = "16383"
ddb.virtualHWVersion = "4"

細かいジオメトリは環境によって異なるでしょうが,「Extent description」だけ抜き出すと面白いことがわかります。

# Extent description
RW 63 FLAT "dummy-pt.vmdk" 0
RW 1044162 ZERO
RW 100663290 ZERO
RW 54588870 FLAT "/dev/hda" 101707515
RW 5103 ZERO

そう,パーティションテーブルとブートローダとなる先頭 63 セクタ分は,ファイルとして確保(仮想ディスク)してくれるんです。これでゲスト OS がブートローダをいじったとしても問題はおきません。続く 2 つの Linuxパーティション(/boot と LVM)は ZERO となっていて,ゲスト OS からは見えないように工夫されてます。

Guest OS のインストール

VM 上で普通に Win2k のインストーラ CD を立ち上げてインストールします。インストール先として,上 2 つが「不明な領域」とかなりますが 3 つめに「C:」としてドライブ名が見えているので,そこを選択して NTFS としてフォーマットし,そこにインストールします。

インストールが無事終わったら,VMware Tools をインストールして,ドライバ等をインストールします。

grub.conf の書き換え

ホスト OS のブートローダの設定 grub.conf を書き換えます。

今回は 1 つ目のハードディスクの 3 つ目のパーティションWindows 2000 をインストールしたので,grub.conf の最後のほうに,

title Windows 2000
rootnoverify (hd0,2)
chainloader +1

のように書き加えます。

詳しいことは「grub windows」とかでググれ。

ゲスト OS の実環境での起動

あとはゲスト OS をシャットダウンして,ホスト OS をリブートし,grubWindows 2000 を指定して立ち上げるだけです。といってもグラフィックドライバやサウンドドライバがないと貧相なのでインストールする必要がありますが。あと,キーボード・マウスドライバが VMware のものになっているせいか,初回起動時に PS/2 につないだキーボード等を認識できなかったんで,USB 接続の HID を用意しておくのが吉かも。

まとめ

WinNT 系だと,チップセット等の環境が大幅に変わっても一度ドライバが入ってしまえば実体/仮想環境の切替はわりとすんなりいくのではと予想しています。ただ,SCSI とか USB とかディスクの見え方が大幅に変わってしまうものにインストールするのは厳しいんではないかなぁ。

おまけ 1

今回は Windows ゲスト on Linux ホストでやりましたけど,逆バージョンとして【VMware Playerでraw diskのOSを起動する】という記事がありました。

おまけ 2

VMware からアクセスできる物理ハードディスクは /dev/hd* とか /dev/sd* とかに限定されていて LVM 上の LV 等は指定できないんですが,http://homepage3.nifty.com/tjh/vmware-bdwrapper/index.html という面白いラッパを見つけました。設定例として loop デバイスを使っているのでぱっとみ有難味がわかりにくいですが,これを使うと VM の HDD を LVM の LV に置けるんで*1,パフォーマンスを確保しつつ拡縮したり余所持って行ったりとかできそうな予感です。

*1:同じような文字ばっかりでわけわかめ