前回はLinuxの起動の仕組みをブートローダ段階、
その際にも簡単に触れましたが、
初期化用ramdiskは、
モノリシックカーネルとマイクロカーネル
最近では大型コンピュータから携帯機器までカバーしていますが、
最初のバージョンのLinuxは、
カーネルには各種ハードウェアを操作するデバイスドライバからファイルシステムやネットワークの操作、
元々UNIXのカーネルはモノリシックカーネルのデザインになっていましたが、
たとえば、
それらの欠点を克服するために考案されたのがマイクロ(micro)カーネルというデザインです。マイクロカーネルでは、

'80年代の半ばにマイクロカーネルの概念とそれを実装したMachと呼ばれるマイクロカーネルが公開されると、
もっとも、
モジュールカーネル
モノリシックカーネルとして生まれ、
LinuxがターゲットとしているPC互換機の場合、
そこでLinuxではこれら周辺機器用のドライバをモジュールとしてカーネル本体の実行ファイルとは独立に用意しておき、
モジュールカーネルの場合、
当初、
初期化用ramdisk
カーネル本体の実行ファイルと周辺機器用のドライバを分離して、
しかしながら、
この問題に対処するために考案されたのが初期化用ramdiskです。
初期化用ramdiskとは、
初期化用ramdiskは複数のファイルやコマンドを含むファイルシステムですが、
圧縮された初期化用ramdiskファイルは、
この/initコマンドが初期化用ramdisk内に用意されているユーザの環境に応じたHDD用のドライバモジュールやrootファイルシステム用のモジュールなどをカーネル本体に組み込むことで、
初期化用ramdisk上の/initは、
初期化用ramdiskの実際
さて、
今回紹介する初期化用ramdiskはFedora Core 9のβ版を手元のVMware Server環境にインストールした際に生成されたものです。初期化用ramdiskのファイル名はカーネルのバージョンやビルド番号によって変わりますし、
まず、
# mkdir Initrd ; cd Initrd # gunzip -c /boot/initrd-2.6.25-0.163.rc7.git1.fc9.i686.img | cpio -ivd lib lib/libparted-1.8.so.8 lib/libgcc_s-4.3.0-20080326.so.1 .. usr/lib/libdhcp6client-1.0.so.2.0.12 usr/lib/libdhcp6client-1.0.so.2 init 14818 blocks # ls -lh 合計 40K drwx------ 2 root root 4.0K 2008-06-03 06:13 bin drwx------ 3 root root 4.0K 2008-06-03 06:13 dev drwx------ 4 root root 4.0K 2008-06-03 06:13 etc drwx------ 2 root root 4.0K 2008-06-03 06:13 firmware -rwx------ 1 root root 2.1K 2008-06-03 06:13 init drwx------ 4 root root 4.0K 2008-06-03 06:13 lib drwx------ 2 root root 4.0K 2008-06-03 06:13 proc lrwxrwxrwx 1 root root 3 2008-06-03 06:13 sbin -> bin drwx------ 2 root root 4.0K 2008-06-03 06:13 sys drwx------ 2 root root 4.0K 2008-06-03 06:13 sysroot drwx------ 3 root root 4.0K 2008-06-03 06:13 usr
これで初期化用ramdiskが作業用に作成した Initrd ディレクトリ内に展開されました。展開されたディレクトリのいくつかを眺めてみます。
# ls -l bin 合計 804K -r-xr-xr-x 1 root root 614K 2008-06-03 06:13 lvm -rwxr-xr-x 1 root root 81K 2008-06-03 06:13 modprobe -rwxr-xr-x 1 root root 80K 2008-06-03 06:13 nash -rwxr-xr-x 1 root root 8.4K 2008-06-03 06:13 rmmod
このディレクトリにあるのが初期化用ramdisk内で動作するコマンドです。
lvmは最近のfedora coreが採用しているLVM
modprobeとrmmodはモジュールドライバを組み込んだり取り外したりするコマンド、
# ls -l lib 合計 2.6M drwx------ 3 root root 4.0K 2008-06-03 06:13 i686 -rwxr-xr-x 1 root root 143K 2008-06-03 06:13 ld-2.7.90.so lrwxrwxrwx 1 root root 12 2008-06-03 06:13 ld-linux.so.2 -> ld-2.7.90.so lrwxrwxrwx 1 root root 20 2008-06-03 06:13 libblkid.so.1 -> /lib/libblkid.so.1.0 .. drwx------ 3 root root 4.0K 2008-06-03 06:13 modules
/libディレクトリには /bin以下のコマンドが利用するライブラリが収められています。Fedora Coreの場合、
/lib/
# ls -lh lib/modules/2.6.25-0.163.rc7.git1.fc9.i686/ 合計 764K -rw------- 1 root root 67K 2008-06-03 06:13 BusLogic.ko -rw------- 1 root root 32K 2008-06-03 06:13 dm-mirror.ko -rw------- 1 root root 62K 2008-06-03 06:13 dm-mod.ko -rw------- 1 root root 23K 2008-06-03 06:13 dm-snapshot.ko -rw------- 1 root root 7.0K 2008-06-03 06:13 dm-zero.ko -rw------- 1 root root 38K 2008-06-03 06:13 ehci-hcd.ko -rw------- 1 root root 129K 2008-06-03 06:13 ext3.ko -rw------- 1 root root 55K 2008-06-03 06:13 jbd.ko -rw------- 1 root root 13K 2008-06-03 06:13 mbcache.ko -rw------- 1 root root 892 2008-06-03 06:13 modules.alias -rw------- 1 root root 69 2008-06-03 06:13 modules.ccwmap -rw------- 1 root root 1.3K 2008-06-03 06:13 modules.dep -rw------- 1 root root 73 2008-06-03 06:13 modules.ieee1394map -rw------- 1 root root 141 2008-06-03 06:13 modules.inputmap -rw------- 1 root root 81 2008-06-03 06:13 modules.isapnpmap -rw------- 1 root root 74 2008-06-03 06:13 modules.ofmap -rw------- 1 root root 645 2008-06-03 06:13 modules.pcimap -rw------- 1 root root 43 2008-06-03 06:13 modules.seriomap -rw------- 1 root root 7.6K 2008-06-03 06:13 modules.symbols -rw------- 1 root root 189 2008-06-03 06:13 modules.usbmap -rw------- 1 root root 27K 2008-06-03 06:13 ohci-hcd.ko -rw------- 1 root root 155K 2008-06-03 06:13 scsi_mod.ko -rw------- 1 root root 6.1K 2008-06-03 06:13 scsi_wait_scan.ko -rw------- 1 root root 33K 2008-06-03 06:13 sd_mod.ko -rw------- 1 root root 28K 2008-06-03 06:13 uhci-hcd.ko
これらのうち、
dm-mirror.
modules.
この初期化用ramdiskが仮のrootファイルシステムとしてマウントされると、
1 #!/bin/nash
2
3 mount -t proc /proc /proc
4 setquiet
5 echo Mounting proc filesystem
6 echo Mounting sysfs filesystem
7 mount -t sysfs /sys /sys
8 echo Creating /dev
9 mount -o mode=0755 -t tmpfs /dev /dev
10 mkdir /dev/pts
11 mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
12 mkdir /dev/shm
13 mkdir /dev/mapper
14 echo Creating initial device nodes
15 mknod /dev/null c 1 3
16 mknod /dev/zero c 1 5
17 mknod /dev/systty c 4 0
...
1行目はスクリプトのお約束であるシェバンの指定です。実際の処理の始まりである3行目で各種情報を利用するためにprocファイルシステム、
その後、
42 echo "Loading ehci-hcd module"
43 modprobe -q ehci-hcd
44 echo "Loading ohci-hcd module"
45 modprobe -q ohci-hcd
46 echo "Loading uhci-hcd module"
...
HDDとファイルシステムを読み込むために必要なモジュールを組み込んだ後、
70 echo Scanning logical volumes
71 lvm vgscan --ignorelockingfailure
72 echo Activating logical volumes
73 lvm vgchange -ay --ignorelockingfailure VolGroup00
74 resume /sys/block/dm-1
75 echo Creating root device.
76 mkrootdev -t ext3 -o defaults,ro /dev/VolGroup00/LogVol00
77 echo Mounting root filesystem.
78 mount /sysroot
79 echo Setting up other filesystems.
80 setuproot
81 loadpolicy
82 echo Switching to new root and running init.
83 switchroot
84 echo Booting has failed.
85 sleep -1
その後、
初期化用ramdiskの使い方はディストリビューションごとに大きく異なり、