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を実行する.

他にもいくつか処理があるので,調べるが,今回はここまで終わり