おまぬけ活動日誌

最近のツッコまれどころ

この日誌から Google してもらう


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 としてみた。

本日のツッコミ(全6件) [ツッコミを入れる]
> okuji (2007年03月12日(Mon) 07:41)

そう言えば、cpio版のinitrdの場合、GRUBから簡単にinsmodできるんじゃない?って話が昔あったんですけど、やりませんか? :)

> zunda (2007年03月12日(Mon) 22:49)

ちょっと具体的にイメージすることができませんでした、すみません。えーと、カーネルをロードするのと同様にカーネルモジュールも個別にロードしちゃう、ということでしょうか?そうするとinitrd全体を展開するのに比べて必要な実メモリが少なくできるのかな…<br><br>Momongaのbranchのひとつにはgrub2が入ってるので、ビルドマシンが手配できたらいろいろいじってみたいな、とは思ってます。

> okuji (2007年03月12日(Mon) 23:58)

initrdの使い道の一つは、起動に必須なモジュールをあらかじめロードすることですが、GRUBからやってくれたらいいんじゃないの?って話だったような。<br>例えば、IDEのHDDにインストールしてて、それをSCSIのHDDに全部コピーしたとします。SCSIのドライバがカーネルに組み込まれていなければ、initrd作り直し、が普通の手順ですが、GRUBでinsmodできたら、initrdをそのまま流用できますよね。<br>GRUBが自動認識してくれない限りは、一般人向けにはなりえないと思うんですけど、分かっている人には使える機能かなあと思います。

> zunda (2007年03月13日(Tue) 13:21)

んー…。initrdに入っているカーネルモジュールはどれでもカーネル自体が起動してからinsmodできるような気がするのですがどうでしょう?カーネル自体が起動するには現状と同じくgrubがロードして制御を渡してくれるだけで充分ですよね?<br><br>initrdを作りなおすかどうか、という意味では、デバイス上にある素の(initrdの中ではなくてファイルシステム上のファイルとして存在する)カーネルモジュールを、grubがファイルシステムをマウントした上でinsmodさせてくれるのがうれしいような気がします。カーネルがマウントしていないファイルシステムにあるdepmodの結果をどうやってカーネルに知らせるか、が鍵になるでしょうか。

> okuji (2007年03月14日(Wed) 03:54)

うーん、言葉遣いで意志疎通がうまく行っていない気が。<br>GRUBがinsmodすると言ったのは「表面的にはそう見える」というだけで、もちろん実際にinsmodするのはLinuxです。問題はinitrdに入っていないモジュールはLinuxが起動時に利用できないということで、要は、GRUBがinitrdにモジュールをつっこんでやって、Linuxがそれをinsmodすればいいわけです。cpio -AをGRUBができれば済んでしまいそうです。<br>細かいことを考え始めると、依存関係をどうするかとか、大変になってくると思うのですが、基本的な部分は簡単そうです。

> zunda (2007年03月14日(Wed) 18:45)

やっとわかりました! 失礼しました。PCが起動するたびにgrubがmkinitrd(の一部)相当のことをやってくれて、その結果できあがったinitrdがカーネルに渡される、ということですね。基本的にはあとから必要になったカーネルモジュールを、もともとあるcpioアーカイブにメモリ上でくっつけて置いておく、ということになるわけですね。<br><br>どうせなら、Linuxカーネルからのramdiskへのアクセスをgrubがよこどりしてデバイス上の素のファイルを返してやればinitrdを一切作らずに起動が…それは大変か。<br><br>わくわくしてきました。はやくビルドマシンをなんとかしなくちゃ。


作り手とその取り巻きだけが楽しんでる間は本物じゃない。その中身が理解できない人々の生活を変えてこそ本物だ


zunda <zunda at freeshell.org>