initrdファイルを作成する

開発マシンのファイルを流用してinitrdファイルを作成し、MyLinux用に書き換えます。

ひな形initrdファイルの作成

ひな形になるinitrdファイルとは、開発マシンで使用されているinitrdファイルです。
mkinitrdコマンドで作成できます。

/usr/local/src/origdev/bootディレクトリにinitrdファイル(ファイル名: initrd.img)を作成 します。
# mkinitrd /usr/local/src/origdev/boot/initrd.img `uname -r`

▼確認
# ls /usr/local/src/origdev/boot/ -l
合計 1676
-rw-r--r-- 1 root root 390086 Oct 25 23:40 System.map
-rw-r--r-- 1 root root 241582 Mar 21 10:22 initrd.img
-rw-r--r-- 1 root root 1068796 Oct 25 23:40 mylinux
#

initrdファイルの展開

initrdファイルを、/usr/local/src/origdevディレクトリに、ファイル名:initrdとして展開します。
# gzip -cd /usr/local/src/origdev/boot/initrd.img > /usr/local/src/origdev/initrd

▼確認
# ls /usr/local/src/origdev/ -l
合計 8072
drwxr-xr-x 2 root root 4096 Oct 25 19:33 bin/
drwxr-xr-x 2 root root 4096 Mar 21 10:22 boot/
drwxr-xr-x 2 root root 12288 Oct 24 14:54 dev/
drwxr-xr-x 2 root root 4096 Oct 25 14:37 etc/
drwxr-xr-x 2 root root 4096 Oct 24 11:44 home/
-rw-r--r-- 1 root root 8192000 Mar 21 10:30 initrd
drwxr-xr-x 3 root root 4096 Oct 26 00:10 lib/
drwxr-xr-x 2 root root 4096 Oct 24 11:44 mnt/
drwxr-xr-x 2 root root 4096 Oct 24 11:44 proc/
drwxr-xr-x 2 root root 4096 Oct 24 11:44 root/
drwxr-xr-x 2 root root 4096 Oct 25 19:22 sbin/
drwxr-xr-x 2 root root 4096 Oct 24 11:44 tmp/
drwxr-xr-x 11 root root 4096 Oct 25 13:57 usr/
drwxr-xr-x 6 root root 4096 Oct 24 11:45 var/
#

ファイルシステムとしてマウント

展開して作成されたinitrdファイルをマウントします。
マウントするディレクトリはRAMディスク用ディレクトリ(/mnt/ram)です。
# mount -o loop=/dev/loop1 /usr/local/src/origdev/initrd /mnt/ram

▼確認
# ls /mnt/ram -l
合計 9
drwxr-xr-x 2 root root 1024 Mar 21 10:22 bin/
drwxr-xr-x 2 root root 1024 Mar 21 10:22 dev/
drwxr-xr-x 2 root root 1024 Mar 21 10:22 etc/
drwxr-xr-x 2 root root 1024 Mar 21 10:22 lib/
-rwxr-xr-x 1 root root 643 Mar 21 10:22 linuxrc*
drwxr-xr-x 2 root root 1024 Mar 21 10:22 loopfs/
drwxr-xr-x 2 root root 1024 Mar 21 10:22 proc/
lrwxrwxrwx 1 root root 3 Mar 21 10:22 sbin -> bin/
drwxr-xr-x 2 root root 1024 Mar 21 10:22 sys/
drwxr-xr-x 2 root root 1024 Mar 21 10:22 sysroot/
#

「bin」「dev」「etc」「lib」「loopfs」「proc」「sys」「sysroot」の8つのディレクトリと、「linuxrc」「sbin」の2つのファイルが存在することを確認します。

linuxrcスクリプトの書き換え

/mnt/ram/linuxrcファイルを書き換えます。linuxrcはinitrdが展開された後に実行されるスクリプトです。
# cd /mnt/ram
# vi linuxrc

●MyLinuxをコンパクトフラッシュに作成する場合
#! /bin/nash

echo Mounting /proc filesystem
mount -t proc /proc /proc
echo "Loading jbd.o module"
insmod /lib/jbd.o
echo "Loading ext3.o module"
insmod /lib/ext3.o
echo "Loading scsi_mod.o module"
insmod /lib/scsi_mod.o
echo "Loading ehci-hcd.o module"
insmod /lib/ehci-hcd.o
echo "Loading usb-ohci.o module"
insmod /lib/usb-ohci.o
echo "Loading usb-uhci.o module"
insmod /lib/usb-uhci.o
echo "Loading uhci.o module"
insmod /lib/uhci.o

echo "Loading usb-storage.o module"
insmod /lib/usb-storage.o
sleep 5
echo Creating block devices
mkdevices /dev

echo 0x0100 > /proc/sys/kernel/real-root-dev
echo root filesystem is changed to RAMDISK
echo Mount FM
mount -o defaults --ro -t ext3 /dev/hda1 /FM

echo Rsync Root-Filesystem
rsync -ax /FM/rootsys/ /

echo umount /FM

●USBメモリの場合
USBメモリの場合は、
mount -o defaults --ro -t ext3 /dev/hda1 /FM

mount -o defaults --ro -t ext3 /dev/sda1 /FM
にします。

●ドライバの読み込み設定
ドライバの読み込みにismodコマンドを使用します。Ext3ファイルシステムとUSBメモリ のためのドライバ群の読み込みにismodコマンドを使用します。

Ext3ファイルシステムに関するドライバは「ext3.o」と「jbd.o」の2種類です。ext3.oがExt3ファイルシステムを認識させるドライバ、jbd.oがExt3のジャーナリングを利用するためのドライバです。ext3.oよりも先にjbd.oを読み込ませる必要があります。

USBメモリを扱うためのドライバは、「ehci-hcd.o」「usb-ohci.o」「usb-uhci.o」「uhci.o」「scsi_mod.o」と「usb-storage.o」の6種類です。「usbcore.o」というUSBインタフェースの核になるドライバも読み込ませる必要があ りますが、MyLinuxのカーネルではこのドライバを直接組み込んでいるため読み込む必要がありません。

scsi_mod.oはSCSIデバイスの核になるドライバであり、usb-storage.oはUSB接続ストレージ用ドライバです。scsi_mod.oが必要な理由は、USB接続のストレージはLinuxからはSCSI接続のディスク装置と認識されるためです。

ehci-hcd.o、usb-ohci.o、usb-uhci.o、uhci.oはそれぞれUSBコントローラ(チップ)ごとに用意されているドライバです。usb-uhci.oとuhci.oはIntel社やVIA Technologies社で採用されているUHCI(Universal Host Controller Interface)に対応したUSBコントローラ用ドライバであり、UHCIのUSB1.1による通信に必要です。

usb-ohci.oはALi社やSilicon Integrated Systems社、OPTi社などが採用しているOHCI(Open Host Controller Interface)に対応したUSBコントローラ用ドライバであり、OHCIのUSB1.1による通信に必要です。

●RAMディスク上にルートファイルシステム(RFS)を作成する
実際のルートファイルシステムをRAMディスク上に読み込み、RAMディスク上のルートファイルシステムをMyLinuxのルートファイルシステムに設定しています。

ドライバの読み込みにより、IDE接続のコンパクトフラッシュやUSBメモリ上のファイルシステムが認識されます。認識には時間がかかるため、5秒間処理を停止しています。

mkdevices /devにより、/proc/partitionsファイル上の認識されたブロックデバイス一覧を用いて、/devディレクトリ内にブロックデバイスを作成しています。

echo 0x0100 > /proc/sys/kernel/real-root-devで、/proc/sys/kernel/real-root-devファイルにルートファイルシステムに割り当てたいデバイスのデバイス番号をechoコマンドとリダイレクト(>)を用いて書き込んでいます。こうすると、そのデバイスがルートファイルシステムとしてマウントされます。MyLinuxでルートファイルシステムに割り当てたいRAMディスクのデバイス番号は「0x0100」です。

さらに、mount -o defaults --ro -t ext3 /dev/hda1 /FMにより、/FMディレクトリにMyLinuxのルートファイルシステムを含むパーティションを書き込み禁止でマウントしています。

rsync -ax /FM/rootsys/ /のように、ファイルの同期を図るrsyncコマンドを用いて、-axオプションによりファイルやディレクトリの属性をそのままにMyLinux用のルートディレクトリにMyLinuxのルートファイルシステムをコピーしています。これで、RAMディスク上にMyLinuxのルートファイルシステムが作成されます。

linuxrcスクリプトが実行されると、RAMディスク上のファイルシステムがMyLinuxのルートファイルシステムと なります。

<参考>
書き換え前のlinuxrcスクリプトは以下のようになっています。
#!/bin/nash

mount -t proc /proc /proc
setquiet
echo Mounted /proc filesystem
echo Mounting sysfs
mount -t sysfs none /sys
echo "Loading scsi_mod.o module"
insmod /lib/scsi_mod.o
echo "Loading sd_mod.o module"
insmod /lib/sd_mod.o
echo "Loading BusLogic.o module"
insmod /lib/BusLogic.o
echo "Loading usb-storage.o module"
insmod /lib/usb-storage.o
sleep 5
echo Creating block devices
mkdevices /dev
echo Creating root device
mkrootdev /dev/root
umount /sys
echo 0x0100 > /proc/sys/kernel/real-root-dev
echo Mounting root filesystem
mount -o defaults --ro -t ext3 /dev/root /sysroot
pivot_root /sysroot /sysroot/initrd
umount /initrd/proc

ドライバの導入

MyLinux用カーネルのドライバに入れ替えます。
ドライバのファイルは、/usr/local/src/origdev/lib/modules/2.4.29-mylinux/kernelディレクトリにあります。

●ehci-hcd.oの追加
/tmpにあらかjめehci-hcd.oを置いておき、/usr/local/src/origdev/lib/modules/2.4.29-mylinux/kernel/drivers/usb/hostに移します。最後にehci-hcd.oファイル属性を変更します。

# cd /usr/local/src/origdev/lib/modules/2.4.29-mylinux/kernel/drivers/usb/host
# ls
uhci.o usb-ohci.o usb-uhci.o
# mv /tmp/ehci-hcd.o .
# ls -l
合計 116
-rwxr-xr-x 1 root root 22992 Mar 21 14:12 ehci-hcd.o*
-rw-r--r-- 1 root root 33640 Oct 26 00:10 uhci.o
-rw-r--r-- 1 root root 24832 Oct 26 00:10 usb-ohci.o
-rw-r--r-- 1 root root 28544 Oct 26 00:10 usb-uhci.o
# chmod 644 ehci-hcd.o
# ls -l
合計 116
-rw-r--r-- 1 root root 22992 Mar 21 14:12 ehci-hcd.o
-rw-r--r-- 1 root root 33640 Oct 26 00:10 uhci.o
-rw-r--r-- 1 root root 24832 Oct 26 00:10 usb-ohci.o
-rw-r--r-- 1 root root 28544 Oct 26 00:10 usb-uhci.o
#

/mnt/ram/libディレクトリにある既存のドライバをすべて削除し、/usr/local/src/origdev/lib/modules/2.4.29-mylinux/kernelディレクトリからドライバをコピーします。

# cd /usr/local/src/origdev/lib/modules/2.4.29-mylinux/kernel
# rm -f /mnt/ram/lib/*
# cp -p drivers/scsi/scsi_mod.o /mnt/ram/lib/.
# cp -p drivers/usb/host/ehci-hcd.o /mnt/ram/lib/.
# cp -p drivers/usb/host/usb-uhci.o /mnt/ram/lib/.
# cp -p drivers/usb/host/usb-ohci.o /mnt/ram/lib/.
# cp -p drivers/usb/storage/usb-storage.o /mnt/ram/lib/.
# cp -p fs/jbd/jbd.o /mnt/ram/lib/.
# cp -p fs/ext3/ext3.o /mnt/ram/lib/.

▼確認
# cd /mnt/ram/lib
# ls -l
合計 333
-rw-r--r-- 1 root root 22992 Mar 21 14:12 ehci-hcd.o
-rw-r--r-- 1 root root 79704 Oct 26 00:10 ext3.o
-rw-r--r-- 1 root root 59387 Oct 26 00:10 jbd.o
-rw-r--r-- 1 root root 83391 Oct 26 00:10 scsi_mod.o
-rw-r--r-- 1 root root 24832 Oct 26 00:10 usb-ohci.o
-rw-r--r-- 1 root root 31899 Oct 26 00:10 usb-storage.o
-rw-r--r-- 1 root root 28544 Oct 26 00:10 usb-uhci.o
#

initrdファイルを完成させる

initrdファイル内にMyLinuxと同一のデバイスファイルとrsyncコマンドを導入し、ファイルシステムをマウントするためのfstabファイルを作成、gzip圧縮を行ってMyLinux用のinitrdファイルを完成させます。

ただし、ひな形になるinitrdファイルは、8Mバイトの大きさのファイルシステムとして作成されています。MyLinuxでは256MバイトのRAMディスク領域を確保するため、同じ大きさ(256バイト)のファイルシステムを作成し、その中でMyLinux用のinitrdファイルを完成させます。

ファイルシステムを作成

256MバイトのExt3でフォーマットされたファイルシステムを作成します。
ファイル名はramdiskとします。
# dd if=/dev/zero of=/usr/local/src/origlinux/ramdisk bs=1024 count=262144
# /sbin/losetup /dev/loop0 /usr/local/src/origlinux/ramdisk
# /sbin/mkfs -t ext3 -j /dev/loop0

このramdiskファイルを/mnt/loop0ディレクトリにマウントし、ファイルを書き込める状態にします。
# mount /dev/loop0 /mnt/loop0

▼実行表示
# dd if=/dev/zero of=/usr/local/src/origlinux/ramdisk bs=1024 count=262144
読み込んだブロック数は 262144+0
書き込んだブロック数は 262144+0
# /sbin/losetup /dev/loop0 /usr/local/src/origlinux/ramdisk
# /sbin/mkfs -t ext3 -j /dev/loop0
mke2fs 1.35 (28-Feb-2004)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
65536 inodes, 262144 blocks
13107 blocks (5.00%) reserved for the super user
First data block=1
32 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185

Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done

This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
# mount /dev/loop0 /mnt/loop0
#

必要なファイルのコピー

initrdファイルをファイルやディレクトリの属性を変更しないですべてコピーします。
# cp -a /mnt/ram/* /mnt/loop0

▼実行と確認
# cd /mntloop0/
# ls
lost+found/
# cp -a /mnt/ram/* /mnt/loop0
# ls
bin/ etc/ linuxrc* loopfs/ proc/ sys/
dev/ lib/ linuxrc~* lost+found/ sbin@ sysroot/
#

起動時に必要なディレクトリを作成します。
# cd /mnt/loop0
# rm -rf lost+found sbin
# mkdir -p FM home tmp var var/run var/spool var/log var/lock var/lock/subsys
# mkdir -p usr usr/bin usr/sbin usr/lib usr/libexec mnt boot sbin root
# touch var/lock/subsys/syslog

MyLinux用デバイスファイルを/devディレクトリにをコピーします。
# cp -aRf /usr/local/src/origdev/dev/* /mnt/loop0/dev/

rsyncコマンドをコピーします。
# cp -a /usr/local/src/origsoft/rsync-2.6.3/rsync /mnt/loop0/bin

▼実行表示
# cd /mnt/loop0
# rm -rf lost+found sbin
# mkdir -p FM home tmp var var/run var/spool var/log var/lock var/lock/subsys
# mkdir -p usr usr/bin usr/sbin usr/lib usr/libexec mnt boot sbin root
# touch var/lock/subsys/syslog
# cp -aRf /usr/local/src/origdev/dev/* /mnt/loop0/dev/
cp: ``/mnt/loop0/dev/console'' を上書きしてもよろしいですか (yes/no)? y
cp: ``/mnt/loop0/dev/null'' を上書きしてもよろしいですか (yes/no)? y
cp: ``/mnt/loop0/dev/ram'' を上書きしてもよろしいですか (yes/no)? y
cp: ``/mnt/loop0/dev/tty1'' を上書きしてもよろしいですか (yes/no)? y
cp: ``/mnt/loop0/dev/tty2'' を上書きしてもよろしいですか (yes/no)? y
cp: ``/mnt/loop0/dev/tty3'' を上書きしてもよろしいですか (yes/no)? y
cp: ``/mnt/loop0/dev/tty4'' を上書きしてもよろしいですか (yes/no)? y
# cp -a /usr/local/src/origsoft/rsync-2.6.3/rsync /mnt/loop0/bin
#

fstabファイルを/mnt/loop0/etcディレクトリ配下に作成します。
(起動時のファイルシステムのマウントに使用されます。)
# cd /mnt/loop0/etc/
# vi fstab

/dev/ram0 / ext3 defaults 1 1
/dev/hda1 /FM ext3 defaults 0 0
none /proc proc defaults 0 0

▼確認

# cat /mnt/loop0/etc/fstab
/dev/ram0       /       ext3    defaults 1 1
/dev/hda1       /FM     ext3    defaults 0 0
none            /proc   proc    defaults 0 0
#

RAMディスクのイメージ化

RAMディスクのイメージ化を行います。

initrdファイルをアンマウントします。
# cd
# umount /mnt/ram

ramdiskファイルもアンマウントします。
# umount /mnt/loop0

ループバックデバイスとして割り当てた/dev/loop0を開放します。
# /sbin/losetup -d /dev/loop0

ramdiskファイルをgzipにより圧縮し、/usr/local/src/origdev/bootディレクトリ配下に格納します。
# gzip -c9 /usr/local/src/origlinux/ramdisk > /usr/local/src/origdev/boot/ramdisk.img

▼実行確認

# gzip -c9 /usr/local/src/origlinux/ramdisk > /usr/local/src/origdev/boot/ramdisk.img
# cd /usr/local/src/origdev/boot
# ls -l
合計 2720
-rw-r--r--    1 root     root       390086 Oct 25 23:40 System.map
-rw-r--r--    1 root     root       241582 Mar 21 10:22 initrd.img
-rw-r--r--    1 root     root      1068796 Oct 25 23:40 mylinux
-rw-r--r--    1 root     root      1061490 Mar 21 16:29 ramdisk.img
#

変更 2008.10.25
2008.07.01