make menuconfig 图形化配置:内核功能裁剪入门

📅 2026/7/20 20:39:22 👁️ 阅读次数 📝 编程学习
make menuconfig 图形化配置:内核功能裁剪入门

make menuconfig 图形化配置:内核功能裁剪入门

作者:黒漂技术佬 | 系列:Linux内核配置与移植


引言

上篇文章讲了 Kconfig 和 Makefile 的原理,这篇文章我们正式进入「点菜环节」。make menuconfig是内核开发中使用频率最高的配置工具之一。它提供了一个基于文本的图形化界面,让你像逛超市一样挑选内核功能。对于嵌入式开发者来说,功能裁剪是核心技能——Flash 空间有限,不需要的功能必须删得干干净净。


一、环境准备

make menuconfig需要ncurses库支持。不同发行版先装好依赖:

# Ubuntu/Debiansudoaptinstallbuild-essential libncurses5-dev flex bison# CentOS/RHELsudoyuminstallncurses-devel flex bison# Arch Linuxsudopacman-Sncursesmakegcc flex bison

进入内核源码目录后,先加载默认配置:

cdlinux-5.10makeARCH=armCROSS_COMPILE=arm-linux-gnueabihf- xxx_defconfig

这里的ARCH=arm指定目标架构,CROSS_COMPILE指定交叉编译器前缀。然后启动图形化配置:

makeARCH=armCROSS_COMPILE=arm-linux-gnueabihf- menuconfig

二、menuconfig 界面操作指南

进入后的界面长这样(典型布局):

┌──────────────────────── Linux/arm 5.10.0 Kernel Configuration ──────────────────────────┐ │ Arrow keys navigate the menu. <Enter> selects submenus ---> │ │ <Y> includes, <N> excludes, <M> modularizes features. │ │ Press <Esc> to exit, <?> for Help, </> for Search. │ │ ┌─────────────────────────────────────────────────────────────────────────────────────┐ │ │ │ General setup ---> │ │ │ │ [*] Enable loadable module support ---> │ │ │ │ -*- Enable the block layer ---> │ │ │ │ System Type ---> │ │ │ │ Kernel Features ---> │ │ │ │ Boot options ---> │ │ │ │ CPU Power Management ---> │ │ │ │ Networking support ---> │ │ │ │ Device Drivers ---> │ │ │ │ File systems ---> │ │ │ │ Security options ---> │ │ │ └─────────────────────────────────────────────────────────────────────────────────────┘ │ │ <Select> < Exit > < Help > < Save > < Load > │ └─────────────────────────────────────────────────────────────────────────────────────────┘

操作快捷键速查

快捷键功能说明
↑ ↓ ← →导航移动光标、进入/退出子菜单
Enter进入子菜单--->表示有子菜单
Space切换状态Y → M → N 循环(或勾选/取消)
Y编入内核选项变成[*]<*>
M编译为模块选项变成<M>
N不编译选项变成[ ]< >
/搜索按配置名或关键字搜索
?查看帮助显示当前项的 help 信息
Esc Esc退出按两次 Esc 退出当前菜单

符号含义

符号含义
[*]/<*>编译进内核镜像(Y)
[ ]/< >不编译(N)
<M>编译为可加载模块(M)
-*-当前项被其他项 select 强制选中的
--->该项有子菜单

三、嵌入式功能裁剪实战

对于嵌入式开发,以下模块是裁剪的高频区域:

3.1 文件系统裁剪

路径:File systems --->

File systems ---> <*> The Extended 4 (ext4) filesystem # 根文件系统必须 < > DOS/FAT/EXFAT/NT Filesystems # 嵌入式一般不用 <*> Second extended fs support # ext2/3 有时需要 [ ] Quota support # 配额管理——砍掉 < > NFS client support # 网络文件系统——看需求 < > NFS server support

裁剪原则:根文件系统用的那个必须留(通常是 ext4),其他的看项目需求。嵌入式设备基本不需要 FAT/NTFS、NFS、XFS。

3.2 网络协议栈裁剪

路径:Networking support --->

Networking support ---> [*] TCP/IP networking # 这个必须留 [ ] Amateur Radio support # 业余无线电——砍掉 < > Bluetooth subsystem support # 不需要就砍 < > CAN bus subsystem support # 需要CAN通信再开 [ ] Wireless # WiFi需要才开 < > NFC subsystem support

嵌入式设备如果只走以太网,可以把蓝牙、WiFi、NFC、CAN 等全部关掉。内核镜像能缩小不少。

3.3 驱动裁剪

路径:Device Drivers --->

这是内核体积的大头(占比60%以上),也是裁剪收益最大的区域:

Device Drivers ---> < > ATA/ATAPI/MFM/RLL support # IDE硬盘——嵌入式不接 < > Fusion MPT device support # 服务器RAID——砍掉 < > IEEE 1394 (FireWire) support # 火线接口——砍掉 < > ISDN support # 上古拨号——砍掉 < > Macintosh device drivers # 苹果设备——砍掉 [*] MTD support ---> # Flash存储——必须留 < > Sound card support ---> # 声卡——看需求 [*] SPI support ---> # SPI总线——常用 [*] I2C support ---> # I2C总线——常用 [*] GPIO Support ---> # GPIO——必须留

一个窍门Device Drivers下凡是带厂商名字的(Apple/Macintosh/Dell/IBM),嵌入式场景基本都能关。

3.4 调试选项裁剪

路径:Kernel hacking --->

Kernel hacking ---> [ ] Kernel debugging [ ] Compile-time checks and compiler options [ ] printk and dmesg options

调试阶段开启,量产阶段关闭。关闭调试选项可以显著减小内核体积,并提升运行效率。


四、配置的保存与复用

4.1 保存配置

在 menuconfig 界面选择< Save >,默认保存为.config

4.2 导出为 defconfig

# 将当前 .config 导出为精简的 defconfigmakeARCH=armCROSS_COMPILE=arm-linux-gnueabihf- savedefconfig# 生成的 defconfig 在源码根目录,可以拷贝到cpdefconfig arch/arm/configs/myboard_defconfig

savedefconfig 的好处:它只保存和默认值不同的配置项,文件比.config小得多,更容易版本管理。

4.3 对比配置差异

# 比较两个配置文件的差异scripts/diffconfig .config arch/arm/configs/other_defconfig

五、高级技巧:用 search 定位配置项

menuconfig 的搜索功能非常实用,按/键,输入关键词即可:

Enter CONFIG_ (sub)string to search for: GPIO

搜索结果的示例输出:

Symbol: GPIO_SYSFS [=y] Type : bool Prompt: /sys/class/gpio/... (sysfs interface) Location: -> Device Drivers -> GPIO Support (GPIOLIB [=y])

搜索结果告诉你这个配置项的类型、当前值、在哪个菜单路径下,并且会给出对应的Location路径,你可以顺着路径去找到它。


六、内核配置重构:make oldconfig

当你从老版本升级到新版本内核时,用make oldconfig可以帮助你仅回答新增的配置项:

# 把老版本的 .config 拷贝过来cp../linux-5.4/.config.makeARCH=armCROSS_COMPILE=arm-linux-gnueabihf- oldconfig

内核会逐个询问新增配置项的选择,老配置项保持不变。这比从头配置一版全新内核要快得多。


总结

make menuconfig是内核裁剪的"手术刀"。掌握了菜单导航、配置项搜索、驱动与文件系统的裁剪原则,你就能把臃肿的通用内核削成适配嵌入式板卡的"瘦身版"。记住裁剪优先级:驱动 > 文件系统 > 网络 > 其他,砍掉不需要的驱动收益最大。