仿照Busybox的examples/inittab文件,在/work/nfs_root/fs_mini/etc目录下创建一个inittab文件,内容如下:
# /etc/inittab
::sysinit:/etc/init.d/rcS
ttySAC0::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
创建etc/init.d/rcS文件
这是一个脚本文件,可以在里面添加想自动执行命令。以下命令配置IP地址、挂接/etc/fstab指定的文件系统。
#!/bin/sh
ifconfig eth0 192.168.1.17
mount -a
第一行表示这是一个脚本文件,运行时使用/bin/sh解析。
第二行用来配置IP地址。
第三行挂接/etc/fstab文件指定的所有文件系统。
最后,还要改变它的属性,使它能够执行:
chmod +x etc/init.d/rcS
创建etc/fstab文件
内容如下,表示执行“mount -a”命令后将挂接proc、tmpfs文件系统
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
/etc/fstab文件被用来定义文件系统的“静态信息”,这些信息被用来控制mount命令的行为。文件中各字段意义如下:
① device:要挂接的设备
比如/dev/hda2、/dev/mtdblock1等设备文件;也可以是其他格式,比如对于proc文件系统这个字段没有意义,可以是任意值;对于NFS文件系统,这个字段为 host:dir。
② mount-point:挂接点
③ type:文件系统类型
比如proc、jffs2、yaffs、ext2、nfs等;也可以是auto,表示自动检测文件系统类型。
④ options:挂接参数,以逗号隔开
/etc/fstab的作用不仅仅是用来控制“mount -a”的行为,即使是一般的mount命令也受它控制。除与文件系统类型相关的参数外,常用的有以下几种取值
⑤ dump和fsck order:用来决定控制dump、fsck程序的行为。
dump是一个用来备份文件的程序,fsck是一个用来检查磁盘的程序。要想了解更多信息,请阅读它们的man手册。
dump程序根据dump字段的值来决定这个文件系统是否需要备份,如果没有这个字段,或其值为0,则dump程序忽略这个文件系统。
fsck程序根据fsck order字段来决定磁盘的检查顺序,一般来说对于根文件系统这个字段设为1,其他文件系统设为2。如果设为0,则fsck程序忽略这个文件系统。
构建dev目录
本节使用两种方法构建dev目录。
1.静态创建设备文件
为简单起见,本书先使用最原始的方法处理设备:在/dev目录下静态创建各种节点(即设备文件)。
从系统启动过程可知,涉及的设备有:/dev/mtdblock*(MTD块设备)、/dev/ttySAC*(串口设备)、/dev/console、/dev/null,只要建立以下设备就可以启动系统。
mkdir -p /work/nfs_root/fs_mini/dev
cd /work/nfs_root/fs_mini/dev
sudo mknod console c 5 1
sudo mknod null c 1 3
sudo mknod ttySAC0 c 204 64
sudo mknod mtdblock0 b 31 0
sudo mknod mtdblock1 b 31 1
sudo mknod mtdblock2 b 31 2
注意 在一般系统中,ttySAC0的主设备号为4,但是在S3C2410、S3C2440所用的Linux 2.6.22.6上,它们的串口主设备号为204。
其他设备文件可以当系统启动后,使用“cat /proc/devices”命令查看内核中注册了哪些设备,然后一一创建相应的设备文件。
实际上,各个Linux系统中dev目录的内容很相似,本书最终使用的dev目录就是从其他系统中复制过来的。
2.使用mdev创建设备文件
mdev是udev的简化版本,它也是通过读取内核信息来创建设备文件。
mdev的用法请参考busybox-1.7.0/doc/mdev.txt文件。mdev的用途主要有两个:初始化/dev目录、动态更新。动态更新不仅是更新/dev目录,还支持热拔插,即接入、卸下设备时执行某些动作。
要使用mdev,需要内核支持sysfs文件系统,为了减少对Flash的读写,还要支持tmpfs文件系统。先确保内核已经设置了CONFIG_SYSFS、CONFIG_TMPFS配置项。
使用mdev的命令如下,请参考它们的注释以了解其作用:
mount -t tmpfs mdev /dev /* 使用内存文件系统,减少对FLASH的读写 */
mkdir /dev/pts /* devpts用来支持外部网络连接(telnet)的虚拟终端 */
mount -t devpts devpts /dev/pts
mount -t sysfs sysfs /sys /* mdev通过sysfs文件系统获得设备信息 */
echo /bin/mdev > /proc/sys/kernel/hotplug /* 设置内核,当有设备拔插时调用/bin/mdev程序 */
mdev -s /* 在/dev目录下生成内核支持的所有设备的节点 */
要在内核启动时,自动运行mdev。这要修改/work/nfs_root/fs_mini中的两个文件:修改etc/fstab来自动挂载文件系统、修改etc/init.d/rcS加入要自动运行的命令。修改后的文件如下:
etc/fstab
# device mount-point type options dump fsck order
proc /proc proc defaults 0 0
tmpfs /tmp tmpfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
etc/init.d/rcS:加入下面几行
mount -a
mkdir /dev/pts
mount -t devpts devpts /dev/pts
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
需要注意的是,开发板上通过mdev生成的/dev目录中,S3C2410、S3C2440是串口名是s3c2410_serial 0、s3c2410_serial 1、s3c2410_serial 2,不是ttySAC0、ttySAC1、ttySAC2。需要修改etc/inittab文件。
修改前:
ttySAC0::askfirst:-/bin/sh
修改后:
s3c2410_serial0::askfirst:-/bin/sh
另外,mdev是通过init进程来启动的,在使用mdev构造/dev目录之前,init进程至少要用到设备文件/dev/console、/dev/null,所以要建立这两个设备文件。
mkdir -p /work/nfs_root/fs_mini/dev
cd /work/nfs_root/fs_mini/dev
sudo mknod console c 5 1
sudo mknod null c 1 3
构建其他目录
其他目录可以是空目录,比如proc、mnt、tmp、sys、root等,如下创建:
cd /work/nfs_root/fs_mini
mkdir proc mnt tmp sys root
现在,/work/nfs_root/fs_mini目录下就是一个非常小的根文件系统。开发板可以将它作为网络根文件系统直接启动。如果要烧入开发板,还要将它制作为一个文件,称为映象文件。
制作/使用jffs2文件系统映象文件
编译制作jffs2映象文件的工具
mtd-utils-05.07.23.tar.bz2是MTD设备的工具包,编译它生成mkfs.jffs2工具,用它来将一个目录制作成jffs2文件系统映象文件。
这个工具包需要zlib压缩包,先安装zlib。下载源码zlib-1.2.3.tar.gz,执行以下命令进行安装:
tar xzf zlib-1.2.3.tar.gz
cd zlib-1.2.3
./configure --shared --prefix=/usr
make
sudo make install
然后编译mkfs.jffs2:
tar xjf mtd-utils-07.05.23.tar.bz2
cd mtd-utils-05.07.03/util
make
sudo make install