前回、
それらのファイルを過不足なく揃え、
/sbin/mkinitramfs
前回、
mkinitramfsはシンプルなシェルスクリプトなものの、
必要なコマンドの準備
mkinitramfsでは、
36 printf "Creating $INITRAMFS_FILE... "
37
38 binfiles="sh cat cp dd killall ls mkdir mknod mount "
39 binfiles="$binfiles umount sed sleep ln rm uname"
40 binfiles="$binfiles readlink basename"
...
45 sbinfiles="modprobe blkid switch_root"
46
47 #Optional files and locations
48 for f in mdadm mdmon udevd udevadm; do
49 if [ -x /sbin/$f ] ; then sbinfiles="$sbinfiles $f"; fi
50 done
これらのうち、
また、
作業用ディレクトリの作成
次に/tmpディレクトリに作業用の一時ファイル
52 unsorted=$(mktemp /tmp/unsorted.XXXXXXXXXX)
...
57 # Create a temporary working directory
58 WDIR=$(mktemp -d /tmp/initrd-work.XXXXXXXXXX)
59
$unsortedは先に指定した27個の実行ファイルが必要とする共有ライブラリを調べる際に使うファイルで、
次に、
60 # Create base directory structure
61 mkdir -p $WDIR/{bin,dev,lib/firmware,run,sbin,sys,proc,usr}
62 mkdir -p $WDIR/etc/{modprobe.d,udev/rules.d}
63 touch $WDIR/etc/modprobe.d/modprobe.conf
64 ln -s lib $WDIR/lib64
65 ln -s ../bin $WDIR/usr/bin
initrd用の/dev/
67 # Create necessary device nodes
68 mknod -m 640 $WDIR/dev/console c 5 1
69 mknod -m 664 $WDIR/dev/null c 1 3
実行ファイルと共有ライブラリのコピー
まず、
71 # Install the udev configuration files
72 if [ -f /etc/udev/udev.conf ]; then
73 cp /etc/udev/udev.conf $WDIR/etc/udev/udev.conf
74 fi
75
76 for file in $(find /etc/udev/rules.d/ -type f) ; do
77 cp $file $WDIR/etc/udev/rules.d
78 done
代入している部分は省略したものの、
88 # Install the init file
89 install -m0755 $DATADIR/$INITIN $WDIR/init
ドライバ・
91 if [ -n "$KERNEL_VERSION" ] ; then
92 if [ -x /bin/kmod ] ; then
93 binfiles="$binfiles kmod"
94 else
95 binfiles="$binfiles lsmod"
96 sbinfiles="$sbinfiles insmod"
97 fi
98 fi
次に$binfilesに指定したコマンド
100 # Install basic binaries
101 for f in $binfiles ; do
102 if [ -e /bin/$f ]; then d="/bin"; else d="/usr/bin"; fi
103 ldd $d/$f | sed "s/\t//" | cut -d " " -f1 >> $unsorted
104 copy $d/$f bin
105 done
同様に$sbinfilesに指定したコマンド
110 for f in $sbinfiles ; do
111 ldd /sbin/$f | sed "s/\t//" | cut -d " " -f1 >> $unsorted
112 copy $f sbin
113 done
次に、
153 # Install libraries
154 sort $unsorted | uniq | while read library ; do
155 if [ "$library" == "linux-vdso.so.1" ] ||
156 [ "$library" == "linux-gate.so.1" ]; then
157 continue
158 fi
159
160 copy $library lib
161 done
このあたり、
udevは/lib/
163 if [ -d /lib/udev ]; then
164 cp -a /lib/udev $WDIR/lib
165 fi
ドライバ・モジュールのコピー
次に、
170 # Install the kernel modules if requested
171 if [ -n "$KERNEL_VERSION" ]; then
172 find \
173 /lib/modules/$KERNEL_VERSION/kernel/{crypto,fs,lib} \
174 /lib/modules/$KERNEL_VERSION/kernel/drivers/{block,ata,md,firewire,mmc,mtd} \
175 /lib/modules/$KERNEL_VERSION/kernel/drivers/{scsi,message,pcmcia,virtio} \
176 /lib/modules/$KERNEL_VERSION/kernel/drivers/usb/{host,storage} \
177 -type f 2> /dev/null | cpio --make-directories -p --quiet $WDIR
178
このあたり、
一方、
このあたり、
cpioはUNIXの初期に開発されたアーカイブツールで、
ドライバ・モジュールの依存関係の更新とCPIOアーカイブ化
次に、
179 cp /lib/modules/$KERNEL_VERSION/modules.{builtin,order} \
180 $WDIR/lib/modules/$KERNEL_VERSION
181
182 depmod -b $WDIR $KERNEL_VERSION
183 fi
以上でカーネルのドライバ・
185 ( cd $WDIR ; find . | cpio -o -H newc --quiet | gzip -9 ) > $INITRAMFS_FILE
...
188 rm -rf $WDIR $unsorted
189 printf "done.\n"
なお、
mkinitramfsの特徴
以上、
この設計方針は従来のinitrdに慣れている人には奇異に見えるかも知れません。というのも、
前者の設計では、
また、
LFS/
今回紹介したLFS/