initrd/initramfs
initramfsの中身を調べる
方法としては initramfsを解凍する方法もあるが,改変することを考えるとソースとなるディレクトリを知る必要がある
使用したディストリビューションはArch Linux.
ソースディレクトリの特定
カーネルビルドにおいてmake installをすると/boot以下にカーネル本体の他にinitramfsが生成される.
このinitramfsを生成するのはArch linuxではmkinitcpioコマンド(シェルスクリプト)である.
mkinitcpioの中身を確認する.
$ less `which mkinitcpio`
中身を見ると,initramfsの中身の所在は/lib/initcpio/にありそうだとわかる
$ ls /lib/initcpio busybox* functions hooks/ init* init_functions install/ udev/
busyboxが入っているところを見るとビンゴっぽい
/initの中身を読んでみる
/lib/initcpio/initがinitramfsをマウントした時の/initになるわけで,
このスクリプトが仮のルートファイルシステム(initramfs)からリアルルートファイルシステムへ移行するための処理をするはずである.
読んでみる
$ emacs /lib/initcpio/init
(抜粋) mkdir -p /new_root ... ${mount_handler:-default_mount_handler} /new_root ... for d in proc sys dev run; do if [ -d /new_root/${d} ]; then mount --move /${d} /new_root/${d} else umount /${d} fi done exec env -i TERM=$TERM /sbin/switch_root -c /dev/console /new_root ${init} "$@"
initの中では後にリアルルートになるファイルシステムを/new_rootとして作成する.
/new_rootがのちのリアルルートディレクトリになるもので,default_mount_handler(init_functionsに記述)によりnew_rootにディスク(ルートディレクトリとなるディスクパーティション)をマウントする.(まだ詳しくは調べていない)
最後にmount --moveによって/proc, /sys, /dev, /runを/new_root/以下に移動する.
以上で準備が完了するのでswitch_rootコマンドによってルートディレクトリを/new_rootに変更し,/sbin/initを実行する.
他にもいくつか処理があるので,調べるが,今回はここまで終わり