Busybox 源码编译与裁剪:制作最小根文件系统

发布时间:2026/7/22 1:24:02
Busybox 源码编译与裁剪:制作最小根文件系统 Busybox 源码编译与裁剪制作最小根文件系统如果说 Linux 内核是皇帝那 BusyBox 就是那个一个人干一百个岗位的超级打工人——一个不到 2MB 的程序包含了 ls、cp、cat、vi、httpd……几百个命令的完整实现。引言在嵌入式 Linux 开发中BusyBox 是制作根文件系统的核心工具。它将数百个常用 Unix 命令集成到单个可执行文件中通过软链接的方式模拟出各种命令。本文将从源码下载、配置、编译到制作最小根文件系统全流程实操讲解。一、BusyBox 是什么BusyBox 是一个开源软件项目由 Bruce Perens 于 1996 年发起最初是为 Debian 安装盘设计的。它的核心思想是“瑞士军刀”模式单个二进制文件通常 1~2MB通过 argv[0]程序名判断要执行哪个命令支持通过软链接调用不同命令名BusyBox vs 完整命令对比对比项BusyBox完整命令集合体积~1.5MB~50MB命令数量300300功能完整性够用精简版选项完整依赖库可静态编译零依赖依赖多个库适用场景嵌入式、救援系统桌面/服务器二、源码下载与解压# 下载 BusyBox 源码以 1.36.1 版本为例wgethttps://busybox.net/downloads/busybox-1.36.1.tar.bz2# 解压tar-xjfbusybox-1.36.1.tar.bz2# 进入源码目录cdbusybox-1.36.1三、配置 BusyboxBusyBox 使用和 Linux 内核一样的 Kconfig 配置系统支持三种配置界面# 1. 图形界面配置需要ncurses库makemenuconfig# 2. 纯文本问答式配置makeconfig# 3. 使用默认配置makedefconfig关键配置项详解进入make menuconfig后需要关注以下配置1. 编译方式选择静态/动态Settings --- [*] Build static binary (no shared libs)对于最小根文件系统强烈建议静态编译。这样 busybox 不依赖任何外部库一个文件就能跑。如果选择动态编译则还需要部署 libc 等共享库。2. 交叉编译工具链设置Settings --- (arm-linux-gnueabihf-) Cross compiler prefix填入你的交叉编译工具链前缀。如果是 ARM Cortex-A 平台通常是arm-linux-gnueabihf-。3. 裁剪不需要的命令Applets --- # 按需勾选/取消勾选各个命令以下是一些可以按需裁剪的模块模块说明建议Linux Module Utilities内核模块管理按需保留Networking Utilities网络工具保留 ifconfig、pingEditors编辑器保留 viCoreutils核心命令全部保留ShellShell 解释器保留 ashFinding Utilities查找工具按需保留Linux System Utilities系统工具保留 mdev、mountMiscellaneous Utilities杂项工具大量裁剪4. 安装路径设置Settings --- (_install) Destination path for make install默认安装到_install目录可以改成你想要的根文件系统目录。四、编译与安装# 编译使用4线程加速make-j4# 安装到默认的 _install 目录makeinstall编译完成后_install目录结构如下_install/ ├── bin/ │ ├── busybox # 核心二进制文件 │ ├── sh - busybox # 软链接 │ ├── ls - busybox │ ├── cat - busybox │ ├── vi - busybox │ └── ...上百个软链接 ├── sbin/ │ ├── init - busybox │ ├── ifconfig - busybox │ ├── mdev - busybox │ └── ... └── usr/ ├── bin/ │ └── ...部分命令软链接 └── sbin/ └── ...五、完善最小根文件系统BusyBox 安装的_install目录只是一个半成品还需要手动添加设备节点、配置文件等才能使用。5.1 创建必要目录cd_install# 创建系统目录mkdir-pdev etc proc sys tmp var/log root5.2 创建设备节点# 静态创建最基本的设备节点sudomknod-m622dev/console c51sudomknod-m666dev/null c13sudomknod-m666dev/zero c15sudomknod-m666dev/ttyS0 c464sudomknod-m660dev/tty c50注意mknod 需要在 Linux 环境下以 root 权限执行。如果是在 Windows 的 WSL 中操作需要确保 WSL 支持 mknod。5.3 创建 /etc/inittabcatetc/inittabEOF ::sysinit:/etc/init.d/rcS ttyS0::respawn:/bin/sh ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r EOF5.4 创建启动脚本 /etc/init.d/rcSmkdir-petc/init.dcatetc/init.d/rcSEOF #!/bin/sh mount -t proc proc /proc mount -t sysfs sysfs /sys mount -t tmpfs tmpfs /tmp mount -t tmpfs tmpfs /dev echo /sbin/mdev /proc/sys/kernel/hotplug mdev -s # 设置主机名 hostname myboard # 配置网络 ifconfig lo 127.0.0.1 up ifconfig eth0 192.168.1.100 netmask 255.255.255.0 up echo Welcome to MyBoard! EOFchmodx etc/init.d/rcS5.5 创建 /etc/fstabcatetc/fstabEOF # device mountpoint type options dump pass proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 tmpfs /tmp tmpfs defaults 0 0 tmpfs /dev tmpfs defaults 0 0 EOF5.6 创建 /etc/profilecatetc/profileEOF export PATH/bin:/sbin:/usr/bin:/usr/sbin export LD_LIBRARY_PATH/lib:/usr/lib export HOME/root export PS1[rootmyboard \W]# alias llls -l EOF六、验证根文件系统6.1 查看根文件系统大小# 查看总大小du-sh_install/# 输出示例: 1.8M _install/# 查看各目录大小du-sh_install/*# 输出示例:# 1.6M _install/bin# 112K _install/sbin# 4.0K _install/dev# 4.0K _install/etc静态编译的 BusyBox 根文件系统总大小通常在2MB 以内非常适合资源受限的嵌入式设备。6.2 使用 QEMU 模拟测试如果没有开发板可以用 QEMU 先验证根文件系统是否能正常工作# 使用 QEMU 模拟 ARM 环境qemu-system-arm\-Mvexpress-a9\-kernelzImage\-dtbvexpress-v2p-ca9.dtb\-appendroot/dev/ram rdinit/sbin/init consolettyAMA0\-initrdrootfs.ext2.gz\-nographic如果一切正常你会看到类似输出Welcome to MyBoard! [rootmyboard /]# ls bin dev etc proc sbin sys tmp usr var [rootmyboard /]# busybox BusyBox v1.36.1 (2026-01-01) multi-call binary ...七、常见编译问题排查问题原因解决方案tc: not found缺少 texinfosudo apt install texinfoerror: sys/cdefs.h: No such file缺少 glibc 头文件sudo apt install libc6-dev编译出的 busybox 无法运行工具链架构不匹配检查 Cross compiler prefix 配置软链接创建失败在 Windows/NTFS 上操作在 Linux 环境下执行 make install总结BusyBox 是制作嵌入式根文件系统最轻量、最实用的方案。通过静态编译 命令裁剪一个不到 2MB 的根文件系统就能提供完整的 Shell 环境、常用命令和设备管理能力。核心步骤就三步配置menuconfig、编译make、安装make install然后手动补齐 dev 设备节点和 etc 配置文件即可。这套流程在后续的 Buildroot 中也是底层依赖理解了手动制作的过程再去用 Buildroot 一键构建就能游刃有余。