1.【Busybox】Busybox源码分析-02 | init程序
2.用 BusyBox 构建根文件系统
3.BusyboxBusybox源码分析-01 | 源码目录结构和程序入口
4.ç¼è¯busyboxå°win
【Busybox】Busybox源码分析-02 | init程序
在Linux内核启动后期,init线程执行的第一个用户空间程序是init,这个程序在Busybox源码中的实现由/init目录下的init.c编译而成,其入口点为init_main()。在init_main()函数中添加了标识代码,验证了这一过程。Fiora源码实际上,当Busybox编译安装后,会通过链接指向../bin/busybox来执行init。 分析init程序,当CONFIG_FEATURE_USE_INITTAB配置启用时,会依据/etc/inittab文件中的配置进行操作;若文件不存在或未启用该配置,init将执行默认行为,如运行INIT_SCRIPT和启动"askfirst" shell。而BusyBox的蓝木大学源码init不支持运行级别,sysvinit是需要的选项来处理运行级别管理。 Linux支持7个运行级别:0:停机状态,等同于关机,不可作为默认运行级别。
1:单用户模式,用于系统维护,禁止远程登录。
2:多用户无网络模式。
3:多用户有网络模式,常见运行级别。
4:保留,未使用。
5:X图形界面,登录后进入。带模板源码下载
6:正常关闭并重启,同样不能作为默认运行级别。
可以通过runlevel命令查看当前运行级别,如在Ubuntu系统中,运行runlevel命令会显示当前的运行级别。用 BusyBox 构建根文件系统
根文件系统为 Linux 移植的最后一步,构建根文件系统是打造最小化嵌入式 Linux 系统的关键。
根文件系统集成了库、软件、命令、设备文件和配置文件,是 Linux 运行的基础。这个“根”字揭示了其核心地位,没有它,文本朗读 c 源码其他系统和软件无法运作。例如,ls、mv、ifconfig 命令就是根文件系统中的小型软件。
构建根文件系统,通常以 Ubuntu 为参考。目录结构包括但不限于:/bin、/dev、/etc、/lib、/mnt、/proc、/usr、c 源码阅读软件/sbin、/sys 和 /opt 等。
BusyBox 是一个集成大量 Linux 命令和工具的软件,通过配置和编译,可简化根文件系统的构建。从 busybox.net/ 下载源码,选择合适版本进行编译。
在 Ubuntu 虚拟机中构建 NFS 服务,创建 rootfs 目录存放根文件系统。BusyBox 编译后,其工具和文件被安装至 rootfs 目录下的 bin、sbin 和 usr 文件夹,Linux 内核查找并运行此 init 程序。
编译完成后,根文件系统仅包含 BusyBox 工具和库文件,还需添加 lib 目录中的库文件,包括动态和静态库。需在 rootfs 目录下分别创建 lib 和 usr/lib 文件夹,并从交叉编译器中复制库文件至对应位置。
创建 dev、proc、mnt、sys、tmp 和 root 等文件夹,完成根文件系统初步构建。
使用 NFS 挂载测试根文件系统。设置 bootargs 环境变量指向 NFS 挂载点,启动开发板后,使用 ls 命令进行测试。注意,当前根文件系统可能不完全完善,例如 /etc/init.d/rcS 文件不可用。
根文件系统的完善将在后续文章中详细探讨。关注公众号,获取 busybox 相关资料。
BusyboxBusybox源码分析- | 源码目录结构和程序入口
Busybox是一个开源项目,遵循GPL v2协议。其本质是将多个UNIX命令集合成一个小型可执行程序,适用于构建轻量级根文件系统,特别是嵌入式系统设计中。版本1..0的Busybox体积小巧,仅为几百千字节至1M左右,动态链接方式下大小更小。其设计模块化,可灵活添加、去除命令或调整选项。
Busybox程序主体在Linux内核启动后加载运行,入口为main()函数,位于libbb/appletlib文件末尾。通过条件分支处理,决定以库方式构建。在函数体中,使用mallopt()调整内存分配参数以优化资源使用。接着通过条件宏定义,控制代码编译逻辑,如在Linux内核启动后期加载并运行Busybox构建的init程序。命令行输入时,Busybox会解析参数,执行对应操作。
在源码中,通过char * applet_name表示工具名称,调用lbb_prepare()函数设置其值为“busybox”。之后解析命令行参数,如在mkdir iriczhao命令中,解析到mkdir命令传递给applet_name。配置了FEATURE_SUID_CONFIG宏定义时,会从/etc/busybox.conf文件中解析配置参数。最后,执行run_applet_and_exit()函数,根据NUM_APPLETS值决定执行命令或报错。
在命令行下键入命令后,执行关键操作的函数是find_applet_by_name()和run_applet_no_and_exit()。编译构建并安装Busybox后,可执行程序和命令链接分布在安装目录下。从源码角度,命令有一一对应的执行函数,通过命令表管理命令入口函数。在代码执行逻辑中,首先调用find_applet_by_name()获取命令表数组下标,再传递给run_applet_no_and_exit()执行对应命令。
ç¼è¯busyboxå°win
1ãé¦å å®è£ ä¸ä¸ªLinuxåè¡çï¼å¦UbuntuæDebianï¼ä¸è½½ææ°çBusyBoxæºä»£ç ã
2ãå ¶æ¬¡è§£å缩æºä»£ç æ件ï¼è¿å ¥BusyBoxç®å½å¹¶è¿è¡makeå½ä»¤ã
3ãæåBusyBoxå°è¢«ç¼è¯ä¸ºå¯æ§è¡æ件ã