嵌入式linux内核裁剪核心是“只留必需,删尽冗余”,需围绕硬件平台与应用需求精准取舍:明确soc型号、必需驱动、功能依赖及资源约束;推荐用makelocalmodconfig或make allnoconfig起步;重点裁剪非目标硬件驱动、冗余文件系统、ipv6等网络协议、kernel hacking调试项;最后通过编译验证、板级测试和dmesg分析确保功能完整。

嵌入式 Linux 系统中精简与裁剪内核,核心是“只留必需,删尽冗余”——不是盲目删减,而是围绕硬件平台和应用需求做精准取舍。裁剪后内核体积可从几十 MB 压缩到几 MB,启动时间缩短至秒级,内存占用显著降低,系统更稳定、更实时。
明确裁剪基线:先搞清“要什么、不要什么”
动手前必须厘清四个关键点:
- 目标硬件平台:确认 SoC 型号(如 Hi3516DV300、RK3399、高通 QCS610)、板级外设(如 GMAC 网卡、SPI Flash、MIPI 摄像头接口);
- 必需驱动:仅保留与实际硬件匹配的驱动,比如 ARM 架构支持、对应芯片的 GPIO/UART/I2C 控制器、存储控制器(eMMC/SD)、网络 PHY 驱动;
- 核心功能依赖:应用是否需要 ext4 文件系统、RTSP 协议栈、POSIX 线程、RTC 支持?这些决定是否启用 CONFIG_EXT4_FS、CONFIG_IP_NF_IPTABLES、CONFIG_POSIX_TIMERS 等;
- 资源硬约束:Flash 容量(如 32MB)、RAM(如 256MB)、最大允许启动时间(如 ≤3 秒)——这些直接限制可保留模块的总量。
高效生成最小配置:避免从零手动勾选
推荐两种快速收敛配置的方法:
-
makelocalmodconfig:在已有可运行的目标系统上执行,它会读取
/proc/modules和/sys,自动生成仅包含当前已加载模块的.config(模块设为m,其余设为n),非常适合作为裁剪起点; - make allnoconfig + 手动启用:适合全新平台或极致精简场景,先禁用全部选项,再按需逐项打开 CPU 架构、基础总线(ARM64/AMBA/PCI)、核心子系统(MMU、IRQ、timer)等刚性依赖项。
进入 make menuconfig 后,按 / 键搜索关键词(如 CONFIG_USB、wifi、CONFIG_BTRFS_FS),可快速定位并关闭无关条目。
关键裁剪方向:聚焦高频冗余模块
以下几类是嵌入式场景中最常被过度启用、也最容易安全裁减的部分:
- 硬件驱动:禁用所有非目标平台的架构支持(x86、RISC-V)、淘汰设备驱动(floppy、parallel port、IDE)、非本板网卡/声卡/显卡驱动;
-
文件系统:只保留
ext4(通用)或squashfs(只读固件),移除 Btrfs、XFS、NTFS、FAT32(除非 SD 卡必须)等; -
网络协议与子系统:关闭 IPv6、Amateur Radio、IrDA、DECnet;Netfilter 仅启用
iptable_filter和必要 conntrack 模块; -
调试与开发功能:关闭整个
Kernel hacking菜单(CONFIG_DEBUG_KERNEL=y)、禁用 kdump、ftrace、kgdb、printk 动态控制等; -
虚拟化与安全扩展:如 KVM、Xen、IMA/EVM、SMAP/SMEP(除非产品明确要求)一律设为
n。
验证与固化:确保裁剪不破坏功能
裁剪不是终点,验证才是关键:
- 编译后用
size vmlinux查看静态内核体积,用lsmod对比模块加载情况; - 烧录到目标板,重点验证:能否正常挂载根文件系统、网络是否连通、外设(如摄像头、串口)是否可用、系统是否在规定时间内完成启动;
- 若出现 panic 或驱动缺失,回查
dmesg输出,定位缺失的 CONFIG_XXX 选项,针对性启用(而非全开); - 最终将稳定配置保存为
arch/arm64/configs/your_board_defconfig,便于后续复用和版本管理。











