initrdってKernel 2.6から(?)フォーマットが変わったんですね。いつの間に? ext2からcpioになってるよ。でもext2でも受け入れてくれるみたいだ(たぶん)。
pxeブート+nfsrootで上げるときの問題だけど、/をマウントするときにネットワークが有効じゃなきゃいけないから、カーネルが上がったときにDHCPで設定を取ってくることになる。IPAPPENDと書けば、pxeのときにもらったIPアドレスを使って、カーネルのパラメータでIPアドレスその他が渡されるから、改めてDHCPで取ってくる必要は本来はないんだけど。
でもこのカーネルレベルのIP-Configって、NICのドライバをモジュールにしてるとダメなのね。だからカーネルをコンパイルするときに、必要そうなNICのドライバは組み込みにしとかなきゃいけない。モジュール対応パッチというのをMLのアーカイブで見つけたけど、却下されていた。「モジュールが読める環境(initrd内)があるなら、そこでユーザレベルのDHCPクライアント使えばいいじゃん」てなもんだ。そりゃそうだ。
でも普通のmkinitrdではそんなinitrdを作ってくれない。initrd内にdhclientやpumpを入れれば恐らく問題はないと思う。ていうか最小構成はinitrdだけでいい。DHCPでIPアドレスもらってsshd上げときゃそれで済むんならinitrdのみでも問題ない話な気がする。initrdの中にgccとdistccdを押し込めとけば、DHCPとtftpのサーバを立てるだけで、一時的にコンパイルの子機を増やすのも楽になるなぁ。これは20MBもあれば十分かな。20MBあればXも上がる気がする。initrdの限界はramsizeだと思うけど、initrdの容量制限がどのくらいかは気にしとこう。
initのnashのスクリプトの最後のほうでswitchrootとかしないで、sshdとdistccdだけ上げてからコンソール用の/bin/shでも上げとくがいいじゃないかな。
そう、NFSと言えばnfsrootも問題で、nfsroot対応のカーネルにしなきゃいけない。しょうがないので、Fedora Core 3だとkernel-2.6.specをいじってリビルドすることになる。
--- kernel-2.6.spec 2005-04-08 08:20:13.000000000 +0900 +++ kernel-2.6.spec.rootnfs 2005-04-25 18:06:56.000000000 +0900 @@ -641,6 +641,19 @@ for i in *.config do mv $i .config + cat <<EOF >> .config +CONFIG_NFS_FS=y +CONFIG_ROOT_NFS=y +CONFIG_IP_PNP=y +CONFIG_IP_PNP_DHCP=y +CONFIG_IP_PNP_BOOTP=y +CONFIG_IP_PNP_RARP=y +CONFIG_NET_PCI=y +CONFIG_E100=y +CONFIG_E100=y +CONFIG_E1000=y +CONFIG_TIGON3=y +EOF Arch=`head -1 .config | cut -b 3-` make ARCH=$Arch nonint_oldconfig > /dev/null echo "# $Arch" > configs/$i
もともとnfsrootのためにカーネルの設定を必要とする理由はよくわからない。initrd内である程度までがんばれば、あとはnfsrootの設定なしでも/にNFSを使えるんじゃないかと思う。それができればカーネルのコンパイルが必要なくなるから、楽なんだけどな。
なんでこんなこと考えてるかっていうと、家でコンパイルに時間がかかるときとかどうにかならないかな、と。余ってるマシンは普段電源を入れてないし、上がるOSも定かじゃなくて、その中でコンパイラが違ったりするとdistccは使えない。コンパイルの親玉(いつも使っているノートPCなんだが)で、子機でブートする環境まで含めて全部コントロールしたい&どうせならできるだけ高速にブートさせたい&できれば無駄なカーネルコンパイルはしたくない、と。
もしかしたら仕事でも使えるかもしれないしね。JavaのVMとマイグレーションを受けつけるサーバを(よく知らないけどRMIのアレとかで?)でも上げとけば、少しは真面目に使えるかもしれない。返す返すもよく知らないけど。
ただ、自宅で余ってる、BIOSの設定項目すら出てこないメーカー製マシンがPXEブートに対応してるかどうかってとこが最大の不明点なわけだが(笑)。