fs之BusyBox的使用与编译
总览
本文使用 linux-2.6.22.6 内核, 使用jz2440开发板.
什么是BusyBox
BusyBox 是linux下的一个应用程序, 集成了最常用的Linux命令和工具.
在jz2440开发板里, BusyBox是内核成功启动后, 调用的第一个应用程序.
启动jz2440开发板, 在终端内输入如下指令, 可以发现系统指令都是BusyBox的软链接.
# 开发板终端 |
BusyBox的使用
内核启动后, 调用的第一个应用程序就是BusyBox. 而BusyBox的职责如下:
- 读取配置文件,
/etc/inittab - 解析配置文件,
<id>:<runlevels>:<action>:<process>- 指定程序,
<process> - 何时执行,
<action>
- 指定程序,
- 执行程序
启动BusyBox
由 kernel之内核启动分析 可知,start_kernel 函数最后会尝试调用: run_init_process(execute_command);, 由uboot的传入execute_command.
查看uboot的bootargs环境变量, init=/linuxrc, 所以会执行 run_init_process("/linuxrc")
由于 /linuxrc 是 /bin/busybox 的软连接, 所以最终调用了busybox.
如果调用失败, 会依次尝试如下指令, 但这些指令都是busybox的软连接, 等同于调用了busybox指令
run_init_process("/sbin/init");, busybox的软连接run_init_process("/etc/init");, 指令不存在run_init_process("/bin/init");, 指令不存在run_init_process("/bin/sh");, busybox的软连接
BusyBox 源码大致的函数调用关系:
init_main, busybox的入口parse_inittab, 准备分析配置文件file=fopen(INITTAB, "r"), 打开配置文件/etc/inittabnew_init_action, 创建并链表化 init_action 结构.
run_actions(SYSINIT), 初始化工作, 最早被执行waitfor(a,0), 等待执行完成delete_init_action(a), 从 init_action_list 链表中删除, 不会再被执行了
run_actions(WAIT), 等待执行完成- 同
run_actions(SYSINIT)
- 同
run_actions(ONCE), 执行一次且不会等待执行完成.run(a), 执行指令, 不会等待执行完成delete_init_action(a), 从链表中删除
run_actions(RESPAWN), 如果子进程终止, 那么会重新孵化(调用执行).run_actions(ASKFIRST), 相比于RESPAWN, 要求用户按键确认.
BusyBox使用说明
查看busybox源码, busybox-1.7.0/examples/inittab 文件内有较为详细的说明.
关键内容如下:
- 配置文件格式:
<id>:<runlevels>:<action>:<process> <id>, 指定tty终端. 非强制, 会在前面加上/dev/变成/dev/<id>- 譬如
tty2, 实际运行的终端是/dev/tty2 - 如果没有值的话, 对应的文件会是
/dev/null
- 譬如
<runlevels>, 忽略<action>, 包括:sysinit, 用作系统初始化, 执行指令并等待完成respawn, 执行指令, 如果子线程终止, 会被重新孵化/执行askfirst, 功能同respawn, 只是需要用户按键确认wait, 执行指令并等待完成once, 执行指令不等待.restart,ctrlaltdel,shutdown, 由linux内核信号量传递而来. 执行指令并等待.
<process>, 要执行的应用程序或者脚本- 如果BusyBox没有找到
/etc/inittab文件, 则会自动加载如下应用程序:::sysinit:/etc/init.d/rcS, 系统初始化时, 调用rcS脚本::askfirst:/bin/sh, 询问后, 运行终端::ctrlaltdel:/sbin/reboot, 按键重启::shutdown:/sbin/swapoff -a, 关机时要做的事::shutdown:/bin/umount -a -r, 关机时要做的事::restart:/sbin/init, 重启后要做的事
- jz2440的
/etc/inittab内容如下::sysinit:/etc/init.d/rcS, 初始化配置s3c2410_serial0::askfirst:-/bin/sh, 指定串口运行终端::ctrlaltdel:/sbin/reboot, 特定按键重启::shutdown:/bin/umount -a -r, 关机时要做的事
BusyBox的编译
BusyBox的编译和安装可以查看源码内提供的 INSRALL 文件. 编译方法和过程和内核是类似的.
在linux主机ubuntu下进行交叉编译:
tar -xjf busybox-1.7.0.tar.bz2 # 解压 |
BusyBox的配置项也非常多, 在此就不深入研究了.
需要注意的是, 因为这里是交叉编译. 所以编译前, 需要修改BusyBox的编译工具链.
因为没有在Menuconfig界面里找到, 所以通过Makefile文件直接修改
# pwd=./busybox-1.7.0 |
这样, BusyBox编译就完成了.
然后, 就可以考虑构建linux的文件系统了
要构建一个最小的linux根文件系统, 至少需要如下文件:
dev/console, linux内核的标准IO接口dev/null, 相当于一个NULL文件- init进程, 即
bin/busybox etc/inittab配置文件, (可以省略, busybox会调用其默认值)- 配置文件里指定的应用程序或脚本, 如
/etc/init.d/rcSbin/sh - C语言库
lib/
更多资料
- busybox 详解
- 嵌入式Linux应用开发完全手册, 第17章BusyBox相关部分
原创于 DRA&PHO