LinuxのPXEでDOSをネットワークブートする
PXE(ピクシー)でLinuxのブートやディスクレスの実現は問題なく出来るようになった(「PXEによるディスクレス・クライアント(総集編)」参照)が、凝り性なので色々と試したくなる。次に考えるのはDOSとかWindowsをPXEでブートできないか、と思ってしまう。勿論、LinuxのPXEサーバを使ってだ。PXEサーバが1台あると便利でも書いたがPXEサーバが一台あるといざということに何かと便利である。
Windowsがディスクレスで起動しても、まぁ、それ程嬉しいことはないかと思う。それであれば、贅肉を落としたLinuxをディスクレスで立ち上げてVMware Server Consoleなどを動かした方が気が利いている。しかし、ちょっとDOSを起動したいということはありそうだ。一番ありそうなのはフロッピーの無いノートなどで「Windowsが立ち上がらない!」場合だろう。PXEサーバに予め用意しておけばいつでも使える。
BpBatchが必要
PXE自身はクライアントからの要求に応じて、アドレス解決をしてローダを配ることしかしない。このローダ(NBP:Network Bootstrap Program)がLinuxのカーネルなどのOSの本体を読み出してきて立ち上げる。Linuxを立ち上げる場合のNBPは"pxelinux.0"だった。Windows(W2K/XP/2003など)は"startrom.n12"になる。このあたりMicrosoftのページに書いているので直ぐ見つかった。(「PXE のアーキテクチャ」または「リモート インストール サービスで使用されるテクノロジとコンポーネント」)
DOSのブートもstartrom.n12で出来るのかと思いやったみたが、結局、startrom.n12は"NTLDR"を2次ローダとして読み出し、起動するのでNT系のWindowsにしか使えないようだ。
調べていくとPXEを使ったDOSのブートには"BpBatch"というネットワーク・ローダが必要だと分かった。BpBatchというソフトはRemboという会社が作っていて、個人利用に関しては無償で配布していたようだ。しかし2年程前にIBMに買収されていた。(「Rembo is now a part of IBM」参照。RemboはネットワークでOSを配布する技術があり、Windows Vistaへの移行ツールの一環として買収したようだ。) またRembo自身もそれ以前から配布をやめていたようだが ftp://ftp.ufanet.ru/pub/remoteboot/bpb-exe.zip から未だにダウンロードできるようだ。これを解凍してLinux環境(PXEサーバ)へ持ってくる。
なお、ここから先の設定例はすでにTFTP、DHCP、PXEが既にインストールされていることを前提とする。これらの設定については「PXEによるディスクレス・クライアント(総集編)」を参照のこと。
展開すると次のようなファイルが生成される。
[root@server-01 tmp]# ls -l total 1956 -rw-r--r-- 1 root root 58659 2000-02-11 21:21 bpbatch.hlp -rw-r--r-- 1 root root 191812 2000-02-11 21:21 bpbatch.ovl -rw-r--r-- 1 root root 2183 2000-02-11 21:21 bpbatch.P -rw-r--r-- 1 root root 856 2000-02-11 21:21 INSTALL -rw-r--r-- 1 root root 3471 2000-02-11 21:21 LICENSE -rwxr-xr-x 1 root root 173607 2000-02-11 21:21 mrbatch -rw-r--r-- 1 root root 203190 2000-02-11 21:21 mrbatch.exe -rwxr-xr-x 1 root root 399536 2000-02-11 21:21 mrbatch.static -rwxr-xr-x 1 root root 208763 2000-02-11 21:21 mrzip -rw-r--r-- 1 root root 210416 2000-02-11 21:21 mrzip.exe -rwxr-xr-x 1 root root 429816 2000-02-11 21:21 mrzip.static -rw-r--r-- 1 root root 771 2000-02-11 21:21 readme -rw-r--r-- 1 root root 8631 2000-02-11 21:21 whatsnew
このうち bpbatch.* があれば取り合えず動作する。(が、一応、全てのファイルを/tftpboot/の下へコピーした。)
[root@server-01 tmp]# mkdir /tftpboot/bpbatch/ [root@server-01 bpbatch]# cp * /tftpboot/bpbatch/ [root@server-01 bpbatch]# cd /tftpboot/bpbatch/ [root@server-01 bpbatch]# ls bpbatch.hlp INSTALL mrbatch.exe mrzip.exe whatsnew bpbatch.ovl LICENSE mrbatch.static mrzip.static bpbatch.P mrbatch mrzip readme
"bpbatch.P"がNBPの本体になる。bpbatchはどの様な名前で起動されるかによって、使用するtftpサーバの種類を切替えられるように作られているらしい。
bpbatch | 通常のtftpサーバを使用する。(69番ポート) |
bpbatch.P | パケットサイズを大きく出来るtftpサーバで59番ポートを使用する。 |
bpbatch.B | パケットサイズを大きく出来るtftpサーバで69番ポートを使用する。 |
OSのブートなどで巨大なイメージファイルを転送する場合は"blksize"オプションでパケットサイズを大きく出来るtftpサーバを使うことあるそうだが、その場合には有効だろう。"Incom TFTPD"というtftpサーバはパケットサイズを変えられるらしい。通常のtftpサーバでは"blksize"オプションは使えないので拡張子の無いファイル名を使うことになる。そのためにシンボリックリンクを張っておく。
[root@server-01 bpbatch]# ln -s bpbatch.P bpbatch
[root@server-01 bpbatch]# ls
bpbatch bpbatch.P mrbatch mrzip readme
bpbatch.hlp INSTALL mrbatch.exe mrzip.exe whatsnew
bpbatch.ovl LICENSE mrbatch.static mrzip.static
dhcpd.confに登録する
PXEのBNPとしてbpbatchをダウンロードするように/etc/dhcpd.confを設定する。
[root@server-01 bpbatch]# cat -n /etc/dhcpd.conf 1 # 2 # DHCP Server Configuration file. 3 # see /usr/share/doc/dhcp*/dhcpd.conf.sample 4 # 5 ddns-update-style none; 6 ignore client-updates; use-host-decl-names on; # <- ■■■追加 (*) 7 option option-135 code 135 = text; 8 9 subnet 192.168.0.0 netmask 255.255.255.0 { 10 option routers server-01; 11 option broadcast-address 192.168.0.255; 12 13 option nis-domain "localdomain"; 14 option domain-name "localdomain"; 15 option domain-name-servers server-01, dnsserver-01; 16 17 option time-offset 32400; # Japan Standard Time 18 option ntp-servers ntp.nict.jp, ntp.jst.mfeed.ad.jp; 19 20 range 192.168.0.128 192.168.0.254; 21 } 22 23 host client-01 { 24 hardware ethernet 00:0C:29:EB:31:F6; 25 fixed-address client-01; 26 next-server server-01; 27 # filename "/linux-install/pxelinux.0"; 28 # filename "/pxeloader/startrom.n12"; 29 filename "/bpbatch/bpbatch"; 30 default-lease-time 1296000; # 2 weeks 31 max-lease-time 2592000; # 4 weeks 32 option option-135 "/bpbatch/bootscript"; 33 # option option-135 "-i"; 34 } 35 [root@server-01 bpbatch]#
基本的にはpxelinuxでLinuxのディスクレスクライアントに対するサービスの設定に手を加えた。(厳密にはディスクレスの設定の時に使ったものと若干異なっているものをベースとしている。)赤字が追加した部分となる。
- 29行目:NBPのファイル名を指定する。/tftpboot/bpbatch/bpbatch(先程作ったシンボリックリンク・ファイルで実体は"bpbatch.P")となるが、/tftpbootはTFTPのルートディレクトリなので/tftpboot/からのパス(/bpbatch/bpbatch)で現す。("/bpbatch/bpbatch"の最初のbpbatchはディレクトリ名、2番目のbpbatchはファイル名である。)ちなみに27行目でコメントアウトしているのはlinuxブート用のNBP。
- 32行目:NBPであるbpbatchに渡す引数をしてい指定している。135番オプションを使っているらしい。"/bpbatch/bootscript"はbpbatchに対するスクリプトファイルを指定している。bpbatchはTFTPでbootscript.bpbとう名前のファイルをダウンロードして、そこに書かれている記述の通りにコマンドを実行する。なお、拡張子の".bpb"はbpbatchが自動的に追加するので、dhcpd.confでは書いてはいけない。
- 33行目:コメントアウトしているが、これもbpbatchに渡す引数をしてい指定している。(32行目と交換して使う。)"-i"は対話モードでの実行を指定する。"-i"でbpbatchを起動するとプロンプトが出てコマンド入力待ち状態となる。
- 7行目:bpbatchの引数を表す135番オプションの定義。コード135番は文字列型であることを宣言している。
次にbpbatchに対するスクリプトファイルを作成する。
[root@server-01 bpbatch]# ls bootscript.bpb bpbatch.hlp bpbatch.P LICENSE mrbatch.exe mrzip mrzip.static whatsnew bpbatch bpbatch.ovl INSTALL mrbatch mrbatch.static mrzip.exe readme [root@server-01 bpbatch]# cat -n bootscript.bpb 1 set CacheNever="ON" 2 loadramdisk "/dos/Win98SE_J.flp" 3 floppyboot [root@server-01 bpbatch]#
- 1行目:setコマンドで変数CacheNeverをONにしている。bpbatchはデフォルトでHDDにファイルをキャッシュする。これはネットワークブートする毎に大きなファイルをダウンロードしてネットワークに負担をかけることを避けるためだ。この変数をONにすることでHDDにキャッシュしなくなる。なお、bpbatchがHDDにキャッシュするのはパーティションテーブルに登録されている最後のパーティションの終わりのシリンダから物理的に最後のシリンダまでの間で、どこのパーティションにも属していない領域が使われる。
- 2行目:ramdisk領域にダウンロードするイメージファイルを指定している。今回はWindows98SEで作成したブート・フロッピーのイメージファイルを/tftpboot/dos/Win98SE_J.flpとして、そのファイルを指定している。フロッピーなどのイメージファイルはbpbatchに付属している"MrZip"を使って作ることも出来るが、私の場合はLinuxのddコマンドで直接フロッピーから作った。
[root@server-01 bpbatch]# mkdir /tftpboot/dos/ [root@server-01 bpbatch]# dd if=/dev/floppy of=/tftpboot/dos/Win98SE_J.flp
- 3行目:ramdiskのフロッピーイメージを使ってブートする。
今回はDOSを立ち上げるの目的なのでbpbatchに関しては必要最小限しか使っていないが、結構と豊富なコマンドを持っていて色々な動作が可能だ。bpbatchについては「Linux Remote-Boot mini-HOWTO」に非常に詳しく書いてあるので参考になる。
これで準備が整ったのでDHCPサービスを再起動して設定は終わりとなる。
[root@server-01 bpbatch]# service dhcpd restart Shutting down dhcpd: [ OK ] Starting dhcpd: [ OK ] [root@server-01 bpbatch]#