netbootでdisklessマシンに仕立てる

1.netbootって何?

普通、パソコンやワークステーションでOSを起動する時は、HDDから起動するのですが、netbootでは自分のマシンのHDDではなく、ネットワーク上の別なマシンのHDDからOSを起動します。つまり、自分のマシンにはHDDがなくても、OSを立ち上げたり、アプリケーションを使ったりできるという、Windowsな人達には想像もできないようなことができてしまうわけです:-)
普通のUNIXマシンではNFS(Network File System)というもの使って、他のマシンのHDDをあたかも自分のマシンのHDDであるかのように使うことができますが、netbootしたdisklessマシンもNFSを使ってファイルシステムをマウントします。ただ、netbootマシンではHDDがないため、ルート(/)とかswapなどもすべてネットワーク上から調達してくる必要があります。
ついでに、OSが起動する前のことに触れておくと、OSを起動するためにはOSを起動するためのプログラム(bootstrap codeとかいったりします)を読みだし、それを使ってOS本体をロードする、という流れになっています。一般的なPCではBIOSがMBRに書き込まれているブートプログラムを読みだして、制御を移し、ブートプログラムがカーネルをロードして…、OSが起動するという仕掛けになっています。しかし、disklessなマシンではMBRからブートプログラムを読み出すことなどできるわけもありません。ではどうするか?、というと、単純にネットワーク経由でブートプログラムを取ってきて、OSを起動します。NetBSD/alphaでは次のような段階になっています。
  1. ファームウェア(BIOSのようなものです)がBOOTPをつかってネットワークカードにIPアドレスを割り振らせる。
  2. TFTP経由でブートプログラムを取得してメモリ上にロードする。
  3. ブートプログラムがカーネルをメモリ上に読み込む。
  4. デバイスをプローブし終ったらNFSでファイルシステムをマウントする。
bootstrap

ここで注目して欲しいのは、OS起動以前のSRMコンソールの段階でネットワークカードが認識されていないといけない、ということです。そうでないとbootstrap codeを取得する手段がないため、OSは起動しないのです(当り前)。私は「NIC = Intel」というくらいfxpが好きなのですが(笑)、残念ながらSRMコンソールではオンボードのNICか、DEC 21x4xチップを使っているNICでないと認識されません。あと、SMCチップを使っているNICでも大丈夫らしいです。うちではブート専用にオンボードのNICを使い、ファイルシステムのマウントにはIntelのEtherExpressを使っています。

なお、私のところでは以下の環境でネットブートをしています。これからする解説の中では特に断りのない限り、OSやハードウェアは以下に示す環境のものとしておきます。

2.DHCPサーバのセットアップ

netbootにはまず起動するマシンのネットワークカードにIPアドレスを割り振らなくてはなりません。その時必要になるのはBOOTPサーバというものです。FreeBSDにはbootpdというのがOS標準でついてきますが、うちでは以前から主にWindowsマシンやノートPCなどのクライアント用にISCDHCPサーバを運用していました。DHCPサーバはBOOTPサーバの機能も持っているため、あえてBOOTPサーバを新規に設定するのは避けて、DHCPサーバをBOOTPサーバに流用することにしました。
DHCPサーバ自体の設定などは別なWebページやマニュアルを参考にしてもらうことにして、ネットブートに必要な設定だけを書いておくと、次のようになります。
host alpha_boot {
    hardware ethernet aa:bb:cc:dd:ee:ff;
    fixed-address xxx.xxx.xxx.xxx;
    option host-name "myhost.mydom.net";
    option root-path "/export/alpha/alpha_root";
    filename "netboot";
}
各項目の意味などは以下のとおりです。 他に必要な項目があれば、各自の環境にあわせて設定するようにしてください。
dhcpdの設定ファイルに必要な項目を追加したら、dhcpdを再起動しておきます。

3.TFTPサーバのセットアップ

TFTPというのは"Trivial File Transfer Protocol"の略で、その名の通り、ファイルの転送のためのプロトコルです。しかし、普通のFTPとは以下のような点で異なっています。 TFTPは仕組みが簡単であるため、限られたリソースで動作しなければならない、ネットブートやX端末のブートプログラムのダウンロード、ルータなどのファームウェアや設定の送受信等で使われています。しかし、ユーザー認証がないなど、セキュリティ上の問題点があります。
では早速設定にしてみます。tftpサーバはinetdから起動されるプログラムなので、/etc/inetd.confを編集します。FreeBSD 4.2-RELEASEのデフォルトでは
#tftp   dgram   udp     wait    nobody  /usr/libexec/tftpd      tftpd /tftpboot
のように、tftpはコメントになっています。ですから、まずこのコメントを外します。
次に、一番後ろの/tftpbootというところを書き換えます。これはtftpdでアクセスできるようにするディレクトリです。これを適当なディレクトリに書き換えます。また、デフォルトの設定に合わせて/tftpbootというディレクトリを作ってもよいでしょう。
この際、そのディレクトリ(およびそのファイル)の所有者を必ずnobody以外にしてください。前にも説明しましたが、TFTPはユーザー認証をしないので、ディレクトリの所有者がnobodyだと、誰でもファイルを作ることができてしまい、セキュリティ上問題があります。更に、そのディレクトリやその中のファイルはパーミッションを読みとり専用にしておくとよいでしょう。詳細はinetd(8)やtftpd(8)を参照してください。
最後に、inetdのプロセスをkill -HUPすれば、設定は完了です。

4.NFSサーバのセットアップ

NFSサーバはnetbootマシンに限らず、複数のマシンを運用するような時に/homeを共有したり等、何かと便利に使えます。

まず、/etc/exportsファイルを編集します。このファイルはどのディレクトリをNFSエクスポートするかや、どのホストからのアクセスを許可するか、などを記述するファイルです。以下にうちのNFSサーバの/etc/exportsの例を示します。

/home   -maproot=root   aaa.bbb.ccc.ddd xxx.xxx.xxx.xxx
/export -alldirs -maproot=root  aaa.bbb.ccc.ddd
まず一番最初の項目が、エクスポートしたいディレクトリです。うちではnetbootマシン以外にも複数あるUNIXマシンで/homeを共有しています。
次の項目はオプションです。"-maproot"はリモートマシンでのroot権限をローカルマシンではどのユーザー権限にするか、というものです。これをつけないと、リモートマシンではrootユーザーであっても、ローカルマシンではrootではないことになるので、netbootマシンのように、全てのファイルシステムをNFSでマウントする場合にはないと困ります。しかし、例えば読み取り専用で使うような場合は、"-maproot=nobody"などにしておくとリモートでのrootはローカルマシンではnobodyということになるので安全だったりします。
"-alldir"をつけると、そこで指定したディレクトリ(上の例では/export)以下にあるどのディレクトリでもマウントできます。たとえば、"-alldir"がない時は/exportはリモートからマウントできますが、/export/hogeだけをマウントすることはできません。しかし、"-alldir"をつけると、/export/hogeでも/export/foo/barでもマウントできます。
最後のaaa.bbb.ccc.dddなどには本当はIPアドレスやホスト名が入ります。ここに指定したIPアドレス(またはホスト名)からのみマウントすることができます。
より詳しいことはexports(5)を参照してください。

次にnfsdとmountdを起動します。これは単純に

# nfsd
# mountd -r
のようにすればおしまいです。mountdに"-r"をつける理由は先程/etc/exportsに"-alldir"というのを書いたからです(exports(5)をよく読みましょう)。そのほか必要だと思われるオプションがあればman等で調べてください。
ついでに再起動した時にnfsdやmountdが自動的に起動されるようにします。これは/etc/rc.confに以下のことを追加します。
nfs_server_enable="YES"
mountd_flags="-r"
FreeBSDではnfs_server_enableをYESにしておけば、nfsdとmountdを起動してくれます。他のOSではそのOSのドキュメントにしたがってください。

5.ディレクトリの設定・インストール

最後にnetbootマシンのディレクトリ構成やインストールについてです。これが終ればAlphaマシンをdisklessnなマシンにすることができます。

まず、インストールについて解説しておきましょう。netbootマシンへのOSインストール作業は実質的に行いません。ではどうするのか、というと基本的にはFTPやCD-ROMにある*.tgzファイルを解凍するだけです。どれを解凍すればよいかというと、ftp://ftp.jp.netbsd.org/pub/NetBSD/NetBSD-1.5/alpha/binary/sets/以下にあるbase.tgzとetc.tgzが最低限必要です。その他のファイルについては必要に応じてダウンロードします。
これをNFSでマウントできるディレクトリ(/exportなど)に解凍します。いかはうちの環境を例に取って解説します。うちでは

netbootマシンでのディレクトリ NFSサーバでのディレクトリ
/ /export/alpha/alpha_root
/var /export/alpha/var
/usr /export/alpha/usr

のようにしています。/etc/exportsで/exportについては"-alldir"をつけておきましたが、これはnetbootマシンでの/(ルート)と/varと/usrを別々にマウントするためです。

# cd /export/alpha/alpha_root
# tar zxfv /hogehoge/NetBSD-1.5/binary/sets/base.tgz
# tar zxfv /hogehoge/NetBSD-1.5/binary/sets/etc.tgz
のようにして解凍します。
他に必要なもの(comp.tgzやxbase.tgzなどなど)があればそれも解凍します。
次に、swapファイルを作ります。HDDにインストールした時はswapはディスクのスライスとして作りましたが、netbootマシンはNFSサーバ上のファイルとして作成します。これは以下の手順で作ります。
# mkdir /export/alpha/alpha_root/swap
# dd if=/dev/zero of=/export/alpha/swap bs=4k count=16k
最初のはswapをマウントするためのマウントポイントとなるディレクトリの作成です。その次にswapの実体となるファイルを作成します。上の例では64MBのswapファイルを作成していますが、これは必要に応じてかえてください。
さらに
# mkdir /export/alpha/alpha_root/kern
とやってkernfsのマウントポイントを作っておきます。

次にすることはnetbootマシンの/etcの中の設定ファイルの編集です。HDDへインストールする時はインストールようのプログラムが自動的にやってくれる場合もありますが、netbootマシンではすべてサーバ側で準備する必要があります。特に注意が必要なのはfstabファイルです。全てNFSでマウントするということを忘れないでください。以下うちの環境での例を載せておきます。

192.168.1.1:/export/alpha/swap  none    swap    sw,nfsmntpt=/swap 0 0
192.168.1.1:/export/alpha/alpha_root    /       nfs     rw 0 0
192.168.1.1:/export/alpha/usr   /usr    nfs     rw 0 0
192.168.1.1:/export/alpha/var   /var    nfs     rw 0 0
192.168.1.1:/home               /home   nfs     rw 0 0
その他にもnetbootマシンでの/etc/hostsや/etc/ifconfig.fxp0、/etc/rc.confなどを編集する必要があります。必要なものはあらかじめ編集しておきます。

最後にTFTPで取得するブートプログラムをTFTPでアクセスできるディレクトリに移動します。これはbase.tgzに含まれていて、/export/alpha/usr/mdec(netbootマシンから見ると/usr/mdec)にあります。ここにあるnetbootというファイルがブートプログラムです。これをTFTPで取得できるディレクトリ(/tftpbootなど)にコピーします。

これでnetbootにするために必要な全ての作業が終りました。あとはAlphaマシンの電源をと入れ、SRMコンソールから

>>> boot -proto bootp ewa0
とやって起動します。うちのオンボードのNICはewa0という名前で認識されていますが、これは使っている環境によっては異なるかも知れません。
bootstrap1
bootstrap2
bootstrap3

うまく設定ができていれば、上の図のようにBOOPTでIPアドレスを取得→TFTPでブートプログラムを取得→kernelのロード、という手順でOSが起動するはずです。起動後は普通にHDDから起動したのと同じようにOSを操作することができます。おつかれさまでした!!!

6.おまけ … fxpをルートデバイスとして使う

さて、うちのAlphaマシン(DEC Personal Workstation 500a)にはオンボードでDEC21140のNICがついています。これはSRMコンソールの段階で認識されていて、ネットワークブートに使うことができます。しかし、オンボードのNICははっきりいって性能がよくないです。HUBとの相性が悪いのかどうか分かりませんが、NetBSDからでは10Mbpsでしか使えないのです。その上NFSでファイルシステムをマウントするときに、device timeoutを起こしてしまいマウントできないという大問題があります(笑)。なので、ちゃんと100Mbpsで接続できるPCIバスのIntel EtherExpressを使い、ファイルシステムをマウントできないか、と考えました。
ここで1.netbootってなに、で解説したことを思い出してみると、NFSでファイルシステムをマウントするのは、OSの起動の段階でいうと、一番最後の方になります。kernelのロードのあとデバイスのプローブをし、その上でファイルシステムをマウントするわけです。つまり、デバイスのプローブに成功したNICであれば、それをつかってNFSでファイルシステムをマウントすることはできるはずです。また、オンボードのNICはkernelのロードにしか使わないわけなので、kernelで無効化(よってオンボードのNICをプローブすることはない)しても問題なさそうだ、ということがいえます。

GENERICカーネルではDEC21140チップのNICもIntelのNICもどちらも有効になっていますから、NetBSDはkernelのロードに使用したDEC21140チップのNICを使ってファイルシステムをマウントしようとします。しかし、前に書いたようにこれはtimeoutで失敗に終ります。そのあと、NetBSDでは以下のように/をマウントするのに使うデバイスを聞いてきます。ここでIntelのNICを選べばよいのです。そうすると、IntelのNICにDHCPでIPアドレスを割り振り、こんどはこのNICを使ってファイルシステムをマウントしようとします。よって、kernelのロードに使うNICとファイルシステムに使うNICは別々にすることができました。

しかし、このやり方だと、毎回オンボードのNICがtimeoutするのを待ち、その上で手動でルートデバイスを指定してやらないと、OSが起動しない、ということになります。


BSDのページへ戻る
$Id: netboot.html,v 1.1.1.1 2002/01/13 08:40:33 mira Exp $