LinuxのPXEでDOSをネットワークブートする

PXE(ピクシー)でLinuxのブートやディスクレスの実現は問題なく出来るようになった(「PXEによるディスクレス・クライアント(総集編)」参照)が、凝り性なので色々と試したくなる。次に考えるのはDOSとかWindowsPXEでブートできないか、と思ってしまう。勿論、LinuxPXEサーバを使ってだ。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、DHCPPXEが既にインストールされていることを前提とする。これらの設定については「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に登録する

PXEBNPとして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]#