pepoとネットワークを語ろう

40年前からこれまでとこれからのネットワークを語る

initramfsとinitrdについて

2010-06-17 19:51:10 | Linux

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


最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。