低レベル関係

最近は低レベル系の人が張り切ってますね。一応言っておくと「低レベル」と言っても技術者の言う「低レベル」は一般の人の意味とは違います。レイヤが低いという感じの意味ですね。

というわけで私もBinary Hacks(amazon.co.jp)という本が意外に面白いので買ってみたり。この本は100個の”Hack”と称して低レベルな話が載っていますが、誰しも101個目のHackを持ってるんじゃないでしょうか。私はあまり凄い人ではないので、あの本よりも高いレイヤにはなってしまいますが、役に立ちそうなものを1つ紹介しておきます。

★Hack #10101 initrdで遊ぶ

Linuxのブート時のある時期に、initrdというファイルが読み込まれます。ブート時に指定できるんで、指定しなければ読み込まれないんですけど、grubもliloもsyslinuxもpxelinuxもinitrdを読み込む機能はついていますから、普通は読み込む。そんでこのinitrdの内容が一旦/としてマウントされた状態になるんです。本来の/がマウントされる前にちょっとした処理ができるようになっている。

initrdのフォーマットは昔はext2とかのファイルシステムが圧縮されたものだったんですけど、最近はcpioが圧縮されたものになってます。通常このinitrdファイルを作るのはmkinitrdというコマンドで、中身はスクリプトになってます。特に難しいことはしていません。nashがinitとして動いてモジュールをロードしてデバイスを作り、マウントして/を切替えているだけです。

nashは大したスクリプト言語ではなく、条件判断もできませんが、insmodやmount、echo、sleepなどの内部コマンドの実行に加えて、外部コマンドを呼び出すことができます。mkinitrdが作るinitrdのnashスクリプトは、initrdの中に入っているディスクのドライバモジュールを読み込んでmountするわけです。サンプルを見たいなら、gzip+cpioでシステムのinitrdファイルを展開してスクリプトを見てみるといいです。man nashにも有用な情報が書いてあります。

initrdとnashを応用すればいろんなことができます。1FD LinuxやCDで上げるLinuxではけっこう変なinitrdが使われてるんじゃないかなという気がする。

●カーネルのリコンパイルなしでNFS Rootを実現する

例えば、NICのドライバを読み込んで自分のIPアドレスを設定し、NFSのドライバを読み込んでNFSを/にマウントすることもできます(nashの内部マンドのmountはNFSに対応していないので外部コマンドとしてinitrdの中に入れる必要があります)。普通はNFSを/にするにはカーネルをリコンパイルする必要がある、とされていましたが、initrdに必要なドライバとスクリプトを入れておけばわざわざリコンパイルする必要はなく、ディストリビューションのカーネルをそのまま使うことができます(少なくともRed Hat Enterprise Linux 4系やFedora Core 3〜5は大丈夫でした)。

とは言え、システムにはNFSで他のマシンと共有できないディレクトリもありますので、Root環境を快適に使うにはもう少しの工夫は必要になります(大したことではないです。/var/runや/var/lock/subsys、/etc/mtabの処理とかそういう)。

NFSと同じ要領で、iSCSIを/にマウントすることもたぶんできます(iSCSIrootは私はやったことがないです)。

●tmpfs rootでディスクレス環境

また、本来の/自体を全部initrdの中に埋め込んでおき、tmpfsを/にマウントしてファイルを展開してswitchrootしてディスクレス環境に、というのもなかなかおもしろいテクニックです(これが意外に快適なんです!)。

●まとめ

initrdはちょいと遊ぶに値するということを説明しました。面倒なので実例は出してませんが、暇ができたら遊んでみるといいと思いますよ。ブートローダにもよりますが、けっこう無謀なこともできちゃいますので。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です