無理やりPXEメニューに組み込む

ここまでの設定で、/etc/dhcpd.confを編集することでLinuxカーネルでもDOSでも起動出来るようになっている。上の例の

    27  #       filename                "/linux-install/pxelinux.0";
    28  #       filename                "/pxeloader/startrom.n12";
    29          filename                "/bpbatch/bpbatch";

を次のように変更すればLinuxをブートできる。

    27          filename                "/linux-install/pxelinux.0";
    28  #       filename                "/pxeloader/startrom.n12";
    29  #       filename                "/bpbatch/bpbatch";

(27行目のコメントを有効にして29行目をコメントアウトする。)
頻繁に使う機能ではないので、これでも良いのだが、出来ればLinuxをブートするかDOSをブートするかを指定できるようにしておきたくなった。(逆にたまにしか使わないので、いちいち設定を変えるのでは記憶を呼び起こさなければならないので大変だ。)

PEXでメニューを表示する」でもメモしたとおり、PXEにはメニューを使って起動するソフトウェアを選択することができる。この機能を使ってPXEクライアントを立ち上げると次のようなメニューを表示し、ソフトウェアを選択できるようになる:

この例では、

  • PXEクライアントをFedora 8のディスクレス・クライアントとして起動する
  • PXEクライアントをFedora 8のインストール用カーネルを使って起動する
  • PXEクライアントでメモリテスト用ソフトウェアを起動する
  • ローカルのHDDから起動する

を選択できるようになっている。これに

  • PXEクライアントをDOSモードで起動する

を加えてみたい。

なお、PXEのメニュー化の設定は既に完了しているという前提で話しを進める。(メニュー化については「PEXでメニューを表示する」を参照のこと。)

pxelinux.cfgのメニューを変更

/tftpboot/linux-install/pxelinux.cfg/の下にあるPXEクライアント用の設定ファイルを次のように変更する。(今回のクライアントのIPアドレスは192.168.0.128なのでファイル名は"C0A80080"となる。

[root@server-01 pxelinux.cfg]# cat -n C0A80080 
     1  default syslinux/menu.c32
     2  timeout 50
     3  ontimeout Fedora-8-Diskless
     4  #prompt 1
     5
     6  label Fedora-8-Diskless
     7      kernel Fedora-8-Diskless/vmlinuz
     8      append  initrd=Fedora-8-Diskless/initrd.img root=/dev/ram0 init=disklessrc NFSROOT=192.168.0.7:/tftpboot/f8 ramdisk_size=25137 ETHERNET=eth0 SNAPSHOT=client-01
     9
    10  label Fedora-8-Install
    11          kernel Fedora-8-Install/vmlinuz
    12          append  initrd=Fedora-8-Install/initrd.img devfs=nomount
    13
    14  label DOS_Win98SE
    15          kernel bpbatch.bs
    16
    17  label Memory-Test
    18          kernel Fedora-8-Install/memtest
    19
    20  label local
    21          localboot 1

今回赤字の部分を追加している(はてな記法のバグ?で「.bs」が赤くなってない)。なぜ、この様な内容になったのかを説明する。
まず、PXEのネットワーク・ローダー、NBPとなるのはpxelinux.0である。pxelinux.0の設定ファイルで"kernel"行が起動するソフトウェアを指定する箇所だが、基本的にはLinuxカーネル・フォーマットのソフトウェアとなる。しかし、「Manpage of SYSLINUX」の後半に書いてある"Comboot Images and other operating systems"を見るとLinuxカーネル以外のフォーマットでもブートできるとある。ファイルの拡張子で幾つかの種類を認識しているが、ブートできるのは次の種類になる。

拡張子 ブートイメージ
無し、または下記以外 Linux kernel image
CBT COMBOOT image (not runnable from DOS)
BSS Boot sector (DOS superblock will be patched in)
BS Boot sector
COM COMBOOT image (runnable from DOS)

bpbatchがこのどれかの形式あればpxelinux.0からブート出来る。(つまりNBPからNBPを呼び出す。) 色々試したところ、bpbatchは"Boot sector"として認識してブートできることが分かった。そこで、拡張子に".bs"をつけたシンボリックシンクを用意するこでブートできる。

[root@server-01 pxelinux.cfg]# cd /tftpboot/linux-install/
[root@server-01 linux-install]# ls
Fedora-8-Diskless  Fedora-8-Install  msgs  pxelinux.0  pxelinux.cfg  syslinux
[root@server-01 linux-install]# ln -s ../bpbatch/bpbatch.P bpbatch.bs
[root@server-01 linux-install]# ls -F
bpbatch.bs@         Fedora-8-Install/  pxelinux.0     syslinux/
Fedora-8-Diskless/  msgs/              pxelinux.cfg/
[root@server-01 linux-install]# 

ここでのポイントはpxelinuxを使ってブートしているので/tftpboot/linux-install/というディレクトリがベースのパスとなる。従って、bpbatch.bsも/tftpboot/linux-install/におく必要がある。あと、bpbatchは自分自身の拡張子を見て動作を変えるので".bs"が影響しないか心配だったが、ラッキーにも問題無かった。

pxelinux.ovl?

次に /tftpboot/linux-install/ の下にもう一つシンボリック・リンクを張っておく。

 [root@server-01 linux-install]# ls -F
 bpbatch.bs@         Fedora-8-Install/  pxelinux.0     syslinux/
 Fedora-8-Diskless/  msgs/              pxelinux.cfg/
 [root@server-01 linux-install]# ln -s ../bpbatch/bpbatch.ovl pxelinux.ovl
 [root@server-01 linux-install]# ls -l
 total 68
 lrwxrwxrwx 1 root root    20 2008-02-08 09:06 bpbatch.bs -> ../bpbatch/bpbatch.P
 drwxr-xr-x 2 root root  4096 2008-02-06 23:28 Fedora-8-Diskless
 drwxr-xr-x 2 root root  4096 2008-02-08 08:17 Fedora-8-Install
 drwxr-xr-x 2 root root  4096 2008-02-06 10:26 msgs
 -rw-r--r-- 1 root root 13100 2005-12-20 10:03 pxelinux.0
 drwxr-xr-x 2 root root  4096 2008-02-08 09:47 pxelinux.cfg
 lrwxrwxrwx 1 root root    22 2008-02-08 09:53 pxelinux.ovl -> ../bpbatch/bpbatch.ovl
 drwxr-xr-x 2 root root  4096 2008-02-08 08:21 syslinux
 [root@server-01 linux-install]# 

bpbatchの基本的な動作として、先ずPXEで本体の"bpbatch"がロードされ起動するが、次に"bpbatch.ovl"というプログラムをロードしてくる。(これはPXEでロードできるプログラムサイズに制限があるためだと推測している。)ところが、"bpbatch.ovl"とう固定的なファイル名ではなく"自分のプログラム名.ovl"というソフトウェアをロードしようとする。ここで「自分のプログラム名」はDHCPで与えられるpxelinux.0となるらしい。従って、この場合はpxelinux.ovlというファイルをロードしようとする。そこでシンボリックリンクを利用して、pxelinux.ovlとしてbpbatch.ovlをロードするようにする。だいぶトリッキーだが、一応動作する。

なお、bpbatchに対する引数はpxelinux.cfgでは指定できないので/etc/dhcpd.confで設定する。

/etc/dhcpd.confの設定

基本的にはパラメータ"filename"としてbpbatchではなくpxelinuxを指定するだけで後の変更は必要ないが、念のため最終的な/etc/dhcpd.confを載せておく。

[root@server-01 linux-install]# cat /etc/dhcpd.conf
#
# DHCP Server Configuration file.
#   see /usr/share/doc/dhcp*/dhcpd.conf.sample  
#
ddns-update-style       none;
ignore                  client-updates;
use-host-decl-names     on;
option option-135       code 135 = text;

subnet 192.168.0.0 netmask 255.255.255.0 {
        option routers                  server-01;
        option broadcast-address        192.168.0.255;

        option nis-domain               "localdomain";
        option domain-name              "localdomain";
        option domain-name-servers      server-01, dnsserver-01;

        option time-offset              32400;  # Japan Standard Time
        option ntp-servers              ntp.nict.jp, ntp.jst.mfeed.ad.jp;

        range                           192.168.0.128 192.168.0.254;
}

host client-01 {
        hardware ethernet       00:0C:29:EB:31:F6;
        fixed-address           client-01;
        next-server             server-01;
        filename                "/linux-install/pxelinux.0";
#       filename                "/pxeloader/startrom.n12";
#       filename                "/bpbatch/bpbatch";
        default-lease-time      1296000; # 2 weeks
        max-lease-time          2592000; # 4 weeks
        option option-135       "/bpbatch/bootscript";
#       option option-135       "-i";
}

DHCPサービスを再起動してからPXEクライアントの電源を入れると次のような画面が現れる。

これで"DOS_Win98SE"を選択するとDOSモードで起動する。

副作用

手動で/ftfpboot/linux-install/pxelinux.cfg/C0A80080 といったファイルを修正するので、その後、system-config-netbootユーティリティを使って設定し直そうとすると警告メッセージが出て、ファイルの内容が元に戻ってしまう。従って、その後再度、これらのファイルを手動で設定する必要が出てくるのでバックアップをとって置いた方がいい。