2. Linux 内核实时性配置:内核源码获取、PREEMPT_RT 补丁应用、内核编译选项配置、实时内核编译与安装

构建实时性测试环境的核心是获得一个支持 PREEMPT_RT 完整抢占特性的 Linux 内核。本章将引导你完成从源码获取、补丁应用、配置优化到编译安装的全流程,确保内核具备可预测的低延迟调度能力。

2.1 内核源码与 PREEMPT_RT 补丁获取

实时内核的构建基于主线 Linux 内核源码与对应的 PREEMPT_RT 补丁集。版本匹配至关重要,补丁必须与内核源码的次版本号完全一致。

组件 获取源 版本匹配规则
Linux 内核主线源码 kernel.org 或镜像站 选择长期支持 (LTS) 版本,如 5.10.y、6.1.y
PREEMPT_RT 补丁 rt.wiki.kernel.org 或 cdn.kernel.org/pub/linux/kernel/projects/rt/ 补丁版本号必须与内核源码版本号完全一致,例如 patch-6.1.25-rt14.patch.xz
版本选择建议: 对于实时性测试环境,推荐使用较新的 LTS 内核(如 6.1.x 或 6.6.x),它们拥有更完善的 PREEMPT_RT 支持和更丰富的调试追踪接口(如 osnoise、timerlat)。

2.1.1 下载与解压步骤

  1. 下载内核源码:
    wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.25.tar.xz
    tar -xf linux-6.1.25.tar.xz
    cd linux-6.1.25
  2. 下载并应用 PREEMPT_RT 补丁:
    wget https://cdn.kernel.org/pub/linux/kernel/projects/rt/6.1/patch-6.1.25-rt14.patch.xz
    xzcat patch-6.1.25-rt14.patch.xz | patch -p1
常见错误: 补丁应用失败通常由版本不匹配或源码目录不干净导致。应用补丁前,确保源码目录未被修改,可使用 git init && git add . && git commit -m "base" 创建基线,便于补丁冲突时回退。

2.2 内核编译选项配置:实时性关键开关

配置内核是决定实时性能的环节。必须启用 PREEMPT_RT 完整抢占模型,并调整时钟、中断、锁等相关选项。

2.2.1 配置方法

使用 make menuconfig 进行图形化配置,或直接编辑 .config 文件。以下为必须启用的关键选项:

配置项 路径 (menuconfig) 推荐值 说明
CONFIG_PREEMPT_RT General setup → Preemption Model Fully Preemptible Kernel (Real-Time) 启用完整实时抢占,是 PREEMPT_RT 的核心开关
CONFIG_HZ_1000 Processor type and features → Timer frequency 1000 Hz 高时钟中断频率,提高调度时间精度
CONFIG_NO_HZ_FULL General setup → Timer tick handling Full dynticks system (tickless) 允许 CPU 在运行单个任务时关闭周期性 tick,减少干扰
CONFIG_IRQ_FORCED_THREADING Kernel Features → IRQ subsystem Enable 强制中断线程化,降低中断对实时任务的优先级反转
CONFIG_CPUSETS Kernel Features → Control Group support Enable 支持 CPU 隔离,为实时任务预留专用核心

2.2.2 配置验证命令

配置完成后,使用以下命令验证关键选项是否生效:

grep -E "PREEMPT_RT|HZ_1000|NO_HZ_FULL|IRQ_FORCED_THREADING" .config

输出应显示 =y 或 =m,例如:

CONFIG_PREEMPT_RT=y
CONFIG_HZ_1000=y
CONFIG_NO_HZ_FULL=y
CONFIG_IRQ_FORCED_THREADING=y

2.3 实时内核编译与安装

配置完成后,进入编译与安装阶段。建议使用多线程编译以加快速度,并安装必要的模块。

2.3.1 编译内核与模块

# 编译内核镜像与模块
make -j$(nproc) bzImage
make -j$(nproc) modules

# 安装模块
sudo make modules_install

# 安装内核与 System.map
sudo make install

2.3.2 更新引导加载器

安装完成后,更新 GRUB 配置并重启:

sudo update-grub
sudo reboot

重启后,在 GRUB 菜单中选择新安装的实时内核启动。通过以下命令确认内核已运行 PREEMPT_RT:

uname -a | grep PREEMPT

输出应包含 PREEMPT_RT 字样,例如:

Linux rt-test 6.1.25-rt14 #1 SMP PREEMPT_RT ...

2.4 实时内核配置与编译流程总览

下图展示了从源码获取到实时内核启动的完整流程,以及各阶段的关键产物。

实时内核构建与安装流程 获取内核源码 获取 RT 补丁 应用补丁 配置内核选项 编译内核与模块 安装内核与模块 更新 GRUB 配置 重启并验证 关键验证点: • 补丁应用后,源码目录应包含 localversion-rt 文件 • 编译完成后,arch/x86/boot/bzImage 应存在且大小正常 • 重启后,uname -a 输出必须包含 PREEMPT_RT

2.5 常见问题与排查

问题现象 可能原因 解决方案
补丁应用失败,大量 reject 内核源码版本与补丁版本不匹配 重新下载匹配版本的源码与补丁,使用 git checkout . 恢复干净目录
编译过程中断,报 undefined reference 配置选项冲突或依赖缺失 运行 make olddefconfig 自动修复默认值,然后重新编译
重启后内核 panic initramfs 未正确生成或驱动缺失 使用 make install 自动生成 initramfs,或手动运行 mkinitramfs
系统无法识别实时内核 GRUB 未更新或默认启动项错误 运行 sudo update-grub,并在 BIOS/GRUB 菜单中手动选择实时内核
性能基线记录: 在安装实时内核后,建议立即使用 cyclictest 或 hwlatdetect 记录一次基准延迟数据,作为后续优化和对比的参考点。

完成以上步骤后,你的系统已运行支持 PREEMPT_RT 的实时内核。下一阶段将基于此环境部署 ftrace 追踪工具,开始对调度延迟进行细粒度测量与分析。