ディスクレスを実装してみる。

先ずは、「PXEでディスクレス・クライアントを実現するには」を参考にディスクレスを実装してみる。この記事は比較的新しい(2007年4月11日)だが、Fedora Core 6をベースとしているので、2ヵ所Fedora 8と違うところがあったが、大体、この通りやっていけばディスクレス・クライアントを「ブートするところまで」は何とかできる。大変役立った。(が、問題は、その先。ログインできるところまで持っていくのに手間取った。この記事にはそこまでの手順は書いていない。)

DHCP、TFTP、PXEについては前回の実装のまま。ただ、tfptdのルートディレクトリを/tftpbootから/home/TFTPbootへ変えていたが、最初これでは上手くいかなかったので、一旦、/tftpbootを使って実験した。また、/tftpbootにクライアントのルートファイルシステムを格納するが、サブディレクトリは「f8」という名前にした。(上記、記事では「fc6」である。)

最初、気付かなかったが、/tftpbootの下には2つのサブディレクトリが出来ることになる。一つは、tftpdを使ってPXEローダ(pxelinux.0)やLinuxカーネル+initrdをダウンロードするためのもので、素直に「linux-install」という名前にした。もう一つはクライアントのファイルシステムを格納するディレクトリで、今回はクライアントのOSもFedora 8を使ったので「f8」とした。最初この2つのディレクトリを混同してしまって失敗した。

あと、クライアント用のファイルシステムを /tftpboot/f8/root/の下に格納するわけだが、当然、3GBとか4GBののサイズになる。サーバ用のOSがやはり3GB以上は使っているので、ルートファイルに余裕がないと苦しい。(後述するように一通りブートまで確認したところで、クライアントのファイルシステム、すなわち「f8」は/home/TFTPbootへ引っ越した。)

ちなみに、/tftpboot/f8/rootはFedora 8を使う複数のクライアントで共通に使われる。しかし、中には共有できないファイルやディレクトリがある。例えばホスト名を格納しているファイルとか。それらはそれぞれのクライアント毎に「/tftpboot/f8/snapshot/クライアント名/」というディレクトリに格納される。PXEサーバでは共用部分はrootの下、個別部分は"shapshot/クライアント名"の下と分けているが、クライアントからは、まずrootをローカルの / にRead OnlyでNFSマウントし、次に、個別のファイルやディレクトリを"その上に"Read/WriteでNFSマウントするので、一つのファイルシステムと見える。その代わり、クライアントでmountコマンドを使って見るとわかるが、もの凄い数のNFSマウントを行なっている。(正直、余り美しくない。クライアントの数が少ない場合は、2GBくらいだったら、各クライアント毎に専用のファイルシステムを割当てて構わないと思った。)

更に注意しなければならないのは、用意するクライアント用のファイルシステムである。上記記事のなかでは、サラリと「稼働しているLinux(ここでは、FC6)を用意して、そこから全ファイルをコピーするのが一番簡単な方法だ」と書いているが、(確かにその通りなのだが)クライアント用のOSとなるので、この段階で設定を注意した方がいい。例えばSELinuxはdisableにしておく(最低でもpermissiveにしておく)必要がある。また、xorg.confも出来るだけ汎用性のある記述にしておいた方がいい。これらの点に注意しておかないと、カーネルはブートできても、途中で(例えば /dev/consoleが見当たらないとかで)パニックになったり、Xウィンドウが立ち上がらない、コマンドラインでもログインできない、という障害が待ち受けている。ちなみに、私はVMware Serverで一つ仮想マシンを作って、そのマシンでクライアント用のLinuxを作成した。

それと、上記記事で取り扱ったFC6と私が使ったF8とで若干手順がことなる。一つ目はクライアントのカーネルを起動する際のパラメータを記述する「/tftpboot/install-linux/pxelinux.cfg/クライアントごとの記述ファイル」に対して「このファイルのappendの行に『ramdisk_blocksize=1024』を追加する。この設定を行わないと、クライアントの起動時にKernel Panicが発生する。」とあるが、これは追加しなくても問題なかった(というか「ramdisk_size=20920」という設定でデフォルトでされていた)。もう一つは、「クライアント起動用のイメージファイルにmount.nfsを追加する。この作業を行わないと、クライアントがNFSでのマウントに失敗する。」とあるが、これも必要ない。F8のディスクレスクライアント用のinitrd.imgにはNFSマウントのコマンドは入っていた。(ちなみに、F8(確かFC6でも同じだったと思うが)のinitrd.imgはファイルシステム・イメージではなくcpioのアーカイブ形式になているのでmount -o loopではマウントできない。cpioコマンドを使って展開する必要がある。(例えば「cpioフォーマットのinitrdイメージの展開と作成」を参照。)