NFS を介したルートファイルシステムのマウント (nfsroot)
======================================================

    著者：Gero Kuhlmann <gero@gkminix.han.de>, 1996 年
    更新：Martin Mares <mj@atrey.karlin.mff.cuni.cz>, 1997 年
日本語訳：野本浩一 <hng@ps.ksky.ne.jp>
    校正：山森浩幸さん <h-yamamo@db3.so-net.ne.jp>



ディスクレスシステムを X 端末やプリントサーバなどに使いたいなら、ディ
スクではないデバイス上にルートファイルシステムを置かなければなりません。
これは RAM ディスク (さらに詳しい情報はこのディレクトリにある
initrd.txt を参照してください [訳注：日本語訳が
http://www.linux.or.jp/JF/JFdocs/kernel-docs-2.2/initrd.txt.html
にあります]) か、NFS を介しファイルシステムをマウントするかのどちらか
で可能です。この資料では、「クライアント」はディスクレスシステムを、
「サーバ」は NFS サーバを、意味します。




1.) nfsroot 機能を有効にする
    ------------------------

nfsroot を使用するには、カーネルコンフィグレーションで NFS のサポー
トを選択しなければなりません。この場合は NFS をモジュールとしてロード
できないことに注意してください。その後、コンフィグレーションスクリプト
は nfsroot を使用したいか、それが yes ならどの auto configuration シス
テムを使用したいか、尋ねてきます。BOOTP と RARP の両方の選択をお勧めし
ます。




2.) カーネルコマンドライン
    ----------------------

カーネルがブートローダ (loadlin, LILO, ネットワークブートプログラムの
いずれか) によりロードされた場合、カーネルはどのデバイスをルート fs に
使用するのかと、ルートとしてマウントするサーバの場所およびサーバ上のディ
レクトリ名が伝えられなければなりません。これは二三のカーネルコマンドラ
インの引き数で設定できます -


root=/dev/nfs

  これは仮想 NFS デバイスを有効にするために必要です。これは実デバイス
  ではなく、実デバイスの代わりに NFS を使用するようカーネルに伝えるこ
  とを単に意味します。


nfsroot=[<server-ip>:]<root-dir>[,<nfs-options>]

  nfsroot 引き数がコマンドラインに与えられなかった場合、既定値の
  "/tftpboot/%s" が使用されます。

  <server-ip>   NFS サーバの IP アドレスを指定します。このフィールドが
                与えられない場合、ip 変数 (以下を参照してください) に
                より決められる既定のアドレスが使用されます。この引き数
                を使用するものの一つとして、RARP と NFS で異なるサーバ
                を使用させる例があります。通常これはブランクです。

  <root-dir>    ルートとしてマウントするサーバ上のディレクトリ名。文字
                列内に "%s" トークンがある場合、トークンはクライアント
                の IP アドレスの ASCII 表現に置き換えられます。

  <nfs-options>	標準的な NFS オプション。すべてのオプションはカンマで
                区切られます。オプションフィールドが与えられない場合、
                次の既定値が使用されます -
                        port            = サーバの portmap デーモンに
                                          より与えられます
                        rsize           = 1024
                        wsize           = 1024
                        timeo           = 7
                        retrans         = 3
                        acregmin        = 3
                        acregmax        = 60
                        acdirmin        = 30
                        acdirmax        = 60
                        flags           = hard, nointr, noposix, cto, ac


ip=<client-ip>:<server-ip>:<gw-ip>:<netmask>:<hostname>:<device>:<autoconf>

  この引き数は、デバイスの IP アドレスの設定方法、さらに IP ルーティン
  グテーブルの設定方法をカーネルに伝えます。これは元々 nfsaddrs と呼ば
  れていましたが、今ではブート時の IP 設定は NFS と関係なく動作するの
  で、ip に改名されました。また、古い名前は互換性の理由から別名として
  残りました。

  この引き数がカーネルコマンドラインに無い場合、フィールドはすべて空で
  あると仮定され、下記に述べる既定値が用いられます。この場合は一般的に、
  カーネルは RARP と BOOTP の両方を使用して、すべての設定をしようとし
  ます (カーネルコンフィグレーションで何が有効になっているかに依存し、
  両プロトコルのうち最初に答えのあったものを使用します)。

  <client-ip>   クライアントの IP アドレス。空の場合、アドレスは RARP
                か BOOTP のどちらかで決められます。どのプロトコルが使
                用されるかはカーネルコンフィグレーションで何が有効になっ
                ているかと、<autoconf> 引き数に依存します。この引き数
                が空でない場合、RARP も BOOTP も使用されません。


  <server-ip>   NFS サーバの IP アドレス。RARP がクライアントアドレス
                を決めるために使用され、この引き数が空でない場合のみ、
                指定されたサーバからの応答が受付けられます。RARP と
                NFS で異なるサーバを使用するには、ここに RARP サーバを
                指定 (あるいはブランクのまま) し、nfsroot 引き数で NFS
                サーバを指定します (上記を参照してください)。このエン
                トリがブランクの場合、サーバのアドレスは RARP かBOOTP
                要求のどちらかの答えが使用されます。

  <gw-ip>       サーバが異なるサブネット上にある場合のゲートウエイ IP
                アドレス。このエントリが空で、BOOTP で値を得られない場
                合、ゲートウエイは使用されず、サーバはローカルネットワー
                ク上にあると仮定されます。

  <netmask>     ローカルネットワークインターフェース用ネットマスク。こ
                れが空で、BOOTP の応答により決められない場合、ネットマ
                スクはクライアント IP アドレスから導かれ、そのクラス全
                体のアドレスを使うものと仮定されます。

  <hostname>    クライアント名。空の場合、クライアント IP アドレスはそ
                の ASCII 記法か、BOOTP で得られた値が使用されます。

  <device>      使用するネットワークデバイス名。これが空の場合、すべて
                のデバイスが RARP および BOOTP の要求用に使用され、最
                初に応答を受取ったデバイスが設定されます。一つのデバイ
                スしかない場合、ブランクのままが安全です。

  <autoconf>    autoconfiguration 用に使用する方法。これが 'rarp' か
                'bootp' のどちらかなら、指定されたプロトコルが使用され
                ます。値が 'both' か空の場合、カーネルコンフィグレーショ
                ンで有効になっていれば、両方のプロトコルが使用されます。
                'off' では autoconfiguration を行いません。

  <autoconf> 引き数は autoconfiguration を使用する場合、ip 引き数の値
  に含まなくてもいいようです (文字の前の ':' も必要ありません)。




3.) カーネルローダ
    --------------

メモリにカーネルを入れるには、いくつかの異なる方法が使用できます。それ
らはどの仕組みが使用可能かに依存します -


3.1) dd を用いフロッピー上にカーネルを書き込む -
       いつものように、dd を用いフロッピー上にカーネルを書き込めますが、
       いずれにしてもカーネルコマンドラインを使用することはできません。
       'root=' 引き数の代用に、mknod を用いメジャー番号 0, マイナー番
       号 255 のダミーデバイスを任意の Linux システム上に作成します -

                mknod /dev/boot255 c 0 255

        次に dd を用いフロッピー上にカーネル zImage ファイルをコピーし
        ます -

                dd if=/usr/src/linux/arch/i386/boot/zImage of=/dev/fd0

        最後に、ルートデバイスを設定するために rdev を用います -

                rdev /dev/fd0 /dev/boot255

        その後、ダミーデバイス /dev/boot255 を削除できます。それは使用
        可能な実デバイスではないので。
        他の二つのカーネルコマンドラインパラメータは rdev で代用できま
        せん。したがってこの方法を用いた場合、カーネルは RARP や BOOTP
        を既定値で使用し、RARP を介した答えがある場合、そのルートとし
        てディレクトリ /tftpboot/<client-ip>/ をマウントします。BOOTP
        の答えを得た場合、その答えの中のディレクトリ名が使用されます。


3.2) LILO の使用
        LILO を使用する場合、必要なコマンドラインパラメータを LILO の
        設定ファイル内の 'append=' コマンドですべて指定できます。しか
        しながら、'root=' コマンドを使用するには、上記の 3.1 で述べた
        ようにダミーデバイスをここでも設定する必要があります。LILO お
        よびその 'append=' コマンドの使用法は LILO の資料を参照してく
        ださい。

3.3) loadlin の使用
        ルートとしてマウントするローカルハードディスクを持たずに、DOS
        コマンドプロンプトから Linux をブートしたい場合、loadlin を使
        用できます。それは動作すると聞いていますが、私自身まだ使用した
        ことがありません。一般的に LILO がそれを行う方法と同様に、カー
        ネルコマンドラインの作成が可能なはずです。詳しい情報は loadlin
        の資料を参照してください。

3.4) ブート ROM の使用
        これはたぶんディスクレスクライアントを起動する最も上品な方法で
        す。ブート ROM により、カーネルは TFTP プロトコルを使用してロー
        ドされます。私が知る限り、ネットワークから Linux のブートをサ
        ポートする商用ブート ROM はまだありませんが、フリーのブート
        ROM の実装は二つあり、sunsite.unc.edu およびそのミラーサイトか
        ら入手できます。それらは 'netboot-nfs' および 'etherboot' と呼
        ばれます。両方ともディスクレス Linux クライアントのブートに必
        要なものすべてを含んでいます。




4.) 謝辞
    ----

  カーネル内の nfsroot コードおよび RARP サポートは
  Kuhlmann<gero@gkminix.han.de> により書かれました。

  IP 層を除く autoconfiguration コードは
  Martin Mares <mj@atrey.karlin.mff.cuni.cz> により書かれました。

  nfsroot の初版を書くために、私を支援してくれた
  Jens-Uwe Mager <jum@anubis.han.de> に感謝します。
