2007年03月09日(Fri) ちょっとVog? [長年日記]
● 古い方の自動車のオイルを交換。快調♪ でも、なんだか料金が高くなったような気がする。次回からは自分でやるかな…。待ち時間に、「入門UNIXシェルプログラミング第2版」を読み終えて、「Working effectively with legacy code」を読みはじめた。
● 86個のIPアドレスから104個のツッコミSPAMをいただいた。ワンタイムトークンで1個も受け付けずに済んだ。よしよし♪
● cpioにファイルのリストを渡すfindコマンドに-depthを付けるとうまく解凍できないアーカイブができる
「入門UNIXシェルプログラミング第2版」日本語版の322ページに、cpioにファイルのリストを渡すfindマンドには-depthオプションを付けるのが普通だ、と書いてあった。さっそくDocoMomoで試してみると、マウントできないinitrdイメージができてしまった。なぜだろう。
できたinitrdイメージをその場で解凍してみると、「cpio: sbin/cfdisk: そのようなファイルやディレクトリはありません」といったエラーメッセージが沢山表示され、解凍後のツリーにはほんの少数のファイルができた。できるファイルとできないファイルの違いはわからなかった。
findコマンドのマニュアルには、-depthコマンドは「ディレクトリ本体の前に、ディレクトリの内容を先に評価する。」とある。info findを見ると、こうやって作ったcpioファイルは--make-dirオプションを付けて解凍するようだ。カーネルがinitrdを解凍するときにはこのオプションは使わないような解凍をする、ということなんだろうな。
そうすると、逆にディレクトリを先にアーカイブして欲しくなるが、findにはディレクトリを先にする、というオプションは無いようだった。念のため、find . -print0 | sort -z | cpio -o -c -0 としてみた。
そう言えば、cpio版のinitrdの場合、GRUBから簡単にinsmodできるんじゃない?って話が昔あったんですけど、やりませんか? :)
ちょっと具体的にイメージすることができませんでした、すみません。えーと、カーネルをロードするのと同様にカーネルモジュールも個別にロードしちゃう、ということでしょうか?そうするとinitrd全体を展開するのに比べて必要な実メモリが少なくできるのかな…<br><br>Momongaのbranchのひとつにはgrub2が入ってるので、ビルドマシンが手配できたらいろいろいじってみたいな、とは思ってます。
initrdの使い道の一つは、起動に必須なモジュールをあらかじめロードすることですが、GRUBからやってくれたらいいんじゃないの?って話だったような。<br>例えば、IDEのHDDにインストールしてて、それをSCSIのHDDに全部コピーしたとします。SCSIのドライバがカーネルに組み込まれていなければ、initrd作り直し、が普通の手順ですが、GRUBでinsmodできたら、initrdをそのまま流用できますよね。<br>GRUBが自動認識してくれない限りは、一般人向けにはなりえないと思うんですけど、分かっている人には使える機能かなあと思います。
んー…。initrdに入っているカーネルモジュールはどれでもカーネル自体が起動してからinsmodできるような気がするのですがどうでしょう?カーネル自体が起動するには現状と同じくgrubがロードして制御を渡してくれるだけで充分ですよね?<br><br>initrdを作りなおすかどうか、という意味では、デバイス上にある素の(initrdの中ではなくてファイルシステム上のファイルとして存在する)カーネルモジュールを、grubがファイルシステムをマウントした上でinsmodさせてくれるのがうれしいような気がします。カーネルがマウントしていないファイルシステムにあるdepmodの結果をどうやってカーネルに知らせるか、が鍵になるでしょうか。
うーん、言葉遣いで意志疎通がうまく行っていない気が。<br>GRUBがinsmodすると言ったのは「表面的にはそう見える」というだけで、もちろん実際にinsmodするのはLinuxです。問題はinitrdに入っていないモジュールはLinuxが起動時に利用できないということで、要は、GRUBがinitrdにモジュールをつっこんでやって、Linuxがそれをinsmodすればいいわけです。cpio -AをGRUBができれば済んでしまいそうです。<br>細かいことを考え始めると、依存関係をどうするかとか、大変になってくると思うのですが、基本的な部分は簡単そうです。
やっとわかりました! 失礼しました。PCが起動するたびにgrubがmkinitrd(の一部)相当のことをやってくれて、その結果できあがったinitrdがカーネルに渡される、ということですね。基本的にはあとから必要になったカーネルモジュールを、もともとあるcpioアーカイブにメモリ上でくっつけて置いておく、ということになるわけですね。<br><br>どうせなら、Linuxカーネルからのramdiskへのアクセスをgrubがよこどりしてデバイス上の素のファイルを返してやればinitrdを一切作らずに起動が…それは大変か。<br><br>わくわくしてきました。はやくビルドマシンをなんとかしなくちゃ。
最近のツッコまれどころ