[[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 な世界なのかも知れん..

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS