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_defconfigsavedefconfig 的好处:它只保存和默认值不同的配置项,文件比.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是内核裁剪的"手术刀"。掌握了菜单导航、配置项搜索、驱动与文件系统的裁剪原则,你就能把臃肿的通用内核削成适配嵌入式板卡的"瘦身版"。记住裁剪优先级:驱动 > 文件系统 > 网络 > 其他,砍掉不需要的驱动收益最大。