Hatena::ブログ(Diary)

adsaria mood このページをアンテナに追加 RSSフィード

2008-01-31 PXEブートの応用

PXEサーバが1台あると便利

ネットワークの中の1台(Linuxマシン)にPXEサーバインストールしておくとイザという時に便利だ。*1 例えば、ネットワークブートを利用して

  • マシンの調子が悪くてメモリテストなどをしたい場合
  • HDDから起動しなくなって診断用にLinuxをブートしたい場合
  • 一時的にOSを変えて使いたい場合
  • CD/DVDドライブの無いマシンにLinuxインストールした場合

などなどである。

syslinuxというパッケージにはPXEブートで使える色々と便利な起動用ソフトウェアがあるので、それを使えばメニュー形式で、ブートするソフトウェアも選択できる。

(PXEのインストールに関しては「PXEによるディスクレス・クライアント(総集編)」や「PXEサーバの設定」を参照のこと。「総集編」の方が後に書いたので、まとまっていると思うが、PXEサーバインストールというよりはディスレスサーバインストールについて書いてある。)

PXEでメニューを表示する。

PXEをインストールするときにに導入するsyslinuxには色々と面白い起動用ソフトがある。これらを利用するためには先ずはsyslinuxパッケージを導入する。

[root@vmserver ~]# yum install syslinux

LinuxFedora)にPXEサーバインストールするには2つの方法がある。

  1. PXEサーバとしてインストールする
  2. ディスクレスクライアントのためのサーバとしてインストールする

1の方法でPXEサーバを実現する際にはsyslinuxのパッケージは既に導入している筈である。2の方法ではsystem-config-netbootというパッケージを導入する時点でPXEサーバインストールされる。しかし、この場合はsyslinuxのパッケージは導入されないので、PXEでメニューを使いたい場合には別途syslinuxを導入する必要がある。

パッケージを導入したらsyslinuxのファイル群を確認する。

[root@vmserver ~]# ls /usr/lib/syslinux
chain.c32      ethersel.c32        mbr.bin      pxelinux.0    syslinux-nomtools
com32          isolinux.bin        memdisk      sys2ansi.pl   vesamenu.c32
copybs.com     isolinux-debug.bin  menu.c32     syslinux
cpuidtest.c32  keytab-lilo.pl      mkdiskimage  syslinux.com
dmitest.c32    mboot.c32           pcitest.c32  syslinux.exe

このディレクトリの中にはPXEのNBP(ネットワークブートプログラム)である"pxelinux.0"も含まれている。このディレクトリの中にある"menu.c32"がキャラクタベースのメニュー選択を実現するソフトウェアで、"vesamenu.c32"はVESA規格のグラフィックスを使ったメニュを実現するソフトウェアだ。

メニューを出してみる

キャラクタベースのメニューで十分なのでmenu.c32を使う。まず、PXEブートのルートディレクトリ(/tftpboot/linux-install/)の下に"syslinux"というディレクトリを作り、そこへmenu.c32をにコピーする。尚、PXEブートの環境は既に構築されていることを前提として話を進めるので、PXEブートの基本的な環境については「PXEによるディスクレス・クライアント(総集編)」を参照のこと。

[root@vmserver ~]# mkdir /tftpboot/linux-install/syslinux/
[root@vmserver ~]# ls -F /tftpboot/linux-install/
Fedora-8-Diskless/  msgs/  pxelinux.0  pxelinux.cfg/  syslinux/
[root@vmserver ~]# cp /usr/lib/syslinux/menu.c32 /tftpboot/linux-install/syslinux/
[root@vmserver ~]# ls /tftpboot/linux-install/syslinux/
menu.c32

ここでPXEブートのルートディレクトリ"/tftpboot/linux-install/"の下のディレクトリやファイルについて簡単に説明しておく。"Fedora-8-Diskless"というディレクトリにはディスクレスクライアントを起動するためのLinuxカーネル(vmlinuz)とRAMイメージ(initrd.img)が入っている。"msgs"ディレクトリには各種メッセージが入っているが今回は使わない。"pxelinux.0"はPXEのブートローダ(NBP)である。

"pxelinux.cfg"ディレクトリにはPXEを利用してブートする際の設定ファイルが入っている。

[root@vmserver ~]# cd /tftpboot/linux-install/pxelinux.cfg/
[root@vmserver pxelinux.cfg]# ls
C0A80064  default  pxeos.xml

"C0A80064"はIPアドレス192.168.0.100を16進表示したファイル名で、IPアドレス192.168.0.100のマシンをPXEブートする時の設定が記述されている。現在の内容は次のようになっている。

[root@vmserver pxelinux.cfg]# cat C0A80064
default Fedora-8-Diskless

label Fedora-8-Diskless
    kernel Fedora-8-Diskless/vmlinuz
    append  initrd=Fedora-8-Diskless/initrd.img root=/dev/ram0 init=disklessrc NFSROOT=192.168.0.1:/tftpboot/f8 ramdisk_size=20920 ETHERNET=eth0 SNAPSHOT=

これで、自動的に/tftpboot/linux-install/Fedora-8-Disklessの下にあるvmlinuzをカーネルとしてブートすることを指定している。今回はこのファイルを次のように変更する。

[root@vmserver pxelinux.cfg]# cat C0A80064
default syslinux/menu.c32

label Fedora-8-Diskless
    kernel Fedora-8-Diskless/vmlinuz
    append  initrd=Fedora-8-Diskless/initrd.img root=/dev/ram0 init=disklessrc NFSROOT=192.168.0.1:/tftpboot/f8 ramdisk_size=20920 ETHERNET=eth0 SNAPSHOT=

1行目の"default Fedora-8-Diskless"を"default syslinux/menu.c32"に変更する。つまりPXEブートのルートパス(この場合は、/tftboot/linux-install/)にあるsyslinux/menu.c32を指定している。(".c32"を省略して単に"syslinux/menu"だけでもOK。)

さて、この設定でクライアントをPXEブートしてみると、直ぐに次のような画面が表れる。

f:id:adsaria:20080131222005p:image

キャラクタベースのメニューでどのブート設定を選ぶか可能になっているが、残念ながら今はメニューのエントリーには"Fedora-8-Diskless"だけがある。この状態でタブ(TAB)を押すと"Fedora-8-Diskless"についてのブートのパラメータを変更できる。

f:id:adsaria:20080131222651p:image

メニューで起動するプログラムを選択する

メニューのエントリーが1つでは面白くないので次のような構成にする。

まず、Fedora 8のインストール用のLinuxカーネルやメモリテスト用のソフトウェアをPXEブートのルートバス/tftpboot/linux-installへコピーする。インストールカーネルFedora 8のインストールDVDの中の"images/pxeboot/"というディレクトリの下にある。ここにあるカーネルとRAMイメージをFedora-8-Installというディレクトリへコピーする。

[root@vmserver ~]# mkdir /tftpboot/linux-install/Fedora-8-Install
[root@vmserver ~]# ls -F /media/Fedora\ 8\ x86_64\ DVD/images/pxeboot/
initrd.img  README  TRANS.TBL  vmlinuz
[root@vmserver ~]# cp /media/Fedora\ 8\ x86_64\ DVD/images/pxeboot/[iv]* /tftpboot/linux-install/Fedora-8-Install/
[root@vmserver ~]# ls -F /tftpboot/linux-install/Fedora-8-Install/
initrd.img  vmlinuz

次にメモリテスト用のソフトウェアFedora 8のLiveCDの"isolinux/"というディレクトリに入っている。LiveCDの"isolinux/memtest"というソフトウェアをコピーして来る。(新しいサブディレクトリを作ってもいいが、ディレクトリの数が増えるので、Fedora-8-Installへコピーする。)

[root@vmserver ~]# cp /media/Fedora-8-Live-x86_64/isolinux/memtest /tftpboot/linux-install/Fedora-8-Install/
[root@vmserver ~]# ls -F /tftpboot/linux-install/Fedora-8-Install/
initrd.img  memtest  vmlinuz

起動するソフトウェアが揃ったところで、PXEの設定ファイルを次のように変更する。

[root@vmserver ~]# cat /tftpboot/linux-install/pxelinux.cfg/C0A80064
default syslinux/menu.c32

label Fedora-8-Diskless
    kernel Fedora-8-Diskless/vmlinuz
    append  initrd=Fedora-8-Diskless/initrd.img root=/dev/ram0 init=disklessrc NFSROOT=192.168.0.1:/tftpboot/f8 ramdisk_size=20920 ETHERNET=eth0 SNAPSHOT=

label Fedora-8-Install
    kernel Fedora-8-Install/vmlinuz
    append  initrd=Fedora-8-Install/initrd.img devfs=nomount

label Memory Test
    kernel Fedora-8-Install/memtest

label local
    localboot 1

"label"の2番目がインストール用のLinuxカーネルを指定してブートする指定、3番目がメモリテスト用ソフトウェアを起動する指定、そして4番目の"local"がローカルHDDからOSをブートする指定となる。これでクライアントPCをPXEブートした画面が次である。

f:id:adsaria:20080131233827p:image

次の画面はこのメニューから"Memory Test"を選んで起動した画面である。

f:id:adsaria:20080131234156p:image

タイムアウトを設定する

コンフィグファイルでは"timeout"で一定時間後入力が無ければ指定したプログラムも起動できる。例えば、上の例にtimeoutを付け加えてみる。

[root@vmserver ~]# cat /tftpboot/linux-install/pxelinux.cfg/C0A80064
default syslinux/menu.c32
timeout 100
ontimeout Memory-Test

label Fedora-8-Diskless
    kernel Fedora-8-Diskless/vmlinuz
    append  initrd=Fedora-8-Diskless/initrd.img root=/dev/ram0 init=disklessrc NFSROOT=192.168.0.1:/tftpboot/f8 ramdisk_size=20920 ETHERNET=eth0 SNAPSHOT=

label Fedora-8-Install
    kernel Fedora-8-Install/vmlinuz
    append  initrd=Fedora-8-Install/initrd.img devfs=nomount

label Memory-Test
    kernel Fedora-8-Install/memtest

label local
    localboot 1

こうすると、10秒後(timeoutの引数は1/10秒単位)に"Memory-Test"を起動する。(ここで先の例と比べて"Memory Test"を"Memory-Test"に変えた。ブランクがあるとontimeoutの指定が上手く出来なかった。)

f:id:adsaria:20080201000655p:image

その他にも

/usr/lib/syslinuxにはCPUやボードをテストするプログラムもあるので必要に応じて使える。

副作用

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

*1:PXEです、PEXではありません。