第二章 实时内核补丁的获取与选择
做实时内核移植,第一步就是拿到对的补丁。这事儿听起来简单,但我在项目里见过太多人栽在这个环节——补丁版本不对,内核版本不匹配,编译到一半报错,折腾半天才发现是补丁选错了。今天我就把这块儿掰开了讲清楚。
2.1 从哪儿获取 PREEMPT_RT 补丁
官方渠道只有一个:内核官网。具体来说,是 kernel.org 的补丁存档区。
我个人习惯直接访问这个地址:
https://www.kernel.org/pub/linux/kernel/projects/rt/
进去之后你会看到按版本号排列的目录。比如 5.10、5.15、6.1 这些长期支持版本(LTS),每个目录下都有对应的补丁文件。
嗯,这里要注意:别去第三方网站下载。我曾经有个同事,图省事从某个论坛下载了补丁,结果里面被植入了后门代码。虽然是个例,但内核补丁这种底层东西,来源必须可靠。
2.2 补丁版本号命名规则
补丁文件的命名其实很有规律。你看这个例子:
patch-5.10.100-rt56.patch.gz
拆开来看:
- 5.10.100 — 基础内核版本号
- rt56 — 实时补丁的迭代版本号
- .patch.gz — 压缩格式,解压后就是补丁文件
为什么会这样命名?说白了,就是为了让你一眼就能看出这个补丁对应哪个内核版本。rt56 表示这是针对该内核的第 56 版实时补丁。数字越大,补丁越新,修复的 bug 越多。
我在项目中遇到过这样的情况:有人看到 rt56 比 rt55 新,就直接用了。但没注意基础内核版本从 5.10.99 变成了 5.10.100。结果补丁打不上,因为内核源码版本不对。
2.3 如何选择匹配的补丁
选补丁这事儿,说白了就三步:
- 确定你的内核版本 — 用
uname -r查看当前内核,或者看你准备编译的内核源码版本 - 找到对应的补丁目录 — 在 kernel.org 的 rt 目录下,找到你的内核主版本号(比如 5.10)
- 匹配精确版本 — 补丁的版本号必须和内核源码的版本号完全一致
举个例子。假设你下载了 Linux 5.10.100 的内核源码,那你就得找 patch-5.10.100-rt*.patch.gz 这样的文件。星号部分可以是 rt55、rt56 等,选最新的就行。
2.4 补丁版本选择的避坑指南
我曾经犯过一个错:内核源码是 5.10.100,但补丁目录里只有 5.10.99 的补丁。我想着「差一个小版本应该没事」,就硬打了上去。结果编译到一半报了一堆宏定义冲突的错误。后来查了半天,发现 5.10.99 到 5.10.100 之间改了十几个头文件,补丁根本对不上。
所以,记住这几条:
- 必须精确匹配 — 主版本、次版本、修订号,一个都不能差
- 优先选 LTS 版本 — 长期支持版本的内核,补丁维护更久,社区支持更好
- 别追最新 — 最新的补丁可能还没经过充分测试。我一般选发布超过 2 个月的版本
- 看补丁的 changelog — 每个补丁目录下都有 changelog 文件,看看修复了哪些问题
2.5 补丁获取与选择的完整流程
我把整个流程画了张图,方便你理解:
这张图把流程串起来了。核心就一句话:版本必须精确匹配,来源必须官方可靠。
2.6 实战:下载并验证补丁
假设我们要为 Linux 5.10.100 内核打 PREEMPT_RT 补丁。操作步骤如下:
# 1. 确认内核版本
$ head -5 Makefile | grep VERSION
VERSION = 5
PATCHLEVEL = 10
SUBLEVEL = 100
# 2. 下载补丁
$ wget https://www.kernel.org/pub/linux/kernel/projects/rt/5.10/patch-5.10.100-rt56.patch.gz
# 3. 解压补丁
$ gunzip patch-5.10.100-rt56.patch.gz
# 4. 验证补丁完整性(可选)
$ sha256sum patch-5.10.100-rt56.patch
# 对比官网提供的 checksum
这里有个细节:下载完补丁后,我建议你顺手验证一下 checksum。官网每个补丁目录下都有 sha256sums.asc 文件,里面记录了所有补丁的哈希值。虽然不验证一般也没事,但养成这个习惯,能避免很多潜在问题。
wc -l 看看补丁文件的行数。如果行数明显偏少,可能是下载不完整。这招虽然土,但很管用。
好了,补丁拿到手了,版本也确认无误。下一步就是把它打到内核源码上。这部分内容,我们会在后面的章节详细展开。
公众号:蓝海资料掘金营,微信deep3321