当前位置:首页 > 嵌入式 > 嵌入式分享
[导读]在SPI NOR Flash只有16MB、甚至8MB的嵌入式板上,每一次字节都很贵。Buildroot的优势在于:一条make menuconfig就能通过交叉编译生成工具链、根文件系统和内核镜像,帮开发者把"臃肿"挡在编译期。


在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 便出炉了。

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
换一批
延伸阅读

很多刚接触嵌入式Linux的工程师看到arch/arm64/boot/dts/下成片的.dts、.dtsi文件就头大。其实设备树(Device Tree)本质就是一份"硬件简历"——用树形结构告诉内核:板子上有啥外设、挂...

关键字: 设备树 DTS 嵌入式Linux

嵌入式Linux系统的构建是一场与资源的持久博弈。当项目只需要网络通信与GPIO控制时,承载完整桌面环境的发行版无异于用卡车运信封。Buildroot作为一套基于Makefile和Kconfig的自动化构建工具,以&qu...

关键字: Buildroot Linux

设备树(Device Tree, DTB)是嵌入式Linux系统中描述硬件的“骨架”。一个错误的status、一个拼错的compatible,就可能导致外设驱动无法加载或系统崩溃。本文总结十个在ARM/Linux设备树编...

关键字: 嵌入式Linux 设备树

在嵌入式Linux开发中,设备树(Device Tree)已成为描述硬件的标准。它让内核与硬件解耦,实现“一份内核,适配万千板卡”。本文将跳过繁杂的理论,直击设备树节点编写与内核驱动匹配的核心流程。

关键字: 嵌入式Linux 设备树 Device Tree

在物联网设备日益普及的今天,固件空中升级(OTA)已成为设备维护和功能更新的标准方式。A/B分区架构结合差分升级技术,能够在保证系统高可用性的同时,显著降低传输数据量,特别适合带宽受限的嵌入式环境。本文将深入探讨A/B分...

关键字: 固件升级 OTA 嵌入式Linux

在嵌入式Linux开发中,将操作系统移植到自定义硬件平台需要完成两大核心任务:构建适配的根文件系统和修改设备树(Device Tree)以描述硬件配置。本文以ARM架构开发板为例,解析如何使用Buildroot工具链完成...

关键字: Linux移植 Buildroot

在资源极度受限的嵌入式场景中,如物联网传感器或低功耗网关,每一KB的存储空间都寸土寸金。传统的Linux发行版动辄数百兆的体积,显然无法满足这类战场。利用Buildroot或Yocto构建一个小于10MB的极简根文件系统...

关键字: Linux内核 Buildroot

在嵌入式Linux开发中,设备树(Device Tree)已成为硬件描述与内核解耦的核心机制。传统静态设备树在编译时固化硬件信息,难以适应多变的硬件配置需求。而动态设备树配置技术通过设备树叠加(Overlay)机制,允许...

关键字: 嵌入式Linux 设备树

在嵌入式Linux开发中,开发者常面临目标设备资源受限(如ARM Cortex-A系列处理器、低内存配置)的挑战,无法直接在设备上完成代码编译与调试。交叉编译与远程调试技术通过“宿主机-目标机”分离架构,将编译与调试任务...

关键字: 嵌入式Linux 交叉编译 远程调试

在嵌入式Linux开发中,多线程技术是提升系统并发处理能力的核心手段。然而,从“能跑”到“稳定”的跨越,需要开发者深入理解并发本质、同步机制与工程实践原则。

关键字: 嵌入式Linux 多线程
关闭