about initrd.img

記事を書いた日 2009/01/17

initrd.imgのいじりかた

initrd.img起動時にLinuxカーネルが動的に読み込むモジュールを集めたものがinitrd.imgです。
たいてい/bootとかにおきますね。
ブートローダの設定とかで

title           Ubuntu 8.04.1, kernel 2.6.24-22-generic
root            (hd0,0)
kernel          /boot/vmlinuz-2.6.24-22-generic root=hogehoge ro quiet splash
initrd          /boot/initrd.img-2.6.24-22-generic
こんな感じでかいてあったりしますね。
initrdは、普通はカーネルコンフィグにしたがって作ると思いますが、カーネルモジュールを一つだけ差し替えたいということが(普通はないですが)あると思います。
そんなときに見るメモです。

initrd.imgの展開

まずはファイルの種類を見る。
file /boot/initrd.img-2.6.22-14-generic
/boot/initrd.img-2.6.22-14-generic: gzip compressed data, from Unix, last modified: Wed May 28 20:00:30 2008, max compressio
gzipらしいです。
まずファイル名を変えます
mv initrd.img-2.6.22-14-generic i.gz
で、とりあえずgzipを解きます。
gzip -d i.gz
ファイルの種類を確認します。
yoshi@bune:/tmp$ file i
i: ASCII cpio archive (SVR4 with no CRC)
ASCII cpioとあります。manを見て確認しました。cpioファイルを伸張します。
cpio -i  < i
カレントディレクトリに展開されてしまうので、ディレクトリを作成し、そこにコピーして↑のコマンドを実行するのが望ましいでしょう。
mkdir test
cp i cpio
cd cpio
cpio -i  < i
こんな感じでしょうか。できたら確認してみます。
ls
bin/  conf/  etc/  i  init*  lib/  modules/  sbin/  scripts/  usr/  var/
うまく伸張できたようです。カーネルモジュールは
./lib/modules/2.6.22-14-generic/kernel
とかにあります。で、必要なモジュール類を差し替えたりします。
例えばe1000.koを差し替える場合は、手元に差し替えるe1000.koがあるとして
cp .e1000.ko ./lib/modules/2.6.22-14-generic/kernel/drivers/net/e1000
こんな感じでしょうか。

次はこれららの展開したモジュールをまた一つにまとめて、起動時に読み込めるようにします。

圧縮など

さっきcpioファイルを伸張したディレクトリで作業します。
ls
bin/  conf/  etc/  i  init*  lib/  modules/  sbin/  scripts/  usr/  var/
iは伸張元のファイルなので、いらないので消します。
rm i
次にこれらのふぁいるを一つにまとめます。
ASCII cpio archive (SVR4 with no CRC)
という形式にあわせるようにオプションをつけます。findコマンドを使用して、現在のディレクトリ以下の全てのファイル名をcpioコマンドに渡します。
find | cpio --quiet -o -H newc > i.cpio
cpio: File ./i.cpio grew, 2670592 new bytes not copied
ls
bin  conf  etc  i.cpio  init  lib  modules  sbin  scripts  usr  var
file i.cpio
i.cpio: ASCII cpio archive (SVR4 with no CRC)
こんな感じでひとつにまとめたi.cpioができました。元のファイルはgzipだったので次にgzipで圧縮します。
max compression
という記述があったので、manを見て確認しました。
>-9 と --best は最も遅い圧縮法を示す
とあったので、-9をつけます。
gzip -9 i.cpio  > i.cpio.gz
gzip: i.cpio.gz already exists; do you wish to overwrite (y or n)? y
ls
bin  conf  etc  i.cpio.gz  init  lib  modules  sbin  scripts  usr  var
file i.cpio.gz
i.cpio.gz: gzip compressed data, was "i.cpio", from Unix, last modified: Sat Jan 17 04:08:21 2009, max compression
できたようなきがします。

こちらのサイトを参考に(というかそのままですが)しました。ありがとうございました。
http://d.hatena.ne.jp/kakurasan/20080430/p1
最終更新:2009年01月17日 04:16
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。