ホーム  |  製品 & サービス   |  サポート & ダウンロード  |  開発者向け情報  |  お問い合わせ

このページでは、記事では不完全だったrootFSの構築の続きを行います。具体的には init 〜 /etc 以下のファイルを補完していく作業になります。

 

linux起動引数を変更

BootStrap の linux 起動引数を変更します。

-#define LINUX_CMD_LINE "mem=64M console=ttyS0,115200 
                                   mtdparts=physmap-flash.0:2m(kernel),5m(user) 
                                   root=/dev/mtdblock1 init=/bin/msh"
+#define LINUX_CMD_LINE "mem=64M console=ttyS0,115200
                                   mtdparts=physmap-flash.0:2m(kernel),5m(user)
                                   root=/dev/mtdblock1 init=/sbin/init"

記事では、カーネル起動直後にシェルが動くようになっていました。

linux の起動引数を変更することで、カーネルが起動したときに busybox の init を呼ぶようにします。

 

busybox の initの役割

 オライリーの「組み込みLINUXシステム構築」をそのまま抜粋すると、busybox の init は以下の動作を行います:

  1. init用のシグナルハンドラを設定する

  2. 1つまたは複数のコンソールを初期化する

  3. inittabファイル(/etc/inittab)を解析する

  4. システム初期化スクリプトを実行する(BusyBoxのデフォルトの初期化スクリプトは/etc/init.d/rcS)

  5. 待機状態のinittabコマンドをすべて実行する(アクションタイプ:wait)

  6. 一度だけ実行すべきinittabコマンドをすべて実行する(アクションタイプ:once)

以上の処理を終えると、initルーチンは、以下の作業のループを永遠に繰り返す。

  1. 再起動すべきinittabコマンドが終了していたら、それらをすべて再起動する(アクションタイプ:respawn)

  2. 最初に質問を出すべきinittabコマンドをすべて実行する(アクションタイプ:askfirst)

 

アクションタイプとは後述する/etc/inittab に出てくるキーワードです。

 

/etc/inittabの設定

ここからはrootfs.binを、ホストマシンであるUbuntuでマウントしての作業になります。

$ sudo mount -o loop ./rootfs.bin ./mnt

 

まず/etc/inittabを設定します。これはlinux4samの提供しているものを流用しました。

# /etc/inittab
#
# Copyright (C) 2001 Erik Andersen <andersen@codepoet.org>
#
# Note: BusyBox init doesn't support runlevels.  The runlevels field is
# completely ignored by BusyBox init. If you want runlevels, use
# sysvinit.
#
# Format for each entry: <id>:<runlevels>:<action>:<process>
#
# id        == tty to run on, or empty for /dev/console
# runlevels == ignored
# action    == one of sysinit, respawn, askfirst, wait, and once
# process   == program to run

# Startup the system
null::sysinit:/bin/mount -o remount,rw /
null::sysinit:/bin/mount -t proc proc /proc
null::sysinit:/bin/mount -a
null::sysinit:/bin/hostname -F /etc/hostname
null::sysinit:/sbin/ifconfig lo 127.0.0.1 up
null::sysinit:/sbin/route add -net 127.0.0.0 netmask 255.0.0.0 lo

# now run any rc scripts
::sysinit:/etc/init.d/rcS

# Set up a couple of getty's
tty1::respawn:/sbin/getty 38400 tty1
tty2::respawn:/sbin/getty 38400 tty2

# Put a getty on the serial port
ttyS0::respawn:/sbin/getty -L ttyS0 115200 vt100

# Logging junk
null::sysinit:/bin/touch /var/log/messages
null::respawn:/sbin/syslogd -n -m 0
null::respawn:/sbin/klogd -n
tty3::respawn:/usr/bin/tail -f /var/log/messages

# Stuff to do for the 3-finger salute
::ctrlaltdel:/sbin/reboot

# Stuff to do before rebooting
null::shutdown:/usr/bin/killall klogd
null::shutdown:/usr/bin/killall syslogd
null::shutdown:/bin/umount -a -r
null::shutdown:/sbin/swapoff -a
 

 

/etc/fstab の追加

Interface の記事で rootFS を rw でマウントする場合、
# mount -n -o remount,rw /dev/root /
としていました。一方、前述した/etc/inittab を見ると
 null::sysinit:/bin/mount -o remount,rw /
としています。
 
/dev/root を / として mount するためには /etc/fstab というファイルが必要です。このファイルは busybox の mount によって読み込まれます。
以下は linux4sam の rootFS を参考にして作った /etc/fstab です:
# /etc/fstab: static file system information.
#
# <file system> <mount pt>     <type>   <options>         <dump> <pass>
/dev/root       /              ext2     rw,noauto         0      1
proc            /proc          proc     defaults          0      0
none            /proc/bus/usb  usbfs    defaults          0      0


デバイスファイルの追加

inittab はttyなどのデバイスファイルに対してアクセスを行います。/dev以下に、足りないデバイスファイルを追加します。

$ cd mnt/dev
$ sudo mknod ./null c 1 3
$ sudo mknod ./tty0 c 4 0
$ sudo mknod ./tty1 c 4 1
$ sudo mknod ./ttyS0 c 4 64
$ sudo mknod ./tty2 4 2
$ sudo mknod ./tty2 c 4 2
$ sudo mknod ./tty3 c 4 3
$ sudo mknod ./tty4 c 4 4
$ sudo mknod ./tty5 c 4 5
$ sudo mknod ./tty6 c 4 6
$ sudo mknod ./tty7 c 4 7
$ sudo mknod ./ttyS1 c 4 65
$ sudo mknod ./ttyS2 c 4 66
$ sudo mknod ./ttyS3 c 4 67
$ sudo mknod ./tty c 5 0
デバイスファイル名の後の 'c' は、デバイスがキャラクタデバイスであることを示しています。また、'b' の場合はブロックデバイスかを示しています。その後に続く二つの数字はメジャー番号とマイナー番号と呼ばれるもので、カーネルを展開したディレクトリにある Documentation/devices.txt に規定が書かれています。これらの値は固定です。
/dev 以下を ls すると以下のようになっているはずです:
$ ls -l
total 0
crw-r--r-- 1 root root  5,  1 May  6 00:11 console
brw-r--r-- 1 root root 31,  1 May  6 00:11 mtdblock1
crw-r--r-- 1 root root  1,  3 Aug  4 14:27 null
crw-r--r-- 1 root root  5,  0 Aug  4 14:28 tty
crw-r--r-- 1 root root  4,  0 Aug  4 14:20 tty0
crw-r--r-- 1 root root  4,  1 Aug  4 14:20 tty1
crw-r--r-- 1 root root  4,  2 Aug  4 14:27 tty2
crw-r--r-- 1 root root  4,  3 Aug  4 14:27 tty3
crw-r--r-- 1 root root  4,  4 Aug  4 14:27 tty4
crw-r--r-- 1 root root  4,  5 Aug  4 14:27 tty5
crw-r--r-- 1 root root  4,  6 Aug  4 14:27 tty6
crw-r--r-- 1 root root  4,  7 Aug  4 14:28 tty7
crw-r--r-- 1 root root  4,  8 Aug  4 14:28 tty8
crw-r--r-- 1 root root  4,  9 Aug  4 14:28 tty9
crw-r--r-- 1 root root  4, 64 Aug  4 14:21 ttyS0
crw-r--r-- 1 root root  4, 65 Aug  4 14:28 ttyS1
crw-r--r-- 1 root root  4, 66 Aug  4 14:28 ttyS2
crw-r--r-- 1 root root  4, 67 Aug  4 14:28 ttyS3
crw-r--r-- 1 root root  1,  5 Aug  4 14:20 zero
行の先頭にある 'c' や 'b' が、キャラクタデバイスか 'b' はブロックデバイスかを示しています。
crw-r--r-- 1 root root  5,  1 May  6 00:11 console

5 や 1 という数字がデバイス番号です。


/var/log ディレクトリの追加 

inittab を見ると、以下のコマンドが繰り返し実行されることがわかります:

tty3::respawn:/usr/bin/tail -f /var/log/messages

/var/log というディレクトリはまだ無いので作る必要があります。

$ cd mnt/var
$ mkdir log

 

rootFS構築築の続き -3 に続きます。