Booting from network on NetBSD


NetBSDを利用する上で、netboot出来ると非常に便利です。OSのInstallにも、debugにも 利用でき、その上、いきなり電源を切ることも出来るわけです。
しかし、私の場合、マーフィーの法則かわかりませんが、うまくnetboot出来るようにな るのにかなり時間がかかりました。
ここでは、NetBSDをInstallしたマシンが少なくとも1台ある環境において、いかにして NetBSDをnetbootできるような環境を作るかを主眼にメモを残しておきます。
なお、この記事を見てnetbootに失敗しようと、Diskを壊そうと、その他一切の被害に関 する責任は取れません。At your own Riskでお願いします。



netbootの流れ

Netbootは、以下のような流れで行なわれます。

  1. netbootしたい機器(以下Client)からnetbootするためのparameterを要求する(arp)
  2. netboot用server(以下Server)からparameterを送る(rarpd, bootparamd, dhcpd)
  3. Clientからboot-loader配送要求が出る(tftp)
  4. Serverからboot-loaderを送りつける(tftp)
  5. Clientがkernel配送要求を送る(NFS)
  6. Serverがkernelを送りつける(NFS)
その後、Clientはkernelに従って、FilesystemをNFS mountしたりすることになります。


netboot対象マシン

ここでは、以下のarchitectureに関しての話をします。これは、手元で試せる機器が 以下のものだけだからです。

基本的にはどのarchitectureでも似たようなものだと思いますが、保障のかぎりではあ りません。


事前準備

事前に準備するべきものは以下の通りです。

このうち、DHCPとbootpは同一のportを使用するため、同時には動作しません。
DHCPで肩代りできるので、bootpではなくDHCPを利用する方法を覚えておいた方がいいか もしれません。
netbootするには、netboot serverが必要です。しかし、作業を見てもらえば判ると思い ますが、それなりにunsecureなserverを動作させる必要があるので、netboot serverは Internet Unreachableな環境に置くべきだと思います。
今回は、図のような環境でnetbootするようにしてみました。
Topology
なお、今回使用した機器は以下の通りです。
architecture Vendor Machine 備考
sun4m Sun Microsystems SparcStation20
alpha Digital Equipment Corporation AlphaStation255
macppc Apple Computer Machintosh G4 Cube Currently not tested
macppc Apple Computer Machintosh PowerBook G4 netboot-server, NetBSD-current

rpc関連の設定(Netboot Server)

bootparamdやNFSはrpcを使用します。つまり、netboot-server上でrpc関連の設定を 行なう必要があります。
rpc関連の設定は特に難しいことはなく、/etc/rc.confrpcbind=YES rpcbind_flag="-l"としておいて、 sh /etc/rc.d/rpcbind startとするだけです。
ついでに、/etc/ethersも設定しておきましょう。そのためには各 機器のMAC Addressも調べておきましょう。この辺りは、bootした 時に表示されたり、openfirmwareなどで調べれば判ります。
なお、判らない場合にむりやり調べる方法として、何も設定せずnetbootして、 tcpdumpetherealなどでbootpメッセージを送 る際のMAC Addressを記録する方法があります。 /etc/ethersの書き方は簡単です。

	MAC-ADDRESS IP-ADDRESS
      
と書くだけです。例えば、
	% cat /etc/ethers
	08:00:20:7c:41:7e 10.0.0.2
	00:00:F8:25:42:F1 10.0.0.3
	00:30:65:d6:01:96 10.0.0.4
      
のようになります。名前解決の問題があると面倒なので、netboot-server上で /etc/hostsの設定もしましょう。
	% cat /etc/hosts
	10.0.0.1	netboot-server
	10.0.0.2	ss20
	10.0.0.3	alpha
	10.0.0.4	g4cube
      
これでOKです。
ここまで出来たら、rarpdを立ちあげましょう。
	% su
	Password: ultrasecret
	# /usr/sbin/rarpd -l gm0
	#
      
なお、/etc/rc.confrarpd=YES rarpd_flag="gm0" としておけばboot時に自動的にrarpdが立ち上がります。gm0の部分は、ご自分の環境の Network Interfaceを指定して下さい。 これでOKです。

bootparamd関連の設定(Netboot Server)

bootparamdは/etc/bootparamsを参照します。

	sun	root=laysner-b:/export/sun/root \
		swap=laysner-b:/export/sun/swap \
		dump=laysner-b:/export/sun/swap
	alpha	root=laysner-b:/export/alpha/root \
		swap=laysner-b:/export/alpha/swap \
		dump=laysner-b:/export/alpha/swap
	g4cube	root=laysner-b:/export/macppc/root \
		swap=laysner-b:/export/macppc/swap \
		dump=laysner-b:/export/macppc/swap
      

上記を設定したら、bootparamdを動かしましょう。

	% su
	Password: ultrasecret
	# /usr/sbin/rpc.bootparamd
	#
      
これでOKです。

なお、/etc/rc.confbootparamd=YES bootparamd_flag="gm0" としておけばboot時に自動的にbootparamdが立ち上がります。gm0の部分は、ご自分の環境の Network Interfaceを指定して下さい。

bootpd関連の設定(Netboot Server)

次は bootpd に関する設定を行ないます。
bootpd は inetd から起動されます。その設定ファイルは、/etc/bootptab です。
まず、bootptabを設定しましょう。

	ss20:\
		:ha=0800207c417e:\
		:bf=sparc/boot.net:\
		:rp=/export/sparc:\
		:ip=10.0.0.2:\
		:sm=255.255.255.0:\
		:ht=ethernet
	alpha:\
		:ha=0000F82542F1:\
		:bf=Alpha/netboot:\
		:rp=/export/alpha:\
		:ip=10.0.0.3:\
		:sm=255.255.255.0:\
		:ht=ethernet
	g4cube:\
		:ha=003065d60196:\
		:bf=macppc/boot.net:\
		:rp=/export/macppc:\
		:ip=10.0.0.4:\
		:sm=255.255.255.0:\
		:ht=ethernet
      
要素を説明します。
keyword 意味
ha ハードウェアアドレス(MAC Address)
bf tftpで読み出すプログラム(Netboot用boot loader)
rp Mount point(NFS時のroot filesystem)
ip IP Address
sm サブネットマスク
ht ハードウェアタイプ(Ethernet)
以上を自分の環境に合わせて設定したならば、/etc/inetd.conf で bootpd を 設定しましょう。
defaultでは、
	#bootps		dgram	udp	wait	root	/usr/sbin/bootpd	bootpd
      
となっていますが、これを
	bootps		dgram	udp	wait	root	/usr/sbin/bootpd	bootpd
      
とします。その後、inetdを再起動して下さい。
	% su
	Password: UltraSecret
	# kill -HUP `cat /var/run/inetd.pid`
	# exit
	%
      

これで bootpd 関連の設定も終りました。

dhcp関連の設定(Netboot Server)

bootpd の代わりに dhcpd を利用する場合について記載します。 まだ試していないので、ミスがあるかも知れません。
NetBSDには標準でISC DHCPdがついているので、それを利用します。 また、基本的な設定はできるものとします。

	host ss20 {
		hardware ethernet 8:0:29:7c:41:7e;
		fixed-address 10.0.0.2;
		option host-name "ss20";
		filename "sparc/boot.net";
		option root-path "/export/sparc";
		option broadcast-address 255.255.255.0;
	}
	host alpha {
		hardware ethernet 0:0:f8:25:42:f1;
		fixed-address 10.0.0.3;
		option host-name "alpha";
		filename "alpha/netboot";
		option root-path "/export/alpha";
		option broadcast-address 255.255.255.0;
	}
	host g4cube {
		hardware ethernet 0:30:65:d6:01:96;
		fixed-address 10.0.0.4;
		option host-name "g4cube";
		filename "macppc/boot.net";
		option root-path "/export/macppc";
		option broadcast-address 255.255.255.0;
	}
      
その後、dhcpdを再起動します。
	% su
	Password: UltraSecret
	# kill -HUP `cat /var/run/dhcpd.pid`
	# exit
	%
      

tftp関連の設定(Netboot Server)

tftp関係の設定をしましょう。
Netbootにおいてtftpは、boot-loaderを送る役割を担います。
tftpで配送するためのboot-loaderを置くディレクトリを作成し、必要なファイルを置いて 下さい。今回は、/tftpboot以下に置く場合の例です。

	% su
	Password: UltraSecret
	# mkdir /tftpboot
	# mkdir /tftpboot/sparc
	# mkdir /tftpboot/alpha
	# mkdir /tftpboot/macppc
	# chmod -R 555 /tftpboot
	# cp netboot /tftpboot/alpha;chmod 444 /tftpboot/alpha/netboot
	# cp boot.net /tftpboot/sparc;chmod 444 /tftpboot/sparc/boot.net
	# cp ofwboot.elf /tftpboot/macppc;chmod 444 /tftpboot/macppc/ofwboot.elf
	# exit
	%
      
次に、inetd.confを書き換えて、tftpdが動作するようにします。
defaultでは、
	#tftp            dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s /tftpboot
      
となっていますが、これを
	tftp            dgram   udp     wait    root    /usr/libexec/tftpd      tftpd -l -s /tftpboot
      
と修正し、inetdを再起動して下さい。
	% su
	Password: UltraSecret
	# kill -HUP `cat /var/run/inetd.pid`
	# exit
	%
      
これでtftp関連の設定も終了です。

NFS関連の設定(Netboot Server)

最後にNFS関係の設定をしましょう。
NFSでfilesystemをmountできるようにするには、/etc/exportsを編集する必要があります。 以下にsampleを挙げておきます。

	/export		-network 10.0.0.0 -mask 255.255.255.0
      
その後、mountdとnfsdを立ち上げます。
	% su
	Password: UltraSecret
	# mountd
	# nfsd
	# exit
	%
      

boot時にNFSをenableするには、/etc/rc.conf

mountd=YES		mountd_flags=""		# NFS mount requests daemon
nfs_server=YES
      
としておけば良いでしょう。


Boot from network

最後に、各機器からnetbootをします。
今回は、基本的にInstall kernelを立ち上げることだけを考えます。Disklessでbootして 運用するのであれば、/export の下に各マシン毎のfilesystemを作成し、その上で、各マ シン用の設定を行なう必要がありますが、これに関しては割愛します。

まず、install用kernelを準備します。これは、 JNUG ftp serverなどに置かれてい るNetBSD distributionから持ってくると良いでしょう。
例えば、NetBSD-1.5.1のalpha用なら、
ftp://ftp.jp.netbsd.org/pub/NetBSD/NetBSD-1.5.1/sparc/installation/instkernel/netbsd.gz
を/export/alphaの下に置いて下さい。
NetBSD-1.5.1のsparc用なら、
ftp://ftp.jp.netbsd.org/pub/NetBSD/NetBSD-1.5.1/sparc/installation/netboot/rootfs.tgz
を/exports/sparcの下で展開して下さい。
NetBSD-1.5.1のmacppc用なら、
ftp://ftp.jp.netbsd.org/pub/NetBSD/NetBSD-1.5.1/sparc/installation/netbsd.ram.gz
を/exports/macppcの下に置いて下さい。

そうして、各マシンのBIOS/Openboot/OpenFirmwareから以下のようにbootして下さい。
ALPHA:
>>> set ewa0_protocols bootp
>>>boot -proto bootp ewa0
SPARC:
ok boot net boot.net
MACPPC:
> boot enet:0,ofwboot.elf enet0:netbsd.ram.gz

alphaやsparcなどは基本的にbootpでnetbootできますが、macppcはopenfirmwareの制約上 dhcpからしかnetbootできないようです。そのため、macppcではbootpdのかわりにdhcpdを 使用する必要があります。

Sparcでnetbootする場合、boot.netをMAC-Address.SUN4Mなどと変更する必要があるかもし れません。その場合、bootしたいマシンのMAC-Addressを調べ、lnして試して下さい。