PXEを使ってPCもディスクレスにしよう

YAMAMORI Takenori ●yamamori

●FreeBSDをディスクレスクライアントにする

ここでは,FreeBSD 4.2-RELEASEを,pxebootを用いてディスクレスクライアントにする方法を説明します.

○仮のNFS rootでブート

ここでは,サーバ側のDHCP/TFTP/NFSの設定が完了し, NFS rootとして/diskless/freebsdというディレクトリが, NFSサーバ上に空のディレクトリのまま存在しているものとします. これを仮のNFS rootとして,ディスクレスマシンをブートしてみましょう.

ディスクレスマシンの電源を入れると,PXEのブートコードが動作し, DHCP/TFTPでpxebootがサーバから取得され,pxebootが動き出すはずです. このあと,pxebootはFreeBSDをブートしようとしますが, サーバ上の/diskless/freebsdにはkernelも何もないため, pxebootはokプロンプトを出して止まります. このokプロンプト上ではlsコマンドも使えます. 仮のNFS root上に,試しに適当なファイルを置いておいておけば, そのファイル名がokプロンプト上のlsコマンドで表示されるでしょう.

●ディスクレスマシン上でpxebootが動作したところ
(図では,NFSサーバ上にls-meというファイルを試しに置いて, それをpxeboot上からlsで表示させている)
pxeboot.gif

このようにFreeBSDでは, pxebootが動作した段階ですでにNFSマウントが行なわれ, FreeBSDのkernelは,このあとNFSで読み込まれます. これは,SunOS/Solarisなどと同様,ディスクレスのブート方式として標準的です. ちなみにLinuxのディスクレスブートでは, カーネルのvmlinuzファイルはNFSではなくTFTPで読み込まれます. このため,vmlinuzをNFS rootのファイルシステムとは別に /tftpboot以下に用意する必要があり,イマイチの感があるのですが, FreeBSDのディスクレスブート方式はこれより美しいといえます.


○本番のNFS rootを作成

ここまで動作確認できたら,いよいよ本番のNFS rootを用意し, kernelも配置しましょう.

ここではNFSサーバがFreeBSD以外である場合も含めて考え, ディスクレスクライアント用のファイルシステムの共有は考えず, FreeBSDのインストールCD-ROMから, NFSサーバ上の/diskless/freebsdディレクトリに 必要なファイルをそのまま展開することにします.(注※)

ファイルの展開は以下のように行ないます. ここで,tarのオプションとして「--numeric-owner」を付けているのは, NFSサーバのOSがFreeBSD以外の場合でも, tarで展開されるファイルのuid/gidの定義が変わらないようにするためです.

※注
一般的には,ディスクレスクライアントとNFSサーバ, または複数のディスクレスクライアント同士が同じOSの場合, その/usr以下については共有します. また,rootファイルシステムについてはディスクレスクライアントごとに 個別に持ちますが,その中の/sbinディレクトリの下の各ファイルについては NFSサーバ上でハードリンクし,ファイル実体を共有します.
●インストールCD-ROMからNFS root用にファイルを展開
----
# mount /cdrom
# cd /cdrom/bin           ← bin.aa, bin,ab,... のあるディレクトリに移動
# cat bin.?? | tar zxvpf - --numeric-owner -C /diskless/freebsd  ← 展開
----

/diskless/freebsd以下に展開されたファイルの中には, kernel.GENERICが含まれています. FreeBSD 4.2-RELEASEの場合は, このGENERICカーネルを使ってそのままディスクレスブートできるため, /diskless/freebsd/kernel.GENERICをkernelとリネーム (コピーまたはリンクでもよい)しておきます. (ちなみに4.1-RELEASEの場合はカーネルの再構築が必要でした)


○rcスクリプトの修正

FreeBSDでは,ブート時に/etc/rcスクリプトの中で, 自分がディスクレスクライアントかどうかを判断し, ディスクレスクライアントであった場合は /etc/rc.diskless1ファイルを実行するようになっています. この中では,/conf/etcというディレクトリにメモリファイルシステムを マウントするようになっているため, あらかじめ/conf/etcというマウントポイントを作成しておく必要があります. rc.diskless1によるブート処理では, rootファイルシステムはリードオンリーでマウントされたままになり, 書き込みが必要なディレクトリにはメモリファイルシステムがマウントされます.

しかし,このrc.diskless1による方法は少々FreeBSD独特という感じですので, 筆者は別の方法をとることにしました. 具体的には,/diskless/freebsd/etc/rc.diskless1を リネームして実行されないようにし, 代わりに以下のようにrc.confファイルを作成して 通常通りrootファイルシステムを書き込み可でマウントするようにするのです. さらにfstabにはNFS rootの記述が必要です.

●/diskless/freebsd/etc/rc.confの記述
----
root_rw_mount="YES"         ← rootファイルシステムを書き込み可でマウントする
nfs_client_enable="YES"     ← nfsiodを起動するようにする
----

●/diskless/freebsd/etc/fstabの記述例
(IPアドレスはNFSサーバのもの)
----
192.168.1.7:/diskless/freebsd  /  nfs  rw  0 0   ← NFS rootを記述
----

以上で本番のNFS rootの設定が完了しました. これで再びディスクレスマシンの電源を入れてみてください. 無事ディスクレスのFreeBSDがブートするはずです.(※注) あとは好みに応じて各種環境設定などを行って使用して下さい.

※注
ここで,4.1-RELEASEに付属のpxebootの場合, /boot/loader.rcなどのロードに異常に時間がかかるという問題があったのですが, 4.2-RELEASEでは問題は解決されているようです.

To『PXEを使ってPCもディスクレスにしよう』[index]


このページは、技術評論社 「パワーアップFreeBSD」および SoftwareDesign 2000年10月号、11月号『PXEによるネットワークブート設定術』の原稿を元に、Web 用に再構成したものです。
To 謎の処理系 SunOS 4.1.4 [Home]
yamamori