17 Feb. 2004


公務員としての私

diskless boot

朝に先生と話をして、 学生用 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 もやる方針。




Copyright(C)2004 Takamichi Tateoka (tate@tateoka.org)