第三章 内核配置工具准备:安装ncurses库、配置内核源码树、使用menuconfig进行内核配置
好,咱们进入实战环节。前面两章讲了EtherCAT实时性的理论背景和内核实时补丁的安装,现在该动手配置内核了。这一章,我带你搞定内核配置工具链。
说实话,很多新手工程师栽在第一步——工具没装对,配置界面都打不开。我当年刚接触内核配置时,就遇到过menuconfig死活起不来的情况,折腾了半天才发现是ncurses库没装。嗯,这种坑咱们今天一次性填平。
3.1 安装ncurses库——menuconfig的基石
menuconfig这个图形化配置界面,底层依赖ncurses库。说白了,没有它,你看到的就只是一堆乱码或者直接报错。
为什么需要ncurses?因为它提供了终端下的文本图形界面能力。你想想看,menuconfig能在纯命令行终端里画出菜单、复选框、输入框,靠的就是ncurses的API。
核心要点:menuconfig → 依赖ncurses → 依赖ncurses-dev开发包
安装命令很简单,不同发行版略有差异:
# Debian/Ubuntu 系列
sudo apt-get install libncurses-dev
# RHEL/CentOS/Fedora 系列
sudo yum install ncurses-devel
# openSUSE
sudo zypper install ncurses-devel
我个人习惯在Ubuntu上做开发,所以常用apt-get。安装完成后,可以用这个命令验证一下:
dpkg -l | grep ncurses
如果看到libncurses-dev相关的包,说明装好了。我记得有一次在客户现场,他们的内网环境没有外网权限,我手动编译了ncurses源码包才搞定。那叫一个折腾——所以建议你提前装好。
小提示:有些精简版系统可能连gcc、make都没装。建议一并安装build-essential(Ubuntu)或Development Tools(RHEL)组包。
3.2 配置内核源码树
工具装好了,接下来要准备内核源码树。这里有个关键问题:你用哪个内核版本?
对于EtherCAT实时性调优,我建议使用长期支持版(LTS)内核,比如5.10.x或6.1.x。为什么?因为这些版本维护周期长,社区支持好,而且PREEMPT_RT补丁的兼容性最稳定。
假设你已经下载了内核源码,解压到某个目录:
# 下载内核源码(以5.10.200为例)
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.200.tar.xz
# 解压
tar -xf linux-5.10.200.tar.xz
# 进入源码目录
cd linux-5.10.200
这里有个细节:源码目录的路径不要包含中文或空格。我见过有人把源码放在“我的文档”下面,结果编译时各种奇葩错误。嗯,Linux下还是老老实实用英文路径吧。
进入源码目录后,第一件事是清理之前的配置残留:
make mrproper
这个命令会删除所有中间文件和配置文件,给你一个干净的源码树。我在项目中遇到过有人忘了这步,结果旧配置和新内核不兼容,编译出来的内核各种诡异问题。所以,每次开始新配置前,先mrproper一下。
3.3 使用menuconfig进行内核配置
好了,重头戏来了。在源码根目录下执行:
make menuconfig
如果一切顺利,你会看到一个蓝灰色的图形界面。如果报错说找不到ncurses,那就回到3.1节检查安装。
menuconfig的操作很简单:
- 方向键:上下移动光标
- Enter:进入子菜单
- 空格:切换选项状态([*]编译进内核、[M]编译为模块、[ ]不编译)
- Esc+Esc:返回上一级
- /?:搜索配置项
对于EtherCAT实时性调优,我们需要重点关注以下几个配置区域:
| 配置路径 | 配置项 | 推荐设置 | 说明 |
|---|---|---|---|
| General Setup | Preemption Model | Fully Preemptible Kernel (Real-Time) | 启用完整抢占,这是实时性的基础 |
| General Setup | Timer frequency | 1000 Hz | 提高时钟精度,减少调度延迟 |
| Device Drivers → Network device support | EtherCAT support | [*] 或 [M] | 如果内核版本自带EtherCAT驱动,直接启用 |
| Kernel Features | RCU implementation | Preemptible RCU | 配合完全抢占使用 |
警告:不要一次性改太多配置。我建议每次只改一个关键项,保存配置,编译测试。否则出了问题,你根本不知道是哪个配置导致的。
配置完成后,按Tab键选择“Save”,然后退出。配置文件会保存在源码目录下的.config文件中。你可以备份这个文件:
cp .config config-ethercat-rt
这样下次重新配置时,直接把这个文件拷回来,省得从头再选一遍。
3.4 配置验证与常见问题
配置保存后,可以用这个命令快速检查关键项是否生效:
grep -E "CONFIG_PREEMPT|CONFIG_HZ_1000|CONFIG_RCU" .config
你应该能看到类似这样的输出:
CONFIG_PREEMPT=y
CONFIG_PREEMPT_RT=y
CONFIG_HZ_1000=y
CONFIG_RCU_EXPERT=y
CONFIG_PREEMPT_RCU=y
如果CONFIG_PREEMPT_RT没有出现,说明你的内核没有打上实时补丁。这时候需要回到第二章,确认PREEMPT_RT补丁是否正确应用。
我曾经帮一个团队排查问题,他们配置了所有实时选项,但编译出来的内核延迟还是很高。最后发现是内核版本不对——他们用的主线内核,没有打RT补丁。所以,CONFIG_PREEMPT_RT这个选项就是实时内核的“身份证”,没有它,其他配置都是白搭。
避坑指南:我曾经在menuconfig里按“/”搜索“PREEMPT”,结果搜出来一堆选项。记住,我们要找的是“Fully Preemptible Kernel (Real-Time)”,不是“Voluntary Kernel Preemption”或“Preemptible Kernel (Low-Latency Desktop)”。后两个虽然也有抢占,但达不到硬实时的要求。
另外,如果你用的是较新的内核(6.x系列),menuconfig的界面可能略有不同,但核心配置项的位置基本不变。实在找不到某个选项时,用“/”搜索功能,输入关键词就能定位。
好了,这一章的内容就到这里。工具链准备好了,下一章我们开始真正的内核裁剪和实时性优化配置。记住,配置内核就像搭积木——基础打牢了,后面才能盖高楼。