4.6. TFTP ネットブート用ファイルの準備

インストール対象のマシンが LAN に接続されている場合、 TFTP を用いると、そのマシンをネットワーク越しに他のマシンから起動できます。 インストールシステムを別のマシンから起動するには、 その「別のマシン」の特定の場所に起動ファイルを置き、 またインストール対象のマシンの起動をサポートするよう 設定しなければなりません。

設定が必要なのは TFTP サーバです。 また CATS マシンでは BOOTP サーバ 、または RARP サーバ 、または DHCP サーバ. の設定が必要です。

Reverse Address Resolution Protocol (RARP) は、 どの IP を用いるべきかをクライアントに伝える方法のひとつです。 同種の方法には BOOTP プロトコルがあります。 BOOTP は IP プロトコルのひとつです。 クライアントに対して、使うべき IP アドレスと、 ブートイメージをネットワークのどこから取得するかを伝えます。 DHCP (Dynamic Host Configuration Protocol) は、 BOOTP との後方互換性を保ちつつ、より柔軟に拡張させたものです。 システムによっては DHCP でしか設定できないこともあります。

Trivial File Transfer Protocol (TFTP) は、 ブートイメージをクライアントに提供するために用います。 理論的には、どんなサーバでも、どんなプラットフォームでも、 これらのプロトコルを実装してさえいれば利用できます。 この節では、SunOS 4.x, SunOS 5.x (Solaris), GNU/Linux での例を示します。

4.6.1. RARP サーバの設定

RARP を設定するには、クライアントのイーサネットアドレス (MAC アドレス) を調べておく必要があります。この情報が確認できていなければ、 (例えば rescue フロッピーなどで) ``Rescue'' モードを起動して /sbin/ifconfig eth0 コマンドを使ってください。

Linux 2.2.x カーネルを使っているシステムでは、 カーネルの RARP テーブルへの登録が必要です。 次のコマンドを実行してください。

/sbin/rarp -s client-hostname client-enet-addr

/usr/sbin/arp -s client-ip client-enet-addr

SIOCSRARP: Invalid argument

といったメッセージが出る場合は、RARP カーネルモジュールをロードするか、 これが不可能なら RARP のサポートを組み込むよう カーネルを再構築する必要があります。 modprobe rarp を試し、うまくいったらもう一度 rarp コマンドを実行してください。

Linux 2.4.x カーネルのシステムでは、RARP モジュールはありません。 また使うプログラムは rarpd になります。 作業は次の段落で説明する SunOS の場合と同じようになります。

SunOS では、クライアントのイーサネットハードウェアアドレスを ``ethers'' データベースと ``hosts'' データベースに リストしておかなければなりません (これらのデータベースは /etc/(ethers,hosts) ファイルか NIS/NIS+ のマップにします)。 次に RARP デーモンを起動します。 SunOS 4 では /usr/etc/rarpd -a を、 SunOS 5 では /usr/sbin/rarpd -a を (ルート権限で) 実行してください。

4.6.2. BOOTP サーバの設定

GNU/Linux で使える BOOTP サーバは二つあります。 CMU の bootpd と、もう一つは実際には DHCP サーバなのですが、 ISC の dhcpd です。それぞれ Debian GNU/Linux では bootp パッケージと dhcp パッケージに入っています。

CMU bootpd を使う場合は、まず /etc/inetd.conf ファイルの 該当行をアンコメント (または追加) する必要があります。 Debian GNU/Linux では update-inetd --enable bootps を実行し、 続いて /etc/init.d/inetd reload とすれば OK です。 この行は次のようなものです。


bootps   dgram   udp     wait    root    /usr/sbin/bootpd  bootpd -i -t 120

ここで次に /etc/bootptab を作成します。 このファイルの書式は、 printcap, termcap, disktab ファイルなどでお馴染みの、 例のわかりにくい形式になっています。 詳細は bootptab マニュアルページを見てください。 CMU bootpd では、 クライアントのハードウェア (MAC) アドレスを知っておかなければなりません。 /etc/bootptab の例を示します。


client:\
  hd=/tftpboot:\
  bf=tftpboot.img:\
  ip=192.168.1.90:\
  sm=255.255.255.0:\
  sa=192.168.1.1:\
  ha=0123456789AB:

少なくともクライアントのハードウェアアドレスを指定している "ha" オプションは変更する必要があるでしょう。 "bf" オプションはクライアントが TFTP で取得するファイルを指定しています。 詳細は 項4.6.5. 「TFTP イメージを適切な場所に配置する」 を参照してください。

対照的に、ISC dhcpd を使っての BOOTP の設定は実に簡単です。 dhcpd では、BOOTP クライアントは やや特殊な DHCP クライアントとして取り扱われます。 アーキテクチャによっては、BOOTP によるクライアントの起動には 複雑な設定が必要になります。 これに該当してしまったら、項4.6.3. 「DHCP サーバの設定」 の節を読んでください。 該当しないアーキテクチャでは、 クライアントの含まれるサブネットの設定ブロックに allow bootp というディレクティブを追加し、 /etc/init.d/dhcpd restartdhcpd を再起動するだけです。

4.6.3. DHCP サーバの設定

このマニュアルの執筆の時点では、フリーソフトウェアの DHCP サーバは ISC の dhcpd だけしかありません。 Debian GNU/Linux では、これは dhcp パッケージに入っています。 次に示すのは、dhcp の設定ファイル (普通は /etc/dhcpd.conf) の例です。


option domain-name "example.com";
option domain-name-servers ns1.example.com;
option subnet-mask 255.255.255.0;
default-lease-time 600;
max-lease-time 7200;
server-name "servername";

subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.200 192.168.1.253;
  option routers 192.168.1.1;
}

host clientname {
  filename "/tftpboot/tftpboot.img";
  server-name "servername";
  next-server servername;
  hardware ethernet 01:23:45:67:89:AB; 
  fixed-address 192.168.1.90;
}

この例では、"servername" というサーバがひとつあり、 DHCP サーバ, TFTP サーバ, ネットワークゲートウェイの仕事をすべて行っています。 domain-name オプション、サーバ名、クライアントのハードウェアアドレスは、 必ず変更する必要があります。 "filename" オプションは TFTP 経由で取得するファイルの名前です。

dhcpd の設定ファイルの編集を終えたら、 /etc/init.d/dhcpd restart によって dhcpd を再起動してください。

4.6.3.1. PXE ブート

ここでは TFTP の Pre-boot Execution Environment (PXE) 法を用いた、 dhcp.conf の例を示します。


option domain-name "example.com";

default-lease-time 6048;
max-lease-time 604800;

allow booting;
allow bootp;

# The next paragraph needs to be modified to fit your case
subnet 192.168.1.0 netmask 255.255.255.0 {
  range 192.168.1.200 192.168.1.253;
  option subnet-mask 255.255.255.0;
  option broadcast-address 192.168.1.255;
# the gateway address which can be different 
# (access to the internet for instance)
  option routers 192.168.1.1;
# indicate the dns you want to use
  option domain-name-servers 192.168.1.3;
}

host tftpserver {
# tftp server ip address
  fixed-address 192.168.1.90;
# tftp server hardware address
  hardware ethernet 01:23:45:67:89:AB;
}

group {
 next-server 192.168.1.3;
 host tftpclient {
# tftp client hardware address
  hardware ethernet  00:10:DC:27:6C:15;
  filename "/tftpboot/pxelinux.0";
 }
}

PXE ブートでは、クライアントのファイル名はカーネルイメージではなく、 ブートローダであることに注意してください。 (以下 項4.6.5. 「TFTP イメージを適切な場所に配置する」 参照)

4.6.4. TFTP サーバの立ち上げ

To get the TFTP server ready to go, you should first make sure that tftpd is enabled. This is usually enabled by having the following line in /etc/inetd.conf: TFTP サーバを立ち上げるには、 まず tftpd が有効になっているか確認します。 /etc/inetd.conf に次のような行があればおそらく大丈夫です。


tftp dgram udp wait root /usr/sbin/tcpd in.tftpd /tftpboot

/etc/inetd.conf を見て、in.tftpd の引数に与えられているディレクトリを覚えてください。 後でこのディレクトリを使います。 in.tftpd のバージョンによっては、 -l 引数をつけると、 すべての要求をシステムログに記録できます。 これは起動エラーの診断に有用です。 /etc/inetd.conf を変更したら、 変更したことを inetd に伝えなければなりません。 Debian マシンでは /etc/init.d/inetd reload (slink/2.1 以前のシステムでは /etc/init.d/netbase reload) を実行します。 他のマシンでは、inetd のプロセス ID を見つけて、 kill -HUP inetd-pid を実行します。

TFTP ブートで Pre-boot Execution Environment (PXE) 法を使用するには、 tsizeをサポートする TFTP サーバが必要になります。 Debian GNU/Linux サーバでは、tftp-hpa がその資格があります。

4.6.5. TFTP イメージを適切な場所に配置する

次に行うことは、 項4.2.3. 「インストール用ファイルのありか」 の記述にある、必要な TFTP ブートイメージを、 tftpd のブートイメージディレクトリに置く作業です。 このディレクトリは普通 /tftpboot です。 tftpd が特定のクライアントの起動に用いるファイルへのリンクを、 ここに作らなければなりません。 残念ながら、ファイルの名前は TFTP クライアントによって決まり、 強制力のある標準は存在しません。

TFTP クライアントが検索するファイルは、 client-ip-in-hexclient-architecture であることが多いです。 client-ip-in-hex を計算するには、 クライアントの IP アドレスの各バイトを 16 進数表記に変換します。 bc プログラムが使えるマシンが手元にあるようなら、 これを使うのがいいでしょう。 まず obase=16 コマンドを実行し、 出力を 16 進にします。続いてクライアントの IP アドレスの各部を ひとつづつ入力します。 client-architecture の値には、 いろいろな値を入れて試してみてください。

PXE 起動では syslinux: pxelinux.0 に含まれたブートローダを使用できます。 ブートローダは /tftpboot フォルダにコピーするべきです。 その後、/tftpboot/tftpboot/pxelinux.cfg というサブディレクトリを作成し、 そのディレクトリに default というテキストファイルを作成します。 以下に default ファイルの内容例を示します。


default lanlinux
prompt 1

label lanlinux
  kernel tftpboot.img
  append load initrd=root.bin devfs=mount

devfs=mount が重要です。 これがないと、カーネル起動時に一回だけ行う root.bin ファイルシステムのマウントに問題が発生するからです。

最後に tftpboot.imgroot.bin を、 Debian ftp アーカイブから /tftpboot フォルダへコピーしてください。 そこにブートローダがあるはずです。

4.6.6. メモリの少ないシステムでの TFTP インストール

システムによっては、標準のインストール RAM ディスクと、 TFTP ブートイメージに必要なメモリとをあわせると、 メモリが足りないことがあります。 この場合でも TFTP を用いたインストールは可能で、 ルートディレクトリを同様にネットワークから NFS でマウントするようにすればいいのです。 このタイプの設定は、 ディスクレスクライアントやデータレスクライアントにも適しています。

まず、項4.6. 「TFTP ネットブート用ファイルの準備」 に説明されている全ての手順を踏んでください。

  1. Linux カーネルイメージを TFTP サーバにコピーします。 起動させようとしているアーキテクチャの a.out イメージにしてください。

  2. root アーカイブを NFS サーバで untar します (NFS サーバは TFTP サーバと同じマシンでも構いません)。

    
    # cd /tftpboot
    # tar xvzf root.tar.gz
    
    

    GNU tar を使ってください。 (SunOS のものなど、他の tar プログラムでは、 デバイスを通常のファイルとして扱ってしまいます)

  3. /tftpboot/debian-sparc-root ディレクトリを、 クライアントから root でアクセスできるようにします。 つまり次の行を /etc/exports に追加します (GNU/Linux の書式ですが、SunOS でも同じようなもののはず):

    
    /tftpboot/debian-sparc-root client(rw,no_root_squash)
    
    

    注意: "client" は、起動しようとしているシステムの (このサーバから見た) ホスト名または IP アドレスにします。

  4. /tftpboot ディレクトリに、 debian-sparc-root に対するシンボリックリンクを、 IP アドレスの名前 (ドット区切り表記) で作ります。 例えばクライアントの IP アドレスが 192.168.1.3 なら次のようにします。

    
    # ln -s debian-sparc-root 192.168.1.3
    
    

4.6.7. TFTP と NFS Root でのインストール

項4.6.6. 「メモリの少ないシステムでの TFTP インストール」 の場合と似ています。 RAM ディスクをロードせず、 新しく作った NFS-root ファイルシステムから起動させたいわけですから。 tftpboot イメージへのシンボリックリンクは、 カーネルイメージへのシンボリック (例えば linux-a.out) に置き換える必要があります。

RARP/TFTP は、すべてのデーモンが同じサーバで動作している必要がありました (sparc ワークステーションは TFTP リクエストを以前の RARP リクエストに 返答したサーバに送ります)。