読者です 読者をやめる 読者になる 読者になる

initrdに全部入れるアイディア

VIVERはやたら高機能化したinitrdですが、initrdの中にWebサーバーから何から何まで入れておけば、initrdだけでWebサーバーになるはず。initrdはブートローダでロードできれば良いので、普通にTFTPサーバーとDHCPサーバーを用意すればネットワークブートも簡単です。

そして、たしかopenSUSEか、どこかのLinuxディストリビューションのカーネルパッチに、「カーネルパニックが起こったら再起動するパッチ」があったはず。そして、initrdの中の/initが終了してしまい、かつ/sbin/initが実行できないと、カーネルはカーネルパニックになります。つまり、このパッチを当てたカーネルを使っていれば、何か異常が見つかったら/initを終了させると自動的に再起動させることができます。ただ、無限再起動ループに陥らないように制限をかけたいところですが、なかなか難しそうです。


全部initrdに入れると、initrdは全部RAM上に展開されるので、サイズを小さくしておかないとRAMを圧迫してしまいます。ただ、ここのところはRAMを8GBくらい積めば解決できそうです。

それから、カーネルのコンフィグレーションで、Device drivers --> Block devices --> Default RAM disk size(CONFIG_BLK_DEV_RAM_SIZE)を増やしておく必要があります。drivers/block/rd.cで使用されています(linux-2.6.21.5)。しかし、もしかしたらブートローダの方でもinitrdのサイズに制限があるかもしれません。


initrdはTFTP(=UDP。TCPでは提供される輻輳制御などは無い)で転送されるので、一斉に多数のマシンをネットワークブートしたときにネットワークが破綻しないか心配です。
これに関連して、試したことはないのですが、PXEではTFTPでファイルを転送する際に、マルチキャストを使うことができるようです。PXEの仕様書に書いてあります(仕様書に書いてあるからと言ってすべてのNICが実装してあるかは不明ですが、少なくともPXEの開発元のIntelのNICには実装してありそう)。ただ、ブートローダはNIC上のROMに実装されたTFTPクライアントが受信することになりますが、initrdはブートローダが受信します。そのあたりでinitrdの転送にもマルチキャストTFTPが使えるかどうかは良く分かりません。見たところ、Linuxのネットワークブートで一般的に利用されるブートローダであるpxelinuxは、サポートしていないようです。

そこで、極めてトリッキーで、うまくいくかどうかサッパリ分からないですが、マルチキャストでinitrdを転送できそうな方法がありました。PXE ROMの代わりとして使えるEtherbootは、ブートローダの転送にマルチキャストTFTPを使えます。そして、Etherboot(PXE ROMでも?)はmemdiskをブートローダに見立ててロードすることができるようです。syslinuxソースコードの中にあるmemdisk/memdisk.docを読むと、memdiskとはフロッピーかHDDのディスクイメージで、HDDのディスクイメージである場合には、MBRとパーティションテーブルを含んでいるものです。GRUBと巨大なinitrdをインストールしたHDDイメージをmemdiskとし、Ehterbootの解説にあるパッチを当てたmknbiで、PXEでロード可能な形式にします。これを使ってEtherbootを使ってブートすれば、マルチキャストでmemdisk(initrdを含む)が転送できる、はず。

マルチキャストTFTPをサポートしたTFTPサーバーにはatftpがあり、Debianのパッケージからソースコードを取り出せます。


ところで、実はinitrdには2つのタイプがあり、新しいタイプはgzipされたcpioアーカイブなのですが、その前はgzipされたext2ディスクイメージでした。前者はinitrdと区別してinitramfsと呼ばれることがあります。後者のext2ディスクイメージですが、ファイルシステムタイプはext2でなくても良く、カーネルにビルトインされたファイルシステムタイプであれば何でも利用することができます。つまり、SquashFSなどの圧縮ファイルシステムも使えます。