無理やり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のメニュー化の設定は既に完了しているという前提で話しを進める。(メニュー化については「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ユーティリティを使って設定し直そうとすると警告メッセージが出て、ファイルの内容が元に戻ってしまう。従って、その後再度、これらのファイルを手動で設定する必要が出てくるのでバックアップをとって置いた方がいい。