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 内核源码树结构概览

理解源码目录结构有助于后续的配置和模块化编译。下图展示了内核源码树的核心目录及其功能:

Linux 内核源码树核心结构 linux/ (根目录) arch/ kernel/ mm/ fs/ drivers/ net/ include/ scripts/ Documentation/ tools/ samples/ usr/ 目录功能说明: • arch/ — 体系结构相关代码(x86, arm64, riscv 等),性能调优常修改此目录下的 Kconfig • kernel/ — 核心调度、进程管理、信号处理,是调度器调优的主战场 • mm/ — 内存管理(页分配、SLUB、VMA),内存调优的核心目录 • drivers/ — 设备驱动,编译时可裁剪不需要的驱动以减小内核体积 • scripts/ — 配置、编译、打包脚本,包含 localmodconfig 等实用工具

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 获取源码后的完整性检查清单

完成下载和验证后,建议按以下清单逐项确认:

  1. 签名验证 — 确认 gpg --verify 输出 "Good signature"
  2. 版本确认 — make kernelversion 输出与预期版本一致
  3. 目录完整性 — 检查 arch/、kernel/、mm/ 等核心目录是否存在
  4. Git 分支 — git branch -a 确认当前在正确的 LTS 分支或标签上
  5. 磁盘空间 — du -sh linux/ 确认源码树大小(完整克隆约 4-6GB,浅克隆约 1.5-2GB)
常见错误:初学者常忽略签名验证,直接解压编译。如果下载的源码被植入后门或恶意修改,编译出的内核可能包含安全漏洞。即使在内网环境,也建议执行验证步骤,防止镜像服务器被篡改。

完成本节操作后,你将拥有一个经过验证、版本明确、由 Git 管理的内核源码树,为后续的配置裁剪和编译优化奠定坚实基础。