半仮想マシンのすゝめ

gPXEとiSCSIによるネットワークブートの環境を整えてからは、マシンの利用方法が随分変わって来た。特に“半仮想マシン”を使っている。半仮想マシンとは、ある時は実マシンで動かして、ある時は仮想マシンとして動かすという使い方。マシンは起動時に使うHDDにその全てが入っているから、HDDを変えれば同じマシンでも他のシステムとして利用できる。逆に言えば、あるHDDを色々なPCでブートして使えば、どのPCでも同じシステムが利用できる。つまり“あるHDD”を実マシンに付ければ実マシンでシステムが動くし、同じHDDを仮想マシンに繋げば仮想マシンでシステムが動く。“あるHDD”の実体が仮想ディスクで、そのファイルをiSCSIで任意のPCから使うようにしただけだ。

Ubuntu等のLinuxで標準的に使われるiSCSIターゲット(サーバ)は“IET”だが、IETではターゲットマシン上のあるファイルを仮想ディスクとしてiSCSIでサービスすることができる。そしてこの“仮想ディスク”はVMwareなどで使うモノシリック型の仮想ディスクと中身は同じである。

そこで、iSCSIでサービスするディスクファイルを作る際に、一旦、仮想マシンの仮想ディスクとしてファイルを作成する。VMwareであれば“Add Hardware”で仮想ディスクを1つ新しく作る。その際にPropertyのFile Optionsで“Allocate all disk space now”を選択する。つまり可変サイズの仮想ディスクではなく、予め全容量を割り当てるフラット型を選択する。例えば、nomad.vmdkという仮想ファイルを作成するとnomad-flat.vmdkという仮想ディスク“本体”が作成される。この“-flat”付きのファイルをiSCSIのターゲットとして/etc/ietd.confの中で指定する。例えば、こんな風に:

root@server# ls -l /usr/lib/Virtual_Machines/Nomad/
total 4198416
-rw------- 1 root root 4294967296 2010-08-21 10:25 Nomad-flat.vmdk
-rw------- 1 root root        399 2010-08-21 10:25 Nomad.vmdk
-rw------- 1 root root          0 2010-08-21 10:24 Nomad.vmsd
-rwxr-xr-x 1 root root       1223 2010-08-21 10:25 Nomad.vmx
-rw------- 1 root root        260 2010-08-21 10:25 Nomad.vmxf
root@server# 
root@server# cat /etc/ietd.conf
# iSCSI target configuration

Target iqn.2010-08.localnet:nomad
	Lun 0 Path=/usr/lib/Virtual_Machines/nomad/nomad-flat.vmdk,Type=fileio

root@server# 

そうすれば、iSCSIを通してネットワーク上の任意の実マシンからこの仮想ディスクをHDDとして利用できる。また、このファイルを接続したVMware仮想マシンとして立ち上げれば、仮想マシンとして利用できることになる。

実際にUbuntu 10.04をインストールして、実マシンでも仮想マシンでも利用できることを確認している。
実マシンで動かすと:

仮想マシンで動かすと:

まぁ、当たり前の事だがほとんど違いはない。(逆に実マシンと仮想マシンでブート時に画面サイズを変えることもできる。) 実マシンと仮想マシンで接続されているハードウェアが異なるので、それに関連するところは自動的に変更されている。 Linuxの場合、ブート時にハードウェア構成に合わせてモジュールをロードするのでブートの度に手動で設定を変えることは余りないだろう。

ただし、仮想マシンとして動かしつつ、同時に実マシンで利用することはNG。このディスク・ファイルの中のファイルシステムが壊れてしまう。排他制御の機構がないので、その点は注意が必要だ。

同様の方法でWindowsも半仮想マシンとして動かすことも確認している。ライセンス認証前のお試し版のWindows7で試してみた。ただし、ライセンス認証後にこう言ったこと(=別のPCでブートする)をやると、再認証が必要となる。同時に複数のマシンで動かしているわけではないのでライセンス条項的には問題ないだろうが、ブートの度にOSに“ハードウェア構成が変わっているからリブートが必要”とか“再認証しなさい”と言われ、何回も繰り返していると最後にはブートのたびにマイクロソフトに電話して認証しなおさなければならない。現実的ではない。その点、Linuxは同じHDDをどのマシンで起動しても文句を言わないので嬉しい。コンピュータの色々な要素が仮想化されている現在では、Windows型のライセンス形態(1つのマシンに1つのライセンスを対応させる形態)は時代遅れになりつつあるのかも知れない。

実はこれを始めたために1つの実マシンをWindowsで立ち上げたりLinuxで立ち上げたりすることになった。ところがWindowsLinuxではシステムクロックの扱いが異なるのでどちらかの時間が狂ってしまう。それでクロックの扱いを統一しなければならなかった。詳しくは“UTCにするかJSTにするか、それが問題だ”を参照。
この半仮想マシン、もう一歩進めて、仮想マシンiSCSIでブートする方がベターだ。仮想ディスクを仮想マシンに直接“接続”してもOKなのだが、実マシンでiSCSIブートする際には、仮想マシンから“切断”しておく方が良い。しかし、実マシンでブートする度に一々、仮想マシンの設定を変えるのも頂けない。いっそのこと、仮想マシン自身もiSCSIブートにすればすっきりする。いざという時のために仮想ディスクとして作成はしておくものの、普段はiSCSIのターゲットとして使うわけだ。(仮想マシンをgPXEでiSCSIでブートするのではあれば、仮想マシンBIOSを拡張した方が素早くブートできる。詳しくは“VMwareのBIOSを拡張する”を参照。)