[[diary/Kojima]]
・initramfs
年明けくらいから initramfs 回りをあれこれいじって,何とか initramfs 上
で SCSI や RAID 用のモジュールを組み込んで起動できるようになったので備忘録用のメモ.
- initramfs は 2.4 カーネルまでの initrd に置き代わる機能で,initrd の
ようにファイルシステムイメージを作らなくとも,必要なディレクトリとファ
イルを cpio(cnew 形式 = -c or -H cnew オプションで指定) + gzipで固めることで作成可能.
今までインストーラを作る時は,
あらかじめ適当なサイズのファイルを用意→ファイル上にファイルシステムを
作成→loopback でマウントしてファイルやスクリプトの操作→umount してファ
イルシステムを圧縮
みたいな手順が必要だったが,これを一つのディレクトリに必要なファイルを固めて
# find . | cpio -c -o | gzip > newinitrd.gz
みたいに作れるのはかなり便利.
- カーネルパラメータの initrd オプションで指定して渡すこともできるが,
カーネルに組み込んでしまうことも可能らしい.まだこの機能は試してないけど,
どういう風に使うことを想定しているのだろう?
- カーネルは起動後,initramfs があればそれを自動的にメモリ上に取った
rootfs としてマウントし init コマンドを実行する.init は /bin/sh へのシ
ンボリックリンクにすれば対話モードで起動するし,シェルスクリプトとして
組み込みたいモジュールや実際のルートパーティションをマウントするために必
要な処理を行うことも可能
- 必要な処理を終えて実際のルートパーティションをマウントする際,initrd
では pivot_root でルートファイルシステムを切り替えていたが,initramfs
で switch_root という機能を使うことになる.
- initramfs 上では busybox(1.1 以降) + uClibc, nash(RH製のスクリプト実
行用 minimum shell),klibc(initramfs 用の glibc2 の最小サブセット) の
3 つのツールが使えるらしい.busybox は switch_root が入っている最新版の
1.1.0-pre1 としばらく格闘したが,このバージョンの busybox は
switch_root が機能しない模様.nash なら動くことを確認.klibc はまだ試し
ていない.
- 手元で試した init スクリプトはこんな感じ.fc4 の initrd に入っていた
ものを適当に切り貼り.fc4 の場合はコメントアウトしているところで udev
を使って動的にデバイスファイルを作るが,Plamo の場合は initramfs 上の
/dev 以下に必要なデバイスファイル(ディスク回り用中心でいいのかな?) を
用意しておく必要あり.あちこちに sleep が入っているのは動作確認用.
#!/bin/nash
mount -t proc /proc /proc
setquiet
echo Mounted /proc filesystem
echo Mounting sysfs
mount -t sysfs /sys /sys
# echo Creating /dev
# mount -o mode=0755 -t tmpfs /dev /dev
# mknod /dev/console c 5 1
# mknod /dev/null c 1 3
# mknod /dev/zero c 1 5
# mkdir /dev/pts
# mkdir /dev/shm
# echo Starting udev
# /sbin/udevstart
# echo -n "/sbin/hotplug" > /proc/sys/kernel/hotplug
echo "Loading SCSI modules"
insmod /lib/scsi_mod.ko
insmod /lib/sd_mod.ko
insmod /lib/mptbase.ko
insmod /lib/mptscsih.ko
sleep 5
echo "Loading md modules"
insmod /lib/md.ko
insmod /lib/raid1.ko
mdadm -A /dev/md0
sleep 10
echo "Loading LVM modules"
insmod /lib/dm-mod.ko
mkdmnod
sleep 30
lvm vgscan --ignorelockingfailure
lvchange -ay --ignorelockingfailure /dev/MyLV/lvol0
sleep 30
echo Creating root device
mkrootdev /dev/root
echo Mounting root filesystem
mount -o defaults --ro -t reiserfs /dev/root /sysroot
sleep 10
echo Switching to new root
switchroot --movedev /sysroot
mkdmnod とか mkrootdev,switchroot は nash が提供している機能だが,イマ
イチ何をどう操作しているのか分らない.man ページくらいしか解説がない
のでソースを見るしかないかな.
initramfs の正式な解説文書も 2.6.15 になって
ようやく Documents/filesytem に入った(これがあったのでイジる気になった)ような
ところだから,ある意味 black magic な世界なのかも知れん..