したがって、最終目標はPCとPC-98x1で出来るだけディスクを共有する ディスクレスクライアントを作ることです。
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.を書いておきます。 またフロッピーから起動した時、userconfigの情報は覚えてくれない (NFSマウントしたrootディレクトリに情報を書いてくれても起動時には読めない) ので、I/Oアドレスなどは使用するデバイスに合わせておきます。 カーネルが出来たらkzipで圧縮しておきます。
kzip kernelフロッピーへの書き込みは次のようにして行ないました。
disklabel -w -r fd0 fd1440 disklabel -B -b /usr/mdec/fdboot fd0 newfs /dev/rfd0c mount /dev/fd0c /mnt cp kernel.kz /mnt/kernel umount /mntコピー時に名前を変えているのは、bootが見るのが kernel であるためです。 同じカーネル(kzipしていないもの)をNFSサーバに用意するrootディレクトリに コピーしておきます。フロッピーのkernelと、rootディレクトリのものが 一致していないと、ps -aux, dmesgなどが使えなくなるので注意が必要です。
oliv:\ :ht=ether:\ :ha=000006001b1a:\ :sm=255.255.255.0:\ :hn:\ :ds=10.93.63.2:\ :ip=10.93.63.97:\ :gw=10.93.63.2:\ :rp="10.93.63.51:/disk2/diskless/oliv-root":\ :vm=rfc1048:といったように書きます。各フィールドの意味は書きませんが、 root partitionのフィールドにはNFSマウントのため`:'が含まれています。 これがフィールドの区切りと重なるので、" "で囲んでいます。
mkdir /swap dd if=/dev/zero of=swapfile bs=1k count=16000 chmod 600 swapfile vnconfig -e /dev/vn0c /swap/swapfile swapon /dev/vn0cと追加してみると、だいぶ速くなりました。/etc/rc.confに追加しておきます (あとで、この部分は変えました)。
swapfile="/swap/swapfile"同様にして、 Pentium 133MHz + 64MB + PCI NE2000コンパチで、SWAP 32MBにすると、 結構使えます。
/ディレクトリについては、/etc/fstabを見ない(再マウントしない)ようです。
ところで、試している時に間違って rootディレクトリ2.2.8, usrディレクトリ3.1に してしまったのですが(一見)問題なく動いていました。2.2.8でもELFをサポート しているというのは、こういうことだったのかと思ってしまいました。
/のうち共有できないのは、 /etc, /tmp, /var です。
/varのうち共有できるディレクトリは、 /var/db/pkg です。
ディスクレスクライアント間でほぼ同じ設定で動かすことを考えます。 /etcのうち問題になりそうなのは、 rc.conf, fstab, XF86Config です。fstabは、/は再マウントされないようなので、共有したくない /varが問題です。
rc.confはhostname, ifconfigが問題になりますが、hostnameは BOOTPで設定されているので、rc.confを見ないようです。 ifconfigは、rc.confで記述しないのが一つの手です。2つ目のインターフェース がある場合には問題になります。 keyboardの配列やマウスの接続先も問題になりそうです。 そこで、rc.confの最後に、
if [ "`hostname -s`" ] ; then if [ -f "/etc/rc.conf.`hostname -s`" ]; then . /etc/rc.conf.`hostname -s` fi fiを追加して、/etc/rc.conf.hostnameを使えるようにしました。これで rc.confは共通の設定(ディスクのついているサーバ用)、 ディスクレスクライアント1用の設定は rc.conf.client1 で上書きと することが出来ます。
NFS上のswapは元々の/etc/rcの順序(NFS mountする前にswaponする)では、 /varにおけません。そこで、/etc/rcに
--- rc.ORG Tue Oct 21 23:21:08 1997 +++ rc Mon Mar 22 17:43:14 1999 @@ -122,7 +122,16 @@ network_pass1 fi +mount 10.93.63.51:/disk2/diskless/`hostname -s`-var /var +mount 10.93.63.51:/disk2/diskless/`hostname -s`-tmp /tmp + mount -a -t nfs + +# Add additional swapfile, if configured. +if [ "x$nfsswapfile" != "xNO" -a -w "$nfsswapfile" -a -b /dev/vn0b ]; then + echo "Adding $nfsswapfile as additional swap." + vnconfig /dev/vn0b $nfsswapfile && swapon /dev/vn0b +fi # Whack the pty perms back into shape. chmod 666 /dev/tty[pqrsPQRS]*という変更を加えました(ディスクのついたマシンのことは考えていません)。 これで、/varに swapファイルを置くことが出来ます。 NFS上のswapファイルの位置は、nfsswapfileに書くことにしています。
XF86Configは、/etc/XF86Configではなく、 /usr/X11R6/lib/X11/XF86Config.hostname にすればマシン毎に分けられます。
/usrのうち共有できないのは、/usr/X11R6/bin/X, /usr/local/etc/rc.d です。どちらも、すべてのクライアントで同一とする(できる)なら そのままで大丈夫です。
/boot /kernel, /dev/MAKEDEV(/dev), /etc/mtree, /etc/make.conf, /etc/disktab, /lkm(msdos_mod.o, blank_saver_mod.o, fade_saver_mod.o, green_saver_mod.o, snake_saver_mod.o, star_saver_mod.o) /modules /sbin/fdiskここまでは、/ パーティションです。/ はi386, pc98で共有しないことにします。 /usr の下は、
/usr/bin/(col, more, talk) /usr/sbin/(config, fdformat, pnpinfo, tzsetup, vidcontrol) /usr/include/libdisk.h /usr/share/misc/more.help /usr/mdec/ /usr/lib/(kztail.o, kzhead.o, libdisk.a)とXのサーバです(3.3R では /usr/sbin/config は共通, /usr/mdec も共通 ?, /usr/lib/kztail.o kzhead.o はなし)。 ソースについても98用の追加変更がありますが、 基本的には #ifdef で括られているはずなのと、 /usr/src98/sys などをつくればよいので、とりあえず考えません。
col, more, talkは8ビット透過になっているだけのはずなので 入れ換えてしまってもいいはずですが、 /usr/bin, /usr/sbin はwrapperをつくることにします。/usr/bin/pc98, /usr/bin/i386にバイナリを入れ、アーキテクチャによってよびだすものを 変えるスクリプトを用意します。 /usr/sbinも同様にします。/usr/bin用は、このようにしました。
#!/bin/sh BASENAME=`basename "$0"` BASEDIR=/usr/bin SYSCTL=/sbin/sysctl if [ "`sysctl -n hw.machine`" = "pc-98" ]; then exec $BASEDIR/pc98/$BASENAME $@ else exec $BASEDIR/i386/$BASENAME $@ fi
/usr/share/misc/more.help は実は同じもの(2.2.8では)なので問題ありません。 /usr/include/libdisk.h は、#ifdef で括られているので 98bin に 含まれているものに入れ換えてしまいます。
/usr/mdecは、98用のバイナリを入れたディレクトリを上からmountします。
kztail.o, kzhead.oは、kzipに必要です(kzhead.oは同じようです)。 libdisk.aは関係するものを コンパイルしなければいいはずです。/usr/libは結構大きいので できれば共有したいところです。
/usr/share/{98readme, FAQ.98, handbook.98}もコピーしておくと便利です。