initramfsを試す

今までinitrdしか使ったことがなかったので、initramfsがどんなものか試してみる。

最小カーネルを作る

ramfs自体がファイルシステムなので、ext2さえも組み込まないカーネルでも動くはず

% cd linux-2.6.23.1
% mkdir build
% export KBUILD_OUTPUT=`pwd`/build
% make allnoconfig
% make menuconfig
General setup  ---> Initial RAM filesystem and RAM disk (initramfs/initrd) support
Executable file formats  --->  Kernel support for ELF binaries
この2つのみを追加
% make bzImage
% wc -c build/arch/i386/boot/bzImage
559032

最小initramfsを作る

カーネルは/initを実行しようとするので、この中でprocをマウントしてshを起動する
/dev/ram0はあえて作ってない

% cd initramfs
% mkdir bin proc
% cp /bin/busybox bin/busybox
% cat > init
#!/bin/busybox sh
mount -t proc proc /proc
exec busybox sh
^D
% chmod +x init
% find . | cpio -o -H newc | gzip > ../initramfs.gz

起動してみる

% qemu -kernel bzImage -initrd initramfs.gz -curses -hda dummy

面白い。dfやmountを実行してもルートディレクトリの表示が出てこない。
自動的に /root と /dev/console が作成されていた。

$ df
Filesystem           1k-blocks      Used Available Use% Mounted on
$ mount
proc on /proc type proc (rw)
$ find / | grep -v ^/proc/
/
/init
/proc
/bin
/bin/busybox
/root
/dev
/dev/console