BusyBox
The Swiss Army Knife of Embedded Linux
概念
一个集成了数百个常用Linux/Unix命和工具的软件,可与glibc或uclibc库进行链接编译,可采用动态/静态链接
特点
减小文件尺寸,减轻编译工作量
目录结构
重点关注 applets、init、libbb
libbb:Busybox各个命令的共享代码,主要有功能测试失败、中止程序错误信息,链表管理功能(llist.c)、命令行参数解析(getopt32.c)
applets:命令集合
init:init进程实现的源文件(init/init.c)
init程序
开始→设置信号处理函数、初始化控制台→解析inittab文件→执行inittab众多命令
/etc/inittab
启动相关进程或脚本,配置文件、创建哪些进程在此定制,文件中每个条目用来定义一个子进程
条目格式:<id> : <runlevels> : <action> : <process>
id:子进程要使用的控制台,默认为与init进程相同
runlevels:无意义,在Linux有意义
action:表示init进程如何控制这个子进程
process:执行的程序,可执行程序或脚本
例程: :sysinit:/etc/init.d/rcS
id省略,取默认值,runlevels无效,启动sysinit进程,执行rcS脚本
action | 描述 |
---|---|
sysinit | 系统启动后最先执行 |
wait | 系统执行完sysinit进程后执行 |
once | 系统执行完wait进程后执行 |
respawn | 系统启动完once进程后执行,有退出则重新执行 |
askfirst | 系统启动完respawn进程后执行,有退出则重新执行 |
shutdown | 系统关机时 |
restart | 配置了CONFIG_FEATURE_USE_INITTAB,且init进程接收到SIGHUP信号 |
ctrlaltdel | Stuff to do before rebooting |
Busybox编译、运行、安装
一般使用menuconfig(N-curses(基于菜单的)配置工具),make menuconfig→make→make install
- 配置时一般选择glibc动态编译,所得可执行文件linuxrc内存较小
- 编译后可在.config查看配置选项
- 解析.config文件,结果存放在include/bbconfigopts.h
- 各命令配置选项集合在include/config目录下,以该目录下文件生成一个完整的.h文件,即最终配置文件include/applet_tables.h
- 安装目录:_install/bin, sbin, user, linuxrc
向Busybox添加新命令
- 命令存放路径选择:任一xxxutils目录下(最好miscutils),取名hello_busybox.c
- 编写命令源代码:函数名有讲究,hello_busybox_main
- 修改编译文件:xxxutils/Config.src(Config.in),使配置界面有此命令可选择
- 环境变量设置:xxxutils/Kbuild.src
- 命令生成后存放位置:include/applets.src.h(applets.h),三个参数:命令名字、命令存放路径、命令权限
- 增加帮助信息:include/usage.src.h(usage.h)
- 编译、测试
--有参考,侵删--