基于Buildroot定制最小Linux系统:把根文件系统裁剪到16MB
在SPI NOR Flash只有16MB、甚至8MB的嵌入式板上,每一次字节都很贵。Buildroot的优势在于:一条make menuconfig就能通过交叉编译生成工具链、根文件系统和内核镜像,帮开发者把"臃肿"挡在编译期。
先选对C库:musl 替代 glibc
体积的第一道分水岭是C库。实测同样的最小配置下,glibc 根文件系统的体积远大于 musl ——musl 能让根文件系统大幅减小。在Buildroot中切换只需一行:
./utils/config --set-str BR2_TOOLCHAIN_BUILDROOT_LIBC "musl"
musl 牺牲了极少数 glibc 扩展,但换来了数 MB 的空间回收,对大多数嵌入式应用完全够用。
BusyBox:把上百个命令压进一个二进制
BusyBox 的精髓是"单体多入口"——所有命令都是指向同一个二进制的符号链接。通过深度裁剪,BusyBox 二进制可以控制在很小的大小内:
make busybox-menuconfig
# Networking Utilities → 去掉 ftp/telnet/inetd
# Editors → 去掉 vi(除非你需要)
# Shells → 保留 ash,去掉 bash 兼容层
# Linux System Utilities → 保留 mount/umconfig,去掉不常用的工具
保存后执行:
make busybox-update-defconfig
光这一步,往往就能砍掉大量不必要的功能。
Init 系统与启动脚本精简
坚持用 BusyBox init,别碰 systemd——后者会引入一堆依赖和守护进程,让体积失控。在 System configuration 里把 Init system 选为 BusyBox,/dev management 用动态 devtmpfs 即可。
/etc/inittab 也尽量瘦身,只起一个串口控制台:
::sysinit:/etc/init.d/rcS
::respawn:/sbin/getty -L ttyS0 115200 vt100
rcS 里只挂载 proc、sysfs,不启动任何多余服务。
编译期与 post-build 双重瘦身
Buildroot 的 Build options 中务必开启:
BR2_ENABLE_DEBUG=n # 关闭调试符号
BR2_STRIP_strip=y # strip 目标二进制
更狠的一招是 post-build 脚本,在打包前扫荡冗余文件:
#!/bin/sh
# board/<soc>/post-build.sh
rm -rf ${TARGET_DIR}/usr/share/locale/*
rm -rf ${TARGET_DIR}/usr/share/man/*
rm -rf ${TARGET_DIR}/usr/include/*
find ${TARGET_DIR} -name "*.a" -delete
arm-linux-gnueabihf-strip ${TARGET_DIR}/bin/* 2>/dev/null
文档、头文件、静态库、调试符号往往是"隐形大户",清掉它们不影响运行。
文件系统格式:SquashFS + 压缩
最后一步是在 Filesystem images 中选择 SquashFS,并启用压缩。SquashFS 是只读高度压缩文件系统,能显著减少从存储介质读取的数据量。配合前面各项优化,根文件系统实际占用的 Flash 空间可以压缩到非常小,为 16MB 的 SPI NOR 留出充裕的内核和设备树空间。
如果系统还需要写用户数据,把 /var、/tmp 挂成 tmpfs,或用 overlayfs 叠加一个可写分区,既保精简又保灵活。
经过以上六步——换 musl、瘦 BusyBox、用轻量 init、编译期 strip、post-build 清理、SquashFS 压缩——把根文件系统控制在 16MB 以内并非极限挑战,而是 Buildroot 的标准动作。剩下的,就是按你板子的外设需求微调 linux-menuconfig,把 USB、HDMI、Audio 这些用不上的驱动关掉,一个干净利落的嵌入式 Linux 便出炉了。





