3. 获取内核源码:从 kernel.org 下载、使用 Git 克隆主线仓库、验证源码完整性(GPG 签名校验)
获取可靠的内核源码是后续配置、编译与裁剪工作的基石。本章节将系统讲解三种主流获取方式:通过 kernel.org 下载稳定版 tarball、使用 Git 克隆 Linus Torvalds 的主线仓库,以及通过 GPG 签名校验 确保源码未被篡改。掌握这些方法,能够帮助你在开发与生产环境中建立可信的源码供应链。
💡 核心原则: 无论采用哪种方式获取源码,务必在编译前完成完整性校验。GPG 签名验证是防止供应链攻击的第一道防线,尤其在企业级嵌入式产品开发中不可省略。
3.1 从 kernel.org 下载稳定版源码
kernel.org 是 Linux 内核的官方发布站点,提供经过 Linus Torvalds 及稳定版维护者签名的 tarball 压缩包。这种方式适合需要固定版本、不频繁更新、或离线构建的场景。
3.1.1 下载流程
- 访问官网: 打开
https://www.kernel.org,页面顶部会显示最新的稳定版(stable)、主线版(mainline)及长期支持版(longterm)。 - 选择版本: 对于嵌入式开发,推荐选择 longterm 系列,例如
6.1.y或5.15.y,这些版本会获得长期的安全修复。 - 下载 tarball: 点击对应版本的
.tar.xz链接,或使用 wget 命令下载。 - 下载签名文件: 同时下载同名的
.tar.sign文件,用于后续 GPG 校验。
# 示例:下载 Linux 6.1.100 稳定版源码及签名
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.100.tar.xz
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.100.tar.sign
📌 版本命名规则:
- mainline (主线): 最新开发版本,如 6.10-rc1,包含最新特性但稳定性较低。
- stable (稳定版): 基于主线修复后的版本,如 6.9.3,适合一般用途。
- longterm (长期支持): 如 6.1.y、5.15.y,维护周期长达数年,是嵌入式产品的首选。
3.1.2 版本选择对比表
| 版本类型 | 适用场景 | 维护周期 | 风险等级 | 推荐度(嵌入式) |
|---|---|---|---|---|
| mainline | 开发测试、尝鲜新功能 | 数周 | 高(可能引入回归) | ⭐ |
| stable | 桌面、服务器通用环境 | 数月 | 低 | ⭐⭐⭐ |
| longterm | 嵌入式产品、工业控制 | 2~6 年 | 极低 | ⭐⭐⭐⭐⭐ |
3.2 使用 Git 克隆主线仓库
Git 克隆方式适合需要跟踪最新补丁、进行二次开发或参与社区贡献的场景。Linus Torvalds 维护的主线仓库位于 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git。
3.2.1 克隆与分支管理
# 完整克隆主线仓库(包含全部历史,体积较大,约 3-5 GB)
git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
# 若网络带宽有限,可使用 --depth 参数进行浅克隆(只获取最新版本)
git clone --depth 1 git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
# 进入目录后,查看所有远程分支
cd linux
git branch -r
# 切换到特定的稳定版 tag(例如 v6.1.100)
git checkout v6.1.100
⚠️ 浅克隆注意事项: 使用
--depth 1 克隆的仓库无法查看历史提交、无法执行 git bisect 进行二分查找,也无法直接生成完整补丁。如果需要进行深度开发,建议使用完整克隆。
3.2.2 获取稳定版与长期支持分支
除了主线仓库,Greg Kroah-Hartman 维护的稳定版仓库同样重要,它包含了所有已发布稳定版的补丁历史。
# 克隆稳定版仓库
git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
# 查看所有稳定版 tag
git tag | grep '^v6\.1'
# 切换到特定长期支持版本
git checkout linux-6.1.y
3.3 验证源码完整性(GPG 签名校验)
GPG 签名校验是确保下载的源码包未被中间人攻击或镜像服务器篡改的关键步骤。内核社区使用 GPG 密钥对每个发布版本进行签名。
3.3.1 导入官方 GPG 密钥
首先需要从 kernel.org 导入内核维护者的公钥。常用的密钥包括 Linus Torvalds 和 Greg Kroah-Hartman 的密钥。
# 从 kernel.org 密钥服务器导入 Linus Torvalds 的公钥
gpg --locate-keys torvalds@kernel.org gregkh@kernel.org
# 或直接下载密钥文件
wget https://www.kernel.org/keys/kernel-sign-key.asc
gpg --import kernel-sign-key.asc
# 验证密钥指纹(以 Linus 为例)
gpg --fingerprint torvalds@kernel.org
# 输出应包含:79BE 3E43 0041 1886 3CC3 7BFC E430 22AD B6C0 1FEF
3.3.2 校验 tarball 签名
下载 .tar.sign 文件后,使用 GPG 进行脱机签名验证。
# 解压前先校验签名(注意:.tar.sign 是对未压缩的 .tar 文件的签名)
xz -cd linux-6.1.100.tar.xz | gpg --verify linux-6.1.100.tar.sign -
# 如果输出包含 "Good signature from "Linus Torvalds"" 且没有警告,则校验通过
# 示例输出:
# gpg: Good signature from "Linus Torvalds <torvalds@kernel.org>"
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg: There is no indication that the signature belongs to the owner.
🔐 关于 "WARNING: This key is not certified": 这个警告是正常的,因为你的本地 GPP 信任链尚未建立。只要显示 "Good signature",就说明签名与文件内容匹配,文件未被篡改。要消除警告,可以手动签署导入的密钥:
gpg --sign-key torvalds@kernel.org。
3.3.3 校验 Git 仓库标签
如果通过 Git 获取源码,可以直接验证 tag 的 GPG 签名。
# 验证当前 tag 的签名
git tag -v v6.1.100
# 输出示例:
# object 1234567...
# type commit
# tag v6.1.100
# tagger Greg Kroah-Hartman <gregkh@linuxfoundation.org> 1712345678 +0000
# gpg: Signature made ...
# gpg: Good signature from "Greg Kroah-Hartman <gregkh@kernel.org>"
3.4 源码获取流程总览
下图展示了从选择版本到完成校验的完整工作流,帮助你建立清晰的获取路径。
3.5 常见问题与避坑指南
| 问题现象 | 可能原因 | 解决方案 |
|---|---|---|
gpg: Can't check signature: No public key |
未导入维护者的 GPG 公钥 | 执行 gpg --locate-keys torvalds@kernel.org 导入密钥 |
gpg: BAD signature from ... |
文件被篡改或下载不完整 | 重新下载 tarball 和签名文件,检查网络环境 |
git clone 速度极慢 |
网络限制或仓库历史过大 | 使用 --depth 1 浅克隆,或更换国内镜像源 |
xz: Cannot exec: No such file or directory |
系统未安装 xz-utils | sudo apt install xz-utils 或 sudo yum install xz |
🔧 国内镜像加速: 如果直接访问 kernel.org 速度较慢,可以使用清华大学的镜像站:
https://mirrors.tuna.tsinghua.edu.cn/kernel/。下载后同样需要执行 GPG 签名校验,确保镜像站提供的文件与官方一致。
3.6 本章小结
获取内核源码是内核开发的第一步,也是保障软件供应链安全的关键环节。通过本章学习,你应掌握:
- 根据项目需求选择 stable、longterm 或 mainline 版本。
- 使用
wget从 kernel.org 下载 tarball,或使用git clone获取完整仓库。 - 通过 GPG 签名校验 验证源码的完整性与真实性,杜绝被植入后门的风险。
- 在嵌入式产品开发中,优先选择 longterm 版本并建立自动化的校验流程。