ディスク無しの X サーバ: 一つのガイド

Jerry Kendall

    jerry@kcis.com
  

1996/12/28

FreeBSD-hackers メーリングリストの友人たちの助けによって、 わたしはディスクの無い X 端末を作ることができました。 X 端末の作成には、NFS によってマウントされた最小のユーティリティを持つ ディスク無しのシステムを作らなくてはなりませんでした。 同じ方法を使って 2 つの別々なディスク無しのシステムを作りました。 一つ目は altair.example.com です。 それは 340M のハードディスクが付いていますが、交換したくありませんでした。 そのため、そのマシンは antares.example.com からイーサネットを通じてブートするようになっています。 2 つ目のシステムは 486DX2-66 です。 わたしは全くローカルディスクのないディスク無しの FreeBSD を (完璧に) セットアップしました。 その場合のサーバは SunOS 4.1.3 が動いている Sun 670MP です。 セットアップの設定は両方に同じものが必要でした。

わたしはこの文書に加えなくてはならない内容がまだあると思っています。 どんなことでもご意見がありましたら送ってください。



1. ブートフロッピーを作る (ディスク無しのシステム上で)

ネットワークローダは TSR などの MS-DOS が使うものがあるとうまく働かないことがあるので、 最も良い方法は専用のブートフロッピーを作るか、 もしできれば、MS-DOS のメニューを作ってシステムが起動するときにどの設定を有効にするかを聞いてくるようにすることです。 (config.sys/autoexec.bat ファイルによって) 次に挙げるのはわたしが使っているもので、ちゃんと動作しているものです。 わたしの MS-DOS (6.x) メニューを下に載せます。

Example 1. config.sys

    [menu]
    menuitem=normal, normal
    menuitem=unix, unix
    [normal]
    ....
    normal config.sys stuff
    ...
    [unix]

Example 2. autoexec.bat

    @ECHO OFF
    goto %config%
    
    :normal
    ...
    normal autoexec.bat stuff
    ...
    goto end
    
    :unix
    cd \netboot
    nb8390.com
    
    :end

2. ネットワークブートのプログラムを手に入れる (サーバ上で)

/usr/src/sys/i386/boot/netboot にある "net-boot" プログラムをコンパイルしてください。 そのときには Makefile の先頭にあるコメントを読んでおきましょう。 要求されるように調整してください。 オリジナルのファイルはどこかにバックアップを取っておいてください。 ビルドが終わったら、2 つの MS-DOS の実行ファイル nb8390.comnb3c509.com ができているはずです。 これらの 2 つのプログラムの 1 つはディスク無しのサーバ上で動かすのに必要になるものです。 それはブートサーバからカーネルをロードするものです。 ここでは両方のプログラムを先程作った MS-DOS のブートフロッピーに入れておきます。


3. どのプログラムを実行するかを調べる (ディスク無しのシステム上で)

もしあなたのイーサネットアダプタが使っているチップセットを知っているなら、 これは簡単なことです。もしそれが NS8390 チップセットか、 NS8390 をベースとするチップセットであれば、nb8390.com を使ってください。もし 3Com 509 をベースとするチップセットなら、 nb3C509.com ブートプログラムを使ってください。 もしあなたの持っているものがよくわからなければ、一つ試してみて、そこで ``No adapter found'' と言われたらまた他のを試してみてください。それでもだめだったら、 あなたのものはとても珍しいということです。


4. ネットワークと通じてブートする

config.sys/autoexec.bat ファイルも使わずにディスク無しのシステムを立ち上げてみてください。 あなたのイーサネットアダプタのためのブートプログラムを実行してみましょう。

わたしのイーサネットアダプタは WD8013 16bit モードで動いているので nb8390.com を実行します。

    C:> cd \netboot
    C:> nb8390
    
    Boot from Network (Y/N) ?  Y
    
    BOOTP/TFTP/NFS bootstrap loader     ESC for menu
    
    Searching for adapter..
    WD8013EBT base 0x0300, memory 0x000D8000, addr 00:40:01:43:26:66
    
    Searching for server...

ここでは、 わたしのディスク無しのシステムはブートサーバとして振る舞うようなマシンを探しにいこうとします。 上の addr 行を記録しておいてください。 あとからその数が必要になります。ディスク無しのシステムを再起動して、 あなたの config.sysautoexec.bat ファイルを修正して これらの操作が自動で行われるようにしてください。 おそらくメニューの部分になるでしょう。 もし nb3c509.comnb8390.com の代わりに使わなくてはいけなかったとしても、出力は上と同じです。 もし Searching for adapter.. というメッセージが出るときに ``No adapter found'' ということを言われたら、 Makefile で定義されているコンパイル時間が正しくセットされているかどうかを確認してみてください。


5. システムがネットワーク越しにブートすることを許可する (サーバ上で)

/etc/inetd.conf ファイルが tftp や bootps についてのエントリを持っているかどうかを確認してください。 わたしのは次のようになっています。

    tftp   dgram   udp wait    nobody  /usr/libexec/tftpd  tftpd /tftpboot
    #
    # Additions by who ever you are
    bootps  dgram  udp  wait  root  /usr/libexec/bootpd bootpd /etc/bootptab

もし /etc/inetd.conf ファイルを変更したときには、 inetd に HUP シグナルを送ってください。 これをするには、inetd のプロセス ID を ps -ax | grep inetd | grep -v grep して 取得してください。プロセス ID がわかったら、 それに向けて HUP シグナルを送ってください。 これは kill -HUP <pid> として行います。 これによって inetd はその設定ファイルを読み直します。

ディスク無しシステム上でブートローダが出力した addr の出力を覚えているでしょうか? ここでそれが必要となるのです。

/etc/bootptab (おそらくファイルを作成して) に エントリを加えてください。それはこれと同様の書式で書きましょう。

    altair:\
            :ht=ether:\
            :ha=004001432666:\
            :sm=255.255.255.0:\
            :hn:\
            :ds=199.246.76.1:\
            :ip=199.246.76.2:\
            :gw=199.246.76.1:\
            :vm=rfc1048:

これらの行は次のような意味です。

altair ドメイン名を除いたディスク無しのシステムの名前
ht=ether "イーサネット"ハードウェアタイプ
ha=004001432666 (先に記録した) ハードウェアのアドレス
sm=255.255.255.0 サブネットマスク
hn クライアントにクライアントのホスト名を送るよう、 サーバに伝えます
ds=199.246.76.1 ドメインサーバがどれなのかをクライアントに伝えます
ip=199.246.76.2 クライアントの IP アドレスが何なのかを クライアントに伝えます
gw=199.246.76.1 デフォルトゲートウェイがどれなのかを クライアントに伝えます
vm=... これはそのままにしておいてください

Note: IP アドレスは正しく設定してください。 上のアドレスはわたしだけのものです。

/tftpboot ディレクトリをサーバに作成して、 サーバがサービスを行うディスク無しのシステムのための設定ファイルをこのディレクトリに入れておきます。 これらのファイルは cfg.ip という名前になっていて、ip はディスク無しシステムの IP アドレスを表しています。 altair の設定ファイルは /tftpboot/cfg.199.246.76.2 となります。この中身は次のようになっています:

    rootfs 199.246.76.1:/DiskLess/rootfs/altair
    hostname altair.example.com

hostname altair.example.com の行は単にディスク無しのシステムがどのような完全なドメイン名を持っているのかを表しています。

rootfs 199.246.76.1:/DiskLess/rootfs/altair の行はディスク無しのシステムが NFS でマウントできるルートファイルシステムの場所を表しています。

Note: NFS でマウントされたルートファイルシステムは 読み出し許可だけで マウントされます。

ディスク無しのシステムの階層は要求されれば読み書き可能にして、 マウントし直すことができます。

わたしは予備の 386DX-40 を専用の X 端末として使用しています。

altair の階層は次の通りです。

/
/bin
/etc
/tmp
/sbin
/dev
/dev/fd
/usr
/var
/var/run

実際のファイルのリストは次の通りです。

    -r-xr-xr-x  1 root  wheel  779984 Dec 11 23:44 ./kernel
    -r-xr-xr-x  1 root    bin  299008 Dec 12 00:22 ./bin/sh
    -rw-r--r--  1 root  wheel     499 Dec 15 15:54 ./etc/rc
    -rw-r--r--  1 root  wheel    1411 Dec 11 23:19 ./etc/ttys
    -rw-r--r--  1 root  wheel     157 Dec 15 15:42 ./etc/hosts
    -rw-r--r--  1 root    bin    1569 Dec 15 15:26 ./etc/XF86Config.altair
    -r-x------  1 bin     bin  151552 Jun 10  1995 ./sbin/init
    -r-xr-xr-x  1 bin     bin  176128 Jun 10  1995 ./sbin/ifconfig
    -r-xr-xr-x  1 bin     bin  110592 Jun 10  1995 ./sbin/mount_nfs
    -r-xr-xr-x  1 bin     bin  135168 Jun 10  1995 ./sbin/reboot
    -r-xr-xr-x  1 root    bin   73728 Dec 13 22:38 ./sbin/mount
    -r-xr-xr-x  1 root  wheel    1992 Jun 10  1995 ./dev/MAKEDEV.local
    -r-xr-xr-x  1 root  wheel   24419 Jun 10  1995 ./dev/MAKEDEV

dev ディレクトリで MAKEDEV all するのを忘れずに。

altair/etc/rc は 次の通りです。

    #!/bin/sh
    #
    PATH=/bin:/
    export PATH
    #
    # localhost の設定
    /sbin/ifconfig lo0 127.0.0.1
    #
    # イーサネットカードの設定
    /sbin/ifconfig ed0 199.246.76.2 netmask 0xffffff00
    #
    # NFS で root ファイルシステムをマウントする
    /sbin/mount antares:/DiskLess/rootfs/altair /
    #
    # NFS で /usr ファイルシステムをマウントする
    /sbin/mount antares:/DiskLess/usr /usr
    #
    /usr/X11R6/bin/XF86_SVGA -query antares -xf86config /etc/XF86Config.altair > /dev/null 2>&1
    #
    # X を終了すると再起動
    /sbin/reboot
    #
    # うまく行かないときには....
    exit 1

コメントや質問はどんなものでも歓迎します。