前回、

もっとも最近では、
しかしながら、
もっともinitrd自体は古くからある技術ですし、
initrdとinitramfs
Linuxでは、
このような状況を回避するために考案されたのがinitrdです。initrdは、
initrdの歴史は古く、
そのため後になると、
initramfsはinitrdと同じ機能を果すものの、
前述のように、
しかしながら、
一般ユーザ向けのPCを前提にすれば、
しかしながら最近では、
その結果、
次節以降で紹介するように、
Plamo-7.1のinitrd
initrdの実体は、
initrdイメージがどのような作りになっているのか、
Plamo-7.
$ tar xvf kernel-4.19.35-x86_64-B1.txz boot/initrd.img-4.19.35_plamo64 boot/initrd.img-4.19.35_plamo64 $ ls -lh boot 合計 17M -rwxr--r--+ 1 kojima users 17M 4月 25日 11:37 initrd.img-4.19.35_plamo64*
約17MBのinitrdイメージが取り出せました。このファイルは、
$ mkdir Initrd ; cd Initrd $ zcat ../boot/initrd.img-4.19.35_plamo64 | cpio -ivd . init lib64 etc etc/lvm etc/lvm/cache etc/lvm/lvm.conf ... bin/cat bin/sh 51847 ブロック
展開したinitrdイメージの中身を見ると、
$ ls bin/ dev/ etc/ init* lib/ lib64@ proc/ run/ sbin/ sys/ usr/
Linuxのお手本であるUNIXでは、
このinitはシェルスクリプトなので、
まず、
1 #!/bin/sh
2
3 PATH=/bin:/usr/bin:/sbin:/usr/sbin
4 export PATH
5
本来のルートファイルシステムをマウントする際に用いるパラメータを準備して、
57 init=/sbin/init
58 root=
59 rootdelay=
60 rootfstype=auto
61 ro="ro"
62 rootflags=
63 device=
devtmpfs等の仮想ファイルシステムをマウント。これでカーネルが認識している周辺機器の情報が/sys以下に見えるようになります。
65 mount -n -t devtmpfs devtmpfs /dev
66 mount -n -t proc proc /proc
67 mount -n -t sysfs sysfs /sys
68 mount -n -t tmpfs tmpfs /run
ブートローダから渡されたカーネルパラメータを/proc/
70 read -r cmdline < /proc/cmdline
71
72 for param in $cmdline ; do
73 case $param in
74 init=* ) init=${param#init=} ;;
75 root=* ) root=${param#root=} ;;
76 rootdelay=* ) rootdelay=${param#rootdelay=} ;;
77 rootfstype=*) rootfstype=${param#rootfstype=} ;;
78 rootflags=* ) rootflags=${param#rootflags=} ;;
79 ro ) ro="ro" ;;
80 rw ) ro="rw" ;;
81 esac
82 done
デバイスファイルを動的に生成するudevdを起動。udevdは先にマウントした/sys以下の情報を用いて、
96 ${UDEVD} --daemon --resolve-names=never
97 udevadm trigger --action=add --type=subsystems
98 udevadm trigger --action=add --type=devices
99 udevadm trigger --action=change --type=devices
100 udevadm settle
組み込むべきドライバ・
$ ls lib/modules/4.19.35-plamo64/ kernel/ modules.alias.bin modules.builtin.bin modules.dep.bin modules.order modules.symbols modules.alias modules.builtin modules.dep modules.devname modules.softdep modules.symbols.bin $ ls lib/modules/4.19.35-plamo64/kernel/drivers/ ata/ block/ firewire/ md/ message/ mmc/ mtd/ pcmcia/ scsi/ usb/ virtio/ $ ls lib/modules/4.19.35-plamo64/kernel/fs/ 9p/ cachefiles/ dlm/ fat/ hfsplus/ minix/ nls/ overlayfs/ ubifs/ affs/ ceph/ ecryptfs/ fscache/ isofs/ nfs/ ntfs/ quota/ udf/ afs/ cifs/ exofs/ fuse/ jffs2/ nfs_common/ ocfs2/ reiserfs/ ufs/ befs/ coda/ ext2/ gfs2/ jfs/ nfsd/ omfs/ romfs/ xfs/ btrfs/ cramfs/ f2fs/ hfs/ lockd/ nilfs2/ orangefs/ squashfs/
udevdは、
準備が終われば、
29 do_mount_root()
30 {
31 mkdir /.root
32 [ -n "$rootflags" ] && rootflags="$rootflags,"
33 rootflags="$rootflags$ro"
34
35 case "$root" in
36 /dev/* ) device=$root ;;
37 UUID=* ) eval $root; device="/dev/disk/by-uuid/$UUID" ;;
38 PARTUUID=* ) eval $root; device=/dev/disk/by-partuuid/$PARTUUID ;;
39 LABEL=* ) eval $root; device="/dev/disk/by-label/$LABEL" ;;
40 "" ) echo "No root device specified." ; problem ;;
41 esac
do_
106 do_mount_root
107
108 killall -w ${UDEVD##*/}
109
110 exec switch_root /.root "$init" "$@"
以後の処理は、
その際にはudevdが改めて起動され、
このようにinitrdでは
- /sysや/dev等の仮想ファイルシステムのマウント
- udevdを起動して必要なモジュールの組み込み
- 実際のルートパーティションをマウントしてswitch_
root
といった程度の処理をするだけなので、
しかしながら、
$ ls bin basename* cp* insmod@ kmod* ls* mkdir* mount* rm* sh* umount* cat* dd* killall* ln* lsmod@ mknod* readlink* sed* sleep* uname* $ ls lib firmware/ libc.so.6* libkmod.so.2* libpthread.so.0* libz.so.1* ld-linux-x86-64.so.2* libcap.so.2* liblzma.so.5* libreadline.so.7* modules/ libacl.so.1* libdevmapper-event.so.1.02* libm.so.6* librt.so.1* udev/ libattr.so.1 libdevmapper.so.1.02* libmount.so.1* libudev.so.1* libblkid.so.1* libdl.so.2* libncursesw.so.6* libuuid.so.1*
これら必要なコマンドやライブラリをいかに集めてくるかが、