4. 获取内核源码
内核源码是编译调优的起点。选择错误的版本或未经验证的源码可能导致安全漏洞、编译失败或性能异常。本节将系统讲解如何从官方源获取、验证并管理内核源码树。
4.1 版本选择策略:主线 vs LTS
Linux 内核社区同时维护多个版本分支,不同分支适用于不同场景。下表对比了主线(Mainline)与长期支持(LTS)版本的核心差异:
| 特性 | 主线(Mainline) | 长期支持(LTS) |
|---|---|---|
| 发布周期 | 约 8-10 周 | 每年发布 1-2 个,维护 2-6 年 |
| 新功能 | 最新硬件支持、新调度器、新文件系统 | 仅向后移植安全修复与关键 Bug 修复 |
| 稳定性 | 中等,偶有回归 | 高,经过长时间验证 |
| 适用场景 | 开发测试、尝鲜、新硬件适配 | 生产服务器、嵌入式设备、企业环境 |
| 性能调优空间 | 大,可尝试最新调度/内存特性 | 中等,以稳定为优先 |
调优建议:对于生产环境,始终选择最新的 LTS 版本(如 6.6.x 或 6.12.x)。LTS 版本经过大规模回归测试,且长期接收安全补丁,是定制化性能优化的可靠基础。
4.2 从 kernel.org 下载源码
官方源码托管于 https://www.kernel.org。推荐使用以下两种方式获取:
4.2.1 直接下载压缩包
适用于一次性编译或带宽受限环境:
# 下载主线最新稳定版(示例为 6.12.7)
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.12.7.tar.xz
# 下载对应的签名文件
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.12.7.tar.sign
# 下载 LTS 版本(示例为 6.6.67)
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.67.tar.xz
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.67.tar.sign
4.2.2 使用 Git 克隆源码树
Git 方式便于后续打补丁、切换分支和增量更新,是调优工作的首选:
# 克隆 Linus Torvalds 的主线仓库(完整历史,约 3.5GB)
git clone https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
# 克隆稳定版仓库(包含所有 LTS 和稳定分支)
git clone https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
# 进入目录后切换到指定 LTS 分支
cd linux
git checkout linux-6.6.y # 6.6 LTS 分支
git checkout linux-6.12.y # 6.12 稳定分支
注意:Git 克隆完整历史会占用大量磁盘空间(约 4-6GB)。如果磁盘有限,可使用
--depth=1 参数进行浅克隆,仅获取最新版本:git clone --depth=1 https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git。
4.3 验证签名:确保源码完整性
内核社区使用 GPG 签名确保源码未被篡改。验证签名是安全编译的前提,不可跳过。
4.3.1 导入内核维护者公钥
# 从内核官网获取并导入 Torvalds 和稳定维护者的公钥
gpg --locate-keys torvalds@kernel.org gregkh@kernel.org
# 或从密钥服务器导入
gpg --keyserver keyserver.ubuntu.com --recv-keys 647F28654894E3BD457199BE38DBBDC86092693E
gpg --keyserver keyserver.ubuntu.com --recv-keys 38DBBDC86092693E # Greg KH 的密钥
4.3.2 验证压缩包签名
# 解压前验证(.tar.xz 文件需先解压,签名针对 .tar)
xz -d linux-6.12.7.tar.xz
gpg --verify linux-6.12.7.tar.sign linux-6.12.7.tar
# 成功输出示例:
# gpg: Good signature from "Linus Torvalds <torvalds@kernel.org>"
# gpg: WARNING: This key is not certified with a trusted signature!
# 出现 "Good signature" 即表示验证通过,WARNING 仅表示你未手动信任该密钥
4.3.3 验证 Git 标签签名
# 在 Git 仓库内验证当前签出标签
git tag -v v6.12.7
# 输出示例:
# object 1234abcd...
# type commit
# tag v6.12.7
# tagger Linus Torvalds ...
# gpg: Good signature from "Linus Torvalds <torvalds@kernel.org>"
安全要点:如果验证输出包含 "BAD signature" 或 "Can't check signature",立即停止使用该源码包,并重新下载。签名验证失败可能意味着源码被中间人篡改或下载损坏。
4.4 内核源码树结构概览
理解源码目录结构有助于后续的配置和模块化编译。下图展示了内核源码树的核心目录及其功能:
4.5 使用 Git 管理源码树的最佳实践
在调优过程中,经常需要打补丁、回退修改或对比不同版本。以下 Git 操作是内核调优的必备技能:
4.5.1 创建本地调优分支
# 基于当前 LTS 标签创建调优分支
git checkout -b my-6.6-optimization v6.6.67
# 查看当前分支状态
git status
git log --oneline -5
4.5.2 应用补丁并记录
# 应用外部补丁(如调度器优化补丁)
git am /path/to/sched-optimization.patch
# 或使用 patch 命令后手动提交
patch -p1 < /path/to/other-fix.patch
git add -A
git commit -m "perf: 调整 CFS 调度器的唤醒抢占阈值"
4.5.3 对比不同版本的内核配置
# 查看当前修改与原始 LTS 版本的差异
git diff v6.6.67 -- kernel/sched/fair.c
# 导出修改列表供团队审查
git format-patch v6.6.67 -o /tmp/my-patches/
效率技巧:使用
git stash 临时保存未完成的修改,方便切换分支测试不同配置。使用 git bisect 可以二分查找引入性能回归的提交。
4.6 获取源码后的完整性检查清单
完成下载和验证后,建议按以下清单逐项确认:
- 签名验证 — 确认
gpg --verify输出 "Good signature" - 版本确认 —
make kernelversion输出与预期版本一致 - 目录完整性 — 检查
arch/、kernel/、mm/等核心目录是否存在 - Git 分支 —
git branch -a确认当前在正确的 LTS 分支或标签上 - 磁盘空间 —
du -sh linux/确认源码树大小(完整克隆约 4-6GB,浅克隆约 1.5-2GB)
常见错误:初学者常忽略签名验证,直接解压编译。如果下载的源码被植入后门或恶意修改,编译出的内核可能包含安全漏洞。即使在内网环境,也建议执行验证步骤,防止镜像服务器被篡改。
完成本节操作后,你将拥有一个经过验证、版本明确、由 Git 管理的内核源码树,为后续的配置裁剪和编译优化奠定坚实基础。