
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.10makeARCHarmCROSS_COMPILEarm-linux-gnueabihf- xxx_defconfig这里的ARCHarm指定目标架构CROSS_COMPILE指定交叉编译器前缀。然后启动图形化配置makeARCHarmCROSS_COMPILEarm-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编译为模块选项变成MN不编译选项变成[ ]或 /搜索按配置名或关键字搜索?查看帮助显示当前项的 help 信息Esc Esc退出按两次 Esc 退出当前菜单符号含义符号含义[*]/*编译进内核镜像Y[ ]/ 不编译NM编译为可加载模块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 导出为精简的 defconfigmakeARCHarmCROSS_COMPILEarm-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.makeARCHarmCROSS_COMPILEarm-linux-gnueabihf- oldconfig内核会逐个询问新增配置项的选择老配置项保持不变。这比从头配置一版全新内核要快得多。总结make menuconfig是内核裁剪的手术刀。掌握了菜单导航、配置项搜索、驱动与文件系统的裁剪原则你就能把臃肿的通用内核削成适配嵌入式板卡的瘦身版。记住裁剪优先级驱动 文件系统 网络 其他砍掉不需要的驱动收益最大。