FreeBSD-2.0.5 を diskless クライアントとして設定する。 [FreeBSD-2.1.0 も、まったく同じ設定で、diskless クライアントになりました] ※ FreeBSD-current/src/share/doc/handbook/diskless.sgml も参照 以下の設定例で用いているパラメータ diskless クライアント ホスト名 client IP アドレス 192.168.20.50 MAC アドレス 00:00:c0:53:1f:e5 スワップ NFS で用意する。サイズ 16384K バイト。 Ethernet I/F ed1 サーバー OS NEWS-OS 4.2R ホスト名 server IP アドレス 192.168.20.10 用意するディレクトリ /export/freebsd.2.0.5.i386/ … FreeBSD のバイナリ配布ツリー /export/client/freebsd.2.0.5/ … このクライアントのルート・ファイルシステム /export/client/swap.192.168.20.50 … このクライアントのスワップ その他の環境 subnet mask 255.255.255.192 (== 0xffffffc0) broadcast address 192.168.20.63 default router 192.168.20.1 name server 192.168.20.2 と 192.168.20.3 0. FreeBSD-2.0 以降の netboot 機構の概要 FreeBSD の netboot 機構は、下記のように動作する。 ・FreeBSD netboot FreeBSD の netboot は、MS-DOS 上のコマンドとして、ある いは Ethernet アダプタ上の ROM に焼かれて、以下のように 動作する。 1. bootp プロトコルを用いて、自 MAC アドレスから、 自 IP アドレスや netmask などを得る。 2. tftp で、コンフィグファイルを読む。 コンフィグファイルには、root デバイスや swap デバイスも設定 されている。 3. NFS で root デバイスにアクセスし、カーネルを読み込む。 4. メモリ上に bootinfo 構造体を作成し、ここに root や swap デ バイスなどの情報を作成してカーネルを起動する。 ・FreeBSD kernel netboot から渡された bootinfo 構造体を参照して、自 IP アドレス等の設定や、NFS サーバーへのアクセスを行う。 特別な config をしなくても、GENERIC カーネル自身に、 この仕組みが入っている。 (SunOS4 や NetBSD と異なり、FreeBSD の kernel には、 rarp, bootparam といった機構は入っていない。) 1. server の bootpd の設定 /etc/inetd.conf で以下の行が有効になっていることを確認する。 (これは NEWS-OS 4.2 の例であり、bootpd のパス名は OS によって 異なる。SunOS4 の場合、bootpd のソースを入手して make する 必要がある) ------------------------------ ここから ------------------------------ bootps dgram udp wait root /etc/bootpd bootpd ------------------------------ ここまで ------------------------------ また、/etc/services (あるいは NIS の services マップ)に下記の エントリーが登録されていることを確認する。 ------------------------------ ここから ------------------------------ bootps 67/udp bootp # bootp server bootpc 68/udp # bootp client ------------------------------ ここまで ------------------------------ inetd.conf あるいは services を変更したら # kill -1 を実行して、inetd に設定を反映させる。 /etc/bootptab に以下を記述する。 sm, ds, gw は、環境に合わせて適宜変更する。 ha は、ethernet アダプタの MAC アドレスを設定する。 (MAC アドレスは、netboot コマンドを実行すれば表示される。) ip は、クライアントの IP アドレスを設定する。 ------------------------------ ここから ------------------------------ # default setting # ht -- network type # hd -- boot file directory # sm -- subnet mask # ds -- domain name server(s) # gw -- gateway (default router) default-setting:ht=ethernet:hd=/tftpboot:sm=255.255.255.192:\ :ds=192.168.20.2 192.168.20.3:gw=192.168.20.1: # standard PC settings # hn -- Send client's hostname to client # vm -- Vendor magic cookie selector freebsd-ibmpc: tc=default-setting: hn:vm=rfc1048: # Host specific setting # ha -- ethernet address # ip -- IP address client:tc=freebsd-ibmpc:ha=0000c0531fe5:ip=192.168.20.50: ------------------------------ ここまで ------------------------------ bootptab を変更した時、bootpd が実行中であれば # kill -1 を実行して設定を反映させる。 (bootpd は、アイドル状態が長いと自動的に終了するので、実行中でなければ kill -1 は不要) 2. server の tftpd の設定 また、/etc/inetd.conf で以下の行が有効になっていることを確認する。 (これは NEWS-OS 4.2 の例であり、tftpd のパス名は OS によって異なる。) ------------------------------ ここから ------------------------------ tftp dgram udp wait root /etc/tftpd tftpd -s /tftpboot ------------------------------ ここまで ------------------------------ また、/etc/services (あるいは NIS の services マップ)に下記の エントリーが登録されていることを確認する。 ------------------------------ ここから ------------------------------ tftp 69/udp ------------------------------ ここまで ------------------------------ inetd.conf あるいは services を変更したら # kill -1 を実行して、inetd に設定を反映させる。 /tftpboot/cfg.XXX.YYY.ZZZ.WWW (XXX.YYY.ZZZ.WWW は、クライアントの IP アドレス。この例では /tftpboot/cfg.192.168.20.50)を作成して、 以下のように記述する。 # mkdir /tftpboot # ln -s . /tftpboot/tftpboot # vi /tftpboot/cfg.192.168.20.50 ------------------------------ ここから ------------------------------ rootfs 192.168.20.10:/export/client/freebsd.2.0.5 swapfs 192.168.20.10:/export/client swapsize 16384 hostname client.sra.co.jp ------------------------------ ここまで ------------------------------ 以下のようにして、tftpd が正しく設定されているかどうか確認する。 % cd /tmp % tftp server tftp> get /tftpboot/cfg.192.168.20.50 Received 147 bytes in 0.3 seconds tftp> quit % cat cfg.192.168.20.50 3. server 上でファイルを展開する 以下で利用しているコマンド gtar は、GNU tar コマンドのことである。 これは、デバイスファイルを展開するために必要となる。 server の OS も FreeBSD の場合には、単なる tar コマンドが既に GNU tar なので、gtar を tar と読み変える。 # cd /export # mkdir freebsd.2.0.5.i386 # cd freebsd.2.0.5.i386 # cat どこか/2.0.5-RELEASE/bin/bin.?? | gtar zpxf - 以下はクライアント毎に必要 # cd /export # mkdir client client/freebsd.2.0.5 # touch client/swap.192.168.20.50 # cd client/freebsd.2.0.5 # (cd ../../freebsd.2.0.5.i386; gtar cf - dev etc var root)| gtar pxf - # mkdir bin lkm mnt proc sbin tmp usr # chown root.wheel tmp # chmod 1777 tmp # ln ../../freebsd.2.0.5.i386/bin/* bin # ln ../../freebsd.2.0.5.i386/sbin/* sbin # ln ../../freebsd.2.0.5.i386/lkm/* lkm # ln ../../freebsd.2.0.5.i386/kernel.GENERIC kernel … シンボリックリンクではなく、ハードリンクにすること。 kernel は bindist 附属の GENERIC カーネルでよい。 /export/client/freebsd.2.0.5 にあるファイルを設定する。 # vi etc/fstab ------------------------------ ここから ------------------------------ server:/export/client/freebsd.2.0.5 / nfs rw server:/export/freebsd.2.0.5.i386/usr /usr nfs ro procfs /proc procfs rw ------------------------------ ここまで ------------------------------ # cp /etc/hosts etc/ # vi etc/sysconfig … 以下の行を編集する。 ------------------------------ ここから ------------------------------ hostname=cilent network_interfaces="ed1 lo0" ifconfig_ed1="inet client netmask 0xffffffc0 broadcast 192.168.20.63" nfs_client=YES ------------------------------ ここまで ------------------------------ 上の行の ed1 の部分は、適合する Ethernet アダプタの名称に変更する。 また、サブネットマスク、ブロードキャストアドレスもサイトの設定 に合わせる。 注: デフォールトの sysconfig では、 routedflags=-q となっているが、うまく動作しない。これは、/usr をマウント する前に、routed を起動しようとするからである。 (routed は、/usr/sbin にある。また、routed の起動は、 /etc/rc から呼び出された /etc/netstart で行なわれている) 対策としては、可能であれば、routed ではなく、defaultrouter の設定で済ますか、あるいは /etc/rc を編集し、 mount -a -t nonfs の行を、 mount -a と変更し、さらに mount -a -t nfs >/dev/null 2>&1 の行をコメントアウトすればよい。 (routed を /sbin にコピーするのは、routed が dynamic link されているため、うまくいかない) 変数 tcp_extensions および 変数 gateway の設定も、routed と同様な対策が必要になる。 4. server の NFS export 設定 (これは NEWS-OS 4 や SunOS4 の例であり、OS によって異なる。) /etc/exports に以下を設定する。 ------------------------------ ここから ------------------------------ /export/freebsd.2.0.5.i386/usr -ro,access=client /export/client -root=client,access=client ------------------------------ ここまで ------------------------------ # exportfs -va 5. client で MS-DOS を立ち上げ、netboot コマンド (nb3c509.com あるい は nb8390.com)を 実行する。 netboot コマンドのソースは、/usr/src/sys/i386/boot/netboot/に ある。(ftp://ftp.sra.co.jp/pub/os/FreeBSD/misc/netboot/ にバ イナリがある) MS-DOS は、config.sys をほとんど空にして立ち上げておくこと。 (EMM386 等が設定されていると、仮想 86 モードで実行されるため動作しない?) 参考文献: "Sun のネットワーク・ブート機構" Robert E.Gilligan UNIX Magazine 1989 年 2 月号 p.21 NetBSD-1.0:/usr/src/etc/etc.sun3/README Id: README,v 1.1.2.1 1994/07/26 19:40:00 cgd Exp author: Gordon Ross FreeBSD-current/src/share/doc/handbook/diskless.sgml (1995/05/01) Id: diskless.sgml,v 1.1.1.1 1995/04/28 16:19:59 jfieber Exp Thanks 記述内容について助言をいただいた、筒井 泉くん に感謝します。_o_ このドキュメントの内容に対するコメントは、曽田 哲之 までお願いします。