diary/Kojima

・P-Plamo の内部構造(その2)

P-Plamo で使用している initrd.gz は isolinux/initrd.gz ですが, 参考のために,このファイルの中身は DVD イメージの initramfs/ 以下に残しています. isolinux/initrd.gz は,initramfs/ ディレクトリで

find . | cpio -ov -Hnewc | gzip > isolinux/initrd.gz

して作成しています.

カーネル 2.4 時代の initrd.gz は,あらかじめ ext2 等の形式で作成した
ファイルシステムを ramdisk 上に展開する形式でしたが,2.6 カーネルでは
あるディレクトリ以下を cpio + gzip で圧縮した initramfs 形式に変更されました.
initramfs 形式だと,サイズ固定のファイルシステムをあらかじめ用意しておく
必要がなくなった分,作成の手間は減りました.なお,従来の initrd.gz 
形式もそのまま利用できますし,ファイルシステムイメージを指定するカーネル
オプションは initrd=... のままで、形式の違いはカーネルが自動的に見分けてくれます。

initramfs ディレクトリには init スクリプトと以下のようなディレクトリがあります.

% ls -F initramfs/
bin/    dev/  init*  loop/        new_root/  put_old/
cdrom/  etc/  lib/   lost+found/  proc/      sys/

この init スクリプトが DVD メディアを探してマウントしたり, そこにある squash-fs イメージをマウントしたりして環境を整える仕事をする, P-Plamo の最も重要なファイルです.このファイルの処理については後述します。

bin ディレクトリには init スクリプトが使用するコマンドを収めています.

% ls -F bin/
busybox*  cut@    insmod@   lsmod@     pivot_root@  switch_root@
cat@      df@     ln@       mkdir@     rm@          umount@
chroot@   dmesg@  losetup@  modprobe@  sh@
cp@       grep@   ls@       mount@     sleep@

上記のように initramfs では,static link した busybox のみが実体で, 残りのコマンドは busybox へのシンボリックリンクになっています.実は, busybox には上記以外のコマンド(applet)も組み込んでいますが, リンクは必要なものしか作っていないので,init の機能を拡張したい場合, 必要なコマンドが busybox に入っていないかを調べてみてください.

dev ディレクトリにはブロックデバイスを中心に,各種デバイスファイルを 収めています.

% ls -F dev
console  hda7   hdb9    mtdblock0  ptyp8   sda   sdc1  sde1  tty0   ttyp1
fb0      hda8   hdc     mtdblock1  ptyp9   sda1  sdc2  sde2  tty1   ttyp2
fb1      hda9   hdd     mtdblock2  ram     sda2  sdc3  sde3  tty2   ttyp3
...
hda6     hdb8   mtd3    ptyp7      scd7    sdc   sde   tty   ttyp0

initramfs の段階では udev が動いていないので,DVD や USB メモリをマウントする際に必要になりそうなデバイスファイルをあらかじめ用意しています. これらのデバイスファイルが有効なのは initramfs の中だけで、squash-fs 上の rc.S が動き出せば、必要に応じたデバイスファイルが新たに作成されます。

lib ディレクトリの下には modules ディレクトリがあり, そこに initramfs の動作に必要なモジュールドライバを集めています.

% ls -F lib/modules/
aufs.ko   ide-cd_mod.ko  nls_ascii.ko  nls_euc-jp.ko     sqlzma.ko    unlzma.ko
cdrom.ko  loop.ko        nls_cp437.ko  nls_iso8859-1.ko  squashfs.ko  vfat.ko
fat.ko    msdos.ko       nls_cp932.ko  sg.ko             sr_mod.ko

ここに収めたモジュールドライバは DVD/USB メモリをマウントしたり, squash-fs を loopback でマウントするために必要なもののみです. これら以外のモジュールドライバは squshfs 内の /lib/modules ディレクトリ から読み込まれます.

etc ディレクトリには,P-Plamo 用に修正が必要な設定ファイル等を 収めています.

% ls -F etc
Xsession*        csh.login  inittab         rc.M.modified*  xinitrc_kde*
Xsetup*          cups/      passwd          rc.S.modified*
caps2ctr_config  fstab      rc.4.modified*  shadow

これらのファイルは squash-fs 上で置きかえてもいいのですが, squash-fs は作成にかなり時間がかかる(数時間のオーダー)ので, 試行錯誤的な修正には向かないため,修正が必要なファイルは とりあえずここから union mount したディレクトリにコピーして 試してみるようにしています.そのため,このディレクトリのファイルは 適宜変更されたり,追加,削除されたりするのでご注意ください.

残りのディレクトリは DVD/USB メモリをマウントしたり,proc-fs や sys-fs をマウントするための場所として用意しており,中身はありません.

これらのデバイスファイルや各種コマンドが有効なのは initramfs の処理中のみで、 squash-fs 上の実際のルートファイルシステムに切り替わると initramfs 上のデータは全て削除され、利用できなくなります。



トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2021-12-17 (金) 16:35:41