使用 busybox 定制自己的应用程序
1. Busybox 配置
首先在网上下载一个稳定的 busybox 版本,我用的版本是 busybox-1.18.2 ,然后解压到工作目录。 Busybox 的配置方法和标准的 linux 内核的配置方法非常类似,我们只要切换到 busybox 的根目录下,使用 make menuconfig 命令就可以轻松定制出适合特定用途的一组应用程序。
安装后,会发现 busybox 的 bin 目录下只有一个 busybox 二进制文件,其他命令, bin , sbin 以后 usr/bin , usr/sbin 目录下都是指向 busybox 的链接文件。这么多命令一个应用程序就搞定。
2. 安装 busybox 到文件系统
#make install PREFIX=/xxx
这样,应用程序就安装到指定目录下,却换到 /xxx 下看看, bin 目录, sbin 目录, usr/bin 目录, usr/sbin 目录下出现了很多的应用程序。
3. Busybox 的 init
除了基本的命令之外, busybox 还支持 init 功能,如同其他的 init 一样, busybox 的 init 也是完成系统的初始化工作,关机前的工作等等。 Linux 的内核被载入之后,机器就把控制权转交给内核, linux 的内核启动之后,做了一些工作,然后找到根文件系统里面的 init 程序,并执行它, busybox 的 init 进程会依次进行以下工作:
1) 为 init 设置信号处理过程
2) 初始化控制台
3) 剖析 /etc/inittab 文件
4) 执行系统初始化命令行,缺省情况下会使用 /etc/init.d/rcS
5) 执行所有导致 init 暂停的 inittab 命令(动作类型: wait )
6) 执行所有仅执行一次的 inittab (动作类型: once )
一旦完成以上工作, init 进程便会循环执行以下进程:
1) 执行所有终止时必须重新启动的 inittabl 命令(动作类型: once )
2) 执行所有终止时必须重新启动但启动前必须询问用户的 inittab 命令(动作类型: askfirst )
初始化控制台之后, busybox 会检查 /etc/inittab 文件是否存在,如果此文件不存在, busybox 会使用缺省的 inittab 配置,它主要为系统重引导,系统挂起以后 init 重启设置缺省的动作,此外它还会为四个虚拟控制台( tty1 到 tty4 )设置启动 shell 的动作。如果未建立这些设备文件, busybox 会报错。
inittab 文件中每一行的格式如下所示:( busybox 的根目录下的 example 文件夹中有详尽的 inittab 文件范例)
id:runlevel:action:process
尽管此格式与传统的 System V init 类似,但是, id 在 busybox 的 init 中具有不同的意义。对 busybox 而言, id 用来指定启动进程的控制 tty 。如果所启动的进程并不是可以交互的 shell ,例如 busybox 的 sh ( ash ),应该会有个控制 tty ,如果控制 tty 不存在, busybox 的 sh 会报错。 Busybox 将会完全忽略 runlevel 字段,所以空着它就行了。 Process 字段用来指定所执行程序的路径,包括命令行选项。 Action 字段用来指定下面表中 8 个可用到的 process 的动作之一:
l sysinit :为 init 提供初始化命令行的路径
l respawn :每当相应的进程终止执行便会重新启动
l askfirst :类似 respawn ,不过它的主要用途是减少系统上执行的终端应用程序的数量。它将会促使 init 在控制台上显示 ”Please press Enter to active this console” 的信息,并在重新启动之前等待用户按下 enter 键
l wait :告诉 init 必须等到相应的进程完成之后才能继续执行
l once :仅执行相应的进程一次,而且不会等待它完成
l ctratldel :当按下 Ctrl+Alt+Delete 组合键时,执行相应的进程
l shutdown :当系统关机时,执行相应的进程
l restart :当 init 重新启动时,执行相应的进程,通常此处所执行的进程就是 init 本身
以下是我的 inittab 文件:
这个 inittab 执行下列动作:
1) 将 /etc/rc.d/rcS 设置成系统的初始化文件
2) 在 115200 bps 的虚拟终端 ttyS0 上启动一个登陆会话
3) 当按下 Ctrl+Alt+Delete 组合键时,执行 /sbin/reboot
4) 告诉 init ,在系统关机的时候执行 /etc/rc.d/rcS stop 命令
5) 如果 init 重启系统,将 /sbin/init 设置成它会执行的程序
4. 系统的配置文件
配置文件一般放在 /etc/ 目录下。下面依次介绍 /etc/ 目录下各文件:
1) /etc/rc.d/
[root@fedora9 rc.d]# ls
init.d rc3.d rc.conf rc.modules rcS rc.serial rc.sysinit
rcS 是我 init 初始化命令行的文件。内容如下:
[root@fedora9 rc.d]# cat rcS
#!/bin/sh
# minimal startup script, will work with msh (this is best available in
# MMUless format).
# load the configuration information
. /etc/rc.d/rc.conf
mode=${1:-start}
if [ "$mode" = "start" ]
then
cfg_services=`ls /etc/rc.d/rc3.d/S*`
else
cfg_services=`ls /etc/rc.d/rc3.d/K*`
fi
#echo $cfg_services
# run the configured sequence
for i in $cfg_services
do
if [ -x $i ]
then
$i $mode
fi
done
if [ $# -ge 2 ]
then
exit 0
fi
# show all kernel log messages
#echo 8 > /proc/sys/kernel/printk
2) /etc/fstab
[root@fedora9 etc]# cat fstab
#
# /etc/fstab: static file system information.
#
# file system mount type options dump pass
proc /proc proc defaults 0 0
3) /etc/profile
这个文件是 sh 用的,当用户获得一个 shell 后, sh 就会根据这个文件配置用户的登陆环境,下面是我的 profile 文件:
其中 PATH 环境变量指定当用户键入一个命令时, sh 寻找这个命令的路径。
PS1 指定 sh 提示符的格式
4) /etc/ld.so.conf 和 /etc/ld.so.cache
这两个文件是与 lib 库有关的,它们用来指定应用程序寻找 lib 库的路径。我的 ld.so.conf 文件内容如下:
[root@fedora9 etc]# cat ld.so.conf
include ld.so.conf.d/*.conf
/usr/local/lib
ld.so.cache 里面的内容是由 ldconfig 命令生成的, ldconfig 根据 ld.so.conf 配置文件生成 ld.so.cache 里面的内容,应用程序读取的是 ld.so.cache 文件,因此如果变动了 ld.so.conf 文件,需要运行一次 ldconfig 才能使新的配置生效,另外如果新加了 lib 库文件,也需要 ldconfig 。
5) /etc/group
group 里面存放的是用户组的信息
6) /etc/passwd
passwd 里面存放的是用户的信息
7) /etc/shadow
shadow 文件是 pam 认证到的密码存放文件。
8) /etc/services
网络应用程序用到的标准服务端口映射表
9) /etc/hosts, /etc/host.conf, /etc/resolv.conf
host.conf 和 resolv.conf 是域名解析的时候用到的配置文件,其中 resolv.conf 里面是域名服务器的 ip 地址, host.conf 里面放的是主机的查找规则。