initramfsとinitrd (Initial RAM Disk)はgrubなどのboot-lodaerでvmlinuz等のkernelイメージを読み込んだ後の処理を引き継いでrootfsをマウント、initを起動するものです
initrdはまず、ddコマンドで必要なサイズのファイルを作りそれをloopbackマウントしファイルシステムを構築して、その中にinit起動までに必要なコマンドやmodules詰め込みます
initrd用のMakefile #Create pepo26.img dd if=/dev/zero of=${INITRD} bs=1k count=8192 2>/dev/null 1>/dev/null mke2fs -m 0 -q -F -N 8192 ${INITRD} 2>/dev/null 1>/dev/null tune2fs -i 0 -c 0 ${INITRD} 2>/dev/null 1>/dev/null rm -rf ${MNTPNT}/lost+found mount -t ext2 -o loop ${INITRD} ${MNTPNT} mkdir -p "${MNTPNT}/${DSTMODDIR26}" cp -ap ${SINITRD}/* ${MNTPNT} for i in ${ADDMODULES26}; do mod="`find ${SRCMODDIR26}/kernel -name "$${i}.ko" 2>/dev/null`" ; [ -f "$${mod}" ] && cp -af $${mod} ${MNTPNT}/${DSTMODDIR26}/; done
kernelが2.6.xxからinitramfsが採用され、予めファイルサイズに制限を加えたloopbackファイルを作る必要がない為、自由度がある
PepoLinuxでは手抜きでmodulesを全てコピーして入れ込み14M程のサイズとなっています
intramfsはまず、適当なディレクトリを作りその中に必要なファイルを詰め込みcpioとgzipで固めます
initramfs用のMakefile #Create pepo26.img mkdir -p "${MINITRD}/${DSTMODDIR26}" cp -ap ${SINITRD}/* ${MINITRD} cp -af ${SDRIVER} ${MINITRD}/${DSTMODDIR26}/ cp -af ${SMODDEP} ${MINITRD}/${DSTMODDIR26}/ umount ${MNROOT} (cd ${MINITRD}; find . | cpio -o -H newc ) | gzip -9c > $@.img rm -rf ${TMP} ${MNT} ${ISOLINUX}
initrdとinitramfsの違いはミニルートに/initがあればinitramfs
initrd場合:
イメージ: ファイルシステム (ext3など + gzip)
実装: ブロックデバイス (RAM ディスク)
実行: /linuxrc
rootfsをディレクトリへマウントして→pivot_root
/linuxrc 終了させると、カーネルがinitを起動
initramfsの場合:
イメージ アーカイブ (cpio + gzip)
実装: ファイルシステム
rootfsを適当なディレクトリへマウントして→switch_root
/init が exec /sbin/init する
実行: /init
initrdの展開 [root@~]# ll pepo.img -rw-r--r-- 1 root root 1198051 6月 6 07:05 pepo.img [root@~]# cat pepo.img |gzip -dc >pepo [root@~]# mkdir t [root@~]# mount pepo t -o loop [root@~]# ll t/ drwxr-xr-x 2 root root 3072 11月 20 2005 bin drwxr-xr-x 2 root root 1024 1月 9 2002 boot drwxr-xr-x 2 root root 1024 8月 29 2004 cdrom drwxr-xr-x 9 root root 5120 1月 24 2009 dev drwxr-xr-x 2 root root 1024 8月 29 2004 dos drwxr-xr-x 2 root root 1024 1月 26 21:31 etc drwxr-xr-x 3 root root 1024 1月 26 21:31 initrdlocal drwxr-xr-x 2 root root 1024 12月 11 2004 lib -rwxr-xr-x 1 root root 18415 11月 25 2009 linuxrc drwx------ 2 root root 12288 1月 26 21:31 lost+found drwxr-xr-x 9 root root 1024 7月 25 2000 mnt drwxr-xr-x 2 root root 1024 8月 15 1998 proc drwxr-xr-x 3 root root 1024 9月 28 2004 root drwxr-xr-x 2 root root 1024 1月 11 2009 sbin drwxr-xr-x 2 root root 1024 2月 2 2006 sys drwxrwxrwt 2 root root 1024 8月 29 2004 tmp drwxr-xr-x 3 root root 1024 11月 19 2004 usr drwxr-xr-x 5 root root 1024 7月 25 2000 var [root@~]# du t/ . . 3 t/usr 1 t/var/log 1 t/var/run 1 t/var/lock 4 t/var 2521 t/ [root@~]# vi t/linuxrc . . umount /proc >/dev/null 2>&1 pivot_root . initrd >/dev/null 2>&1 exec sbin/init <>dev/console 2>&1 この後、新しいrootfsのinitが起動
initramfsの展開 [root@~]# ll pepo.img -rw-r--r-- 1 root root 13897879 6月 6 07:14 pepo.img [root@~]# mkdir t [root@~]# cd t/ [root@t]# cat ../pepo.img | gzip -dc | cpio -i 67020 blocks [root@t]# ll total 20 drwxr-xr-x 2 root root 1640 6月 6 07:15 bin drwxr-xr-x 2 root root 40 6月 6 07:15 boot drwxr-xr-x 2 root root 40 6月 6 07:15 cdrom drwxr-xr-x 2 root root 40 6月 6 07:15 dev drwxr-xr-x 2 root root 40 6月 6 07:15 dos drwxr-xr-x 6 root root 300 6月 6 07:15 etc -rwxr-xr-x 1 root root 16844 6月 6 07:15 init drwxr-xr-x 4 root root 740 6月 6 07:15 lib drwxr-xr-x 9 root root 180 6月 6 07:15 mnt drwxr-xr-x 2 root root 40 6月 6 07:15 proc drwxr-xr-x 3 root root 100 6月 6 07:15 root drwxr-xr-x 2 root root 1020 6月 6 07:15 sbin drwxr-xr-x 2 root root 40 6月 6 07:15 sys drwxrwxrwt 2 root root 40 6月 6 07:15 tmp drwxr-xr-x 2 root root 40 6月 6 07:15 tmpfs drwxr-xr-x 3 root root 60 6月 6 07:15 usr drwxr-xr-x 5 root root 100 6月 6 07:15 var [root@t]# du ./ . . 3800 ./lib/udev 31212 ./lib 0 ./dos 36140 ./ [root@t]# vi init . . exec switch_root "$NEWROOT" "$INIT" この後、新しいrootfsのinitが起動
pepoと