朝に先生と話をして、 学生用 PC と 計算クラスタのマシンは PXE の diskless boot にしたい、 という話を思い出したので、 技術修得も兼ねて ちょっと実験してみた。もちろん逃避だ。
diskless 用に /dl/ ディレクトリを用意。 tftpboot として /dl/tftpboot/ を用意。
tftp を /dl/tftpboot を root として有効化。 当然研究室外からのアクセスはフィルタで閉じてある。 /usr/ports/isc-dhcp3-server をインストール。
まずは memtest86 が pxe で動くように設定してみた。 pxelinux.bin と memtest86-3.0 を JED から貰ってきて、 /dl/tftpboot に置く。 /dl/tftpboot/pxelinux.cfg/ に クライアントの IP アドレス毎のコンフィグファイルを置く。 こんな感じ。IP アドレスは 16進数表記ね。
server# pwd /dl/tftpboot server# ls -F memtest86-3.0 pxeboot* pxelinux.bin pxelinux.cfg/ server# ls -F pxelinux.cfg/ 00README C0A80107@ jed memtest86 server# ls -l pxelinux.cfg/C0A80107 lrwxr-xr-x 1 root wheel 9 Feb 17 15:46 pxelinux.cfg/C0A80107 -> memtest86 server# cat pxelinux.cfg/memtest86 DEFAULT memtest86-3.0 server#
で、dhcpd.conf はこんな感じ。
option domain-name "example.com";
option domain-name-servers 192.168.1.7;
shared-network "EXAMPLE-NET" {
subnet 192.168.1.0 netmask 255.255.255.0 {
option routers 192.168.1.7;
ddns-updates off;
host leaf5.example.com {
filename "/pxelinux.bin";
allow bootp;
hardware ethernet 00:xx:xx:xx:xx:xx;
fixed-address 192.168.1.41;
}
}
クライアント側を netboot するように設定。 PnP/BEV Boot というのを disable する必要があった。 マザーが network boot 対応じゃなかったからか?
Boot Protocol: PXE
PnP/BEV Boot: Disable
Default Boot: Network
Local Boot: Disable
Prompt Time: 2
Setup Message: Enable
Power Mgmt: ACPI
これでうまくいったのに気を良くして、 FreeBSD もやってみる。 簡単のため、サーバの /, /usr, /var を全部コピー。
# mkdir /dl/FreeBSD49 # cd /dl/FreeBSD49 # (cd /; tar clf - . ) | tar xpBf - # (cd /; tar clf - usr ) | tar xpBf - # (cd /; tar clf - var ) | tar xpBf -
/dl/FreeBSD49/etc/fstab を作成。
server# cat /dl/FreeBSD49/etc/fstab 192.168.1.9:/dl/FreeBSD49 / nfs ro 0 0 proc proc procfs rw 0 0
/dl/FreeBSD/etc/rc.conf から defaultrouter, ifconfig_xxx, hostname を抜く。 root_rw_mount="NO" を追加。
kernel の config として、以下のものを追加した kernel を作り、
options BOOTP # Use BOOTP to obtain IP address/hostname options BOOTP_NFSROOT # NFS mount root filesystem using BOOTP info options BOOTP_NFSV3 # Use NFS v3 to NFS mount root options BOOTP_COMPAT # Workaround for broken bootp daemons.
インストール
server# env DESTDIR=/dl/FreeBSD49 make install
boot loader には FreeBSD 標準の pxeboot を使うので、 /boot/pxeboot を /dl/tftpboot/ にコピー。
dhcpd.conf はこんな感じ。共通部分は省略。
# for FreeBSD
host leaf5.example.com {
filename "pxeboot";
server-name "server";
server-identifier 192.168.1.9;
option root-path "192.168.1.9:/dl/FreeBSD49";
allow bootp;
hardware ethernet 00:xx:xx:xx:xx:xx;
fixed-address 192.168.1.41;
option host-name "leaf5.example.com";
}
NetBSD の場合、root-path に server 名 (IPアドレス) は 含めないが、 FreeBSD の pxeboot の場合には含めるので、注意。 NetBSD の話を読んだ直後だったので、引っかかってしまった。
もちろん、NFS export しておく。
server# cat /etc/exports /dl -alldirs -maproot=0:0 -ro -network 192.168.1.0 -mask 255.255.255.0 /var -maproot=0:0 -ro -network 192.168.1.0 -mask 255.255.255.0 server#
これで boot すると、なんとなく起動する。 rc.diskless2 に任せると /var の内容が /etc/mtree/BSD.var.dist に記述されたインストール時のものになってしまい、 手で /var/spool/lpd の下に掘っていた プリンタのスプールディレクトリが無くなってしまった。 この辺を手で弄ると面倒なので、rc.diskless1 で提供されている diskless_remount 機能を使った。 /conf の base 以下に $dir/diskless_remount というファイルがあると、 その $dir を mfs マウントし、diskless_remountファイル内の ディレクトリの内容をコピーしてくれる。
server# pwd /dl/FreeBSD49 server# cat conf/base/var/diskless_remount 192.168.1.9:/var server#
これでざっと弄った限りは幸せなクライアントPCのできあがり。 IP address と hostname は DHCP で貰ったものを使うので、 DHCP のエントリさえ書けば、何台でもサービス可能。 あ、ホームディレクトリは amd で NFS マウントしている。
ただ、ユーザランドは update も含めて面倒。 サーバの /usr は必要最低限のものしか入れないし、 なかなか弄れないので、一台普通のクライアントマシンを作って、 そいつの /usr 以下をマウントするというのが良さそう。 その場合、不用意に local の rc が走らないように、 local_startup なんかに工夫がいるかも。
参考文献:
http://www.starbed.org/netboot/pxeboot_freebsd-j.html
: starbed で使っているらしい
ファイルシステムイメージファイルを作ってしまう方法の解説、boot 時の絵など素晴らしい。
http://www15.big.or.jp/~yamamori/sun/pxe/
: 雑誌に掲載されたものの再掲のようだが、広くまとまっている。
初めてつつく人向けにはちょっと言葉足らずかも。
/usr/share/examples/diskless/clone_root :
diskless 用に root ファイルシステムのコピーを作るスクリプトだが、
細かい解説も載っている
/etc/rc.diskless[12] :
may the sorce be with you。実は書かれている解説も詳しい。
残念ながら、
日本語の FreeBSD handbook は日本語で嬉しいが、
diskless boot に関しては内容が古すぎるので見てはいけない。
英語版は良さそう。
ハンドブックの表書きは
日本語版と
英語版で一緒だが、内容は全然違うので注意。
楽しかったが、そろそろ TODO 消化しないとまずそう。 一応、Linux もやる方針。