ディスクレスXPの実現

iSCSIとgPXEを利用して念願のWindows XPのネットワークブートを実現した。(“LinuxのPXEサーバからディスクレスWindows XPを”に書いたように、XPの限定仕様であるBartPEをRamDiskを使ったブートには以前、成功していたが、本格的なXPの利用とまではいかなかった。)

概要

大まかな流れは以下の通り:

参考(gPXE):http://www.etherboot.org/wiki/howtos
参考(iSCSI):http://iscsitarget.sourceforge.net/

gPXEはPXEを拡張したブート機能を提供する。通常のPXEiSCSIプロトコルを使ったブートとかはできないが、gPXEをつかうことで可能となる。

ディスクレス化するXPの用意

XPはディスクレス状態でSANにインストールするのでなく、既に稼働しているものをディスクレス化する。(SAN上への“クリーンインストール”はできない。従って、クリーンインストールする場合は、適当なマシン(勿論、仮想マシンでも可)でXPをクリーンインストールし、ソフトウェアを全て更新後、認証前にiSCSIのモジュールをインストールしてディスクレス化した後、認証という手順になる。理屈上は。未確認。)
参考:http://www.etherboot.org/wiki/sanboot/winxp

XPは出来るだけ小さいパーティションにインストールする。(上の参考ページでは4GBとなっているがSP2以前のCDからSP3へ更新する際に更新のインストールに4GBでは不足するようだ。一旦6GB程度でインストールして、必要があれば小さなディスクへ引っ越せば良い。小容量ディスクへの引っ越しはここ。)

その後、iSCSIイニシエータ(iSCSIのクライアント側)ドライバを組み込む。
参考:http://www.etherboot.org/wiki/sanboot/winnt_iscsi
ドライバの組み込みの際、“Configure iSCSI Network Boot Support”画面が出なかったら更に、追加のソフトウェアをインストールする。(私の場合、この画面が出なかったので、次のドライバをインストールしている。)
参考:http://www.etherboot.org/wiki/sanboot/winnt_sanbootconf

iSCSIドライバを組み込んだ後に、XPをインストールしたHDDをiSCSIターゲット(iSCSIのサーバ側)マシンへファイルとしてコピーする。
参考:http://www.etherboot.org/wiki/sanboot/transfer
(参考ページでは物理HDDをファイルへ変換しているが、仮想マシンの仮想“フラット”ディスクへXPをインストールすれば、フラットファイルをそのままコピーすれば良い。もしくはiSCSIターゲットが仮想マシンであれば、そのまま仮想ディスクを“つなぎ替える”だけでいい。)

iSCSIターゲット(ストレージサーバ)の設定

今回はLinuxマシンをiSCSIのサーバとした。ベースとしたのはUbuntu 10.04 LTS Serverだが、基本的には他のバージョンやディストリビューションでもほぼ同じだろう。インストールと設定は拍子抜けするほど超簡単。(本格運用するのであれば、構成や細かいパラメータの調整等が難しいだろうが、取りあえず動かすだければ直ぐにできる。)

まず、iSCSIターゲットのパッケージをインストールする。

# apt-get install iscsitarget

次にiSCSIでサービスするターゲットを設定する。

# vi /etc/ietd.conf
Target iqn.2010-06.localnet:iscsiboot
        Lun 0 Path=/dev/sdc,Type=fileio

参考:http://www.etherboot.org/wiki/sanboot/iscsi_via_linux
参考ページではXPのHDDをiSCSIサーバ上のファイルとしてコピーしたので“Path”がそのイメージ・ファイル名になっている。それもで勿論OK。今回の実験ではXPの仮想マシンから、Linux仮想マシンへ仮想ディスク“つなぎ替えた”だけなので“/dev/sdc”というブロックファイルになっている。Pathがブロックファイルの場合は、Typeはfileioでもblockioでも構わない。

次にiSCSIターゲットのデーモンが起動するように設定する。

# vi /etc/default/iscsitarget
ISCSITARGET_ENABLE=true

最後にデーモンを手動で起動するかリブートすればOK。

# /etc/init.d/iscsitarget restart

(何故かstart iscsitarget、initctl start iscsitargetではNG。iscsitargetはUpstart対応になっていないらしい。)

PXEサーバの設定

PXEとはDHCPとTFTPを組み合わせて実現している仕組み(詳しくはここ)。つまり、DHCPサーバとTFTPサーバの設定を行う。

まず、混乱しないように、ここでは2つの意味でPXEサーバの設定を行うことに注意する。以下、その説明。
ディスクレス・クライアントがiSCSIを使ってネットワークブートするためには通常のPXEではNGでgPXEを使う。そして、ディスクレス・クライアントにgPXEを実行させる方法は幾つかある。フロッピーやUSBメモリからブートする方法が一般的のようだが。ここではiSCSIを使って“ネットワーク”ブートをしようとしているわけだから、ネットワークに繋がれているのが前提となる。それであれば、PXEを使ってgPXEをダウンロード&実行させるのが自然である。ということで、ここでは(1)PXEを使ってgPXEをダウンロードするための設定と、(2)gPXEを使ってiSCSIの情報を得るための設定を行う。

まずは、PXEを使ってgPXEブートが出来るようにTFTPサーバを設定する。といっても、ファイルをTFTPサーバに置くだけ。次のページから“PXE bootstrap loader keep [Keep PXE stack method 1](.kpxe)”をメニュー選択しダウンロードする(ファイル名“gpxe-1.0.0-gpxe.kpxe”)。
参考:http://rom-o-matic.net/gpxe/gpxe-1.0.0/contrib/rom-o-matic/
ダウンロードしたgpxe-1.0.0-gpxe.kpxeを /tftpboot/gPXE/ というディレクトリを作って、その下に置いておく。

次に、DHCPサーバの設定。ディスクレス・クライアントからブートの要求に対して、(1)PXEからの要求によりgPXEをダウンロードする情報を与える、(2)gPXEからの要求によりiSCSIサーバのターゲットディスクを教えてあげるようにDHCPサーバを設定する。/etc/dhcp3/dhcpd.confに次のようなディスクレスサーバのエントリを追加する。(使用しているDHCPサーバによって設定するファイルが異なったり、DHCP環境により内容が若干ことなってくるので自分の環境に合わせて設定する。)

option space gpxe;
option gpxe-encap-opts code 175 = encapsulate gpxe;
option gpxe.keep-san code 8 = unsigned integer 8;

host n125 {
	hardware ethernet       00:12:34:56:78:9a;
	fixed-address           n125;
	option host-name        "n125";

	if exists user-class and option user-class = "gPXE" {
		filename "";
		option root-path "iscsi:is-server::::iqn.2010-06.localnet:iscsiboot";
		option gpxe.keep-san 1;
		option gpxe.no-pxedhcp 1;
	} else {
		filename "/gPXE/gpxe-1.0.0-gpxe.kpxe";
	}

}

参考:http://www.etherboot.org/wiki/pxechaining#setting_up_pxe_chainloading
ここで、ディスクレスクライアントからの要求に対して、1回目の要求と2回目の要求で返す情報がことなるのでif文を使って切り替えている。(これを最初に書いた人に拍手。)

なお、今回の実験環境では、n125というのがディスクレスのホスト名である。この環境はではDNSを使ってアドレス解決が出来るようになっているので、192.168.1.125のような表記は使わずにホスト名を使っている。同様にis-serverというのがiSCSIターゲットのホスト名である。もし、名前解決ができない環境であればIPアドレスを直打ちする。

以上の設定が終わったらDHCPサーバデーモンを再起動する。

# /etc/init.d/dhcp3-server restart

ディスクレス・クライアントの設定

ディスクレス・クライアントの設定と言ってもBIOSの設定でPXEブートできるようにしておくだけある。もし、古いPCなどでPXEブート出来ない場合は次のページを参考にしてフロッピーやUSBメモリを使ってgPXEをブートすればいい。(2つ目の参考ページからバイナリのイメージを入手できる。)
参考:http://www.etherboot.org/wiki/removable
参考:http://rom-o-matic.net/gpxe/gpxe-1.0.0/contrib/rom-o-matic/
なお、フロッピーやUSBからgPXEをブートする場合でも、上に書いたDHCPサーバのエントリはそのままでOK。

【参考:2010/06/23】
VMware仮想マシンBIOSにgPXE対応のEtherboot ROMを組み込むという方法もある。そうすると仮想マシンを立ち上げて即、gPXEが動きだす。詳しくはここ

以上の設定だけで、いとも簡単にXPがネットワークブートできる。
Windows 7iSCSIのイニシエータ機能が最初から入っているので、更に簡単に出来る筈、なのだが、ちょっと手間取っている。うまく出来たらまたメモって置く(予定)。

【追記:2010/08/01】
時間が出来たのでWindows7iSCSIインストールに再挑戦したら、なんと何事もなかったように成功した。何が違ったのか全く見当もつかない。殆ど以前の環境をつかったのに。詳しくは“Windows 7をディスクレスで使う”を参照。