3. Linux内核源码获取与版本选择:从kernel.org下载内核源码,讲解LTS版本选择策略,解压并查看源码目录结构
3.1 内核源码获取渠道与版本号解读
Linux内核官方发布站点为 kernel.org,所有主线版本、稳定版、长期支持(LTS)版均在此归档。获取源码前,必须理解内核版本号的语义,以便为嵌入式项目选择正确的基线。
3.1.1 版本号格式
自5.0版本起,内核采用 主版本.次版本.补丁级别 的三段式编号,不再区分奇数/偶数版为开发/稳定。例如:
| 版本号示例 | 含义 | 适用场景 |
|---|---|---|
| 6.6.0 | 主线初始发布 | 新功能验证、上游开发 |
| 6.6.63 | 稳定补丁累积 | 生产环境、嵌入式产品 |
| 6.1.112 | LTS长期支持 | 工业、车规、医疗等长生命周期设备 |
提示: 嵌入式系统移植应优先选择 LTS 版本,其维护周期通常为 6 年以上,社区持续提供安全补丁和关键修复,避免因主线快速迭代导致的驱动接口不兼容。
3.1.2 从 kernel.org 下载源码
推荐使用 wget 或 curl 直接下载 tarball,并验证 GPG 签名以确保完整性。
# 下载 LTS 6.1 系列最新稳定版(示例版本号请以官网为准)
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.112.tar.xz
# 下载对应的签名文件
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.1.112.tar.sign
# 导入内核维护者公钥并验证
gpg --locate-keys torvalds@kernel.org gregkh@kernel.org
xz -cd linux-6.1.112.tar.xz | gpg --verify linux-6.1.112.tar.sign -
# 解压源码
tar -xvf linux-6.1.112.tar.xz
注意: 切勿直接使用未验证的源码包。GPG 验证失败时,应检查下载源是否被篡改或公钥是否过期。嵌入式开发中,源码的完整性直接影响后续编译和运行的安全性。
3.2 LTS版本选择策略
LTS 版本并非越多越好,选择需结合硬件平台、驱动支持周期、工具链兼容性及项目生命周期综合评估。以下为当前主流 LTS 版本对比:
| LTS 版本 | 首发时间 | 预计维护截止 | 推荐硬件架构 | 关键特性 |
|---|---|---|---|---|
| 6.1.x | 2022-12 | 2027+ | ARM64、RISC-V、x86 | 稳定 Rust 初步支持、Btrfs 性能优化 |
| 5.15.x | 2021-10 | 2026+ | ARM32、ARM64、MIPS | NTFS3 驱动、新调度器特性 |
| 5.10.x | 2020-12 | 2026+ | ARM32、x86、PowerPC | 广泛验证、大量 BSP 支持 |
| 5.4.x | 2019-11 | 2025+ | ARM32、MIPS、ARC | 老芯片 BSP 最成熟 |
选择建议:
- 新项目(2024年后启动): 首选 6.1 LTS,兼顾新硬件支持与长期维护。
- 已有 BSP 基础: 若芯片厂商提供 5.10 或 5.15 的完整板级支持包,优先沿用对应 LTS,减少移植工作量。
- 极低资源设备(< 64MB RAM): 可考虑 5.4 LTS,但需评估安全补丁覆盖范围。
3.3 解压后源码目录结构解析
解压后的内核源码根目录包含约 20 个一级子目录和若干顶层文件。理解其布局是后续配置与裁剪的基础。
3.3.1 顶层目录功能总览
3.3.2 关键目录详解
| 目录/文件 | 作用 | 嵌入式移植关注点 |
|---|---|---|
arch/ |
存放各CPU架构相关代码(arm64、arm、riscv、x86等) | 需根据目标板选择对应架构子目录,修改 arch/arm64/boot/dts/ 下的设备树 |
drivers/ |
所有设备驱动源码,按子系统分类(gpio、i2c、spi、net、usb等) | 裁剪不需要的驱动,添加板级外设驱动 |
fs/ |
文件系统实现(ext4、btrfs、squashfs、overlayfs等) | 嵌入式常用 squashfs(只读根文件系统)和 overlayfs |
include/ |
内核头文件,包含全局 API 定义 | 驱动开发时需引用 include/linux/ 下的头文件 |
kernel/ |
核心调度、进程管理、中断、时间子系统 | 一般无需修改,但需配置调度器类型(如 PREEMPT_RT) |
mm/ |
内存管理(页分配、slab、vmalloc) | 低内存设备需配置 CMA、内存压缩等 |
scripts/ |
构建脚本、Kconfig 解析器、dtc(设备树编译器) | 交叉编译时需确保 scripts/dtc/ 编译正确 |
Documentation/ |
内核文档,包含设备树绑定说明、Kconfig 帮助 | 移植时查阅 Documentation/devicetree/bindings/ |
Kconfig |
顶层配置菜单树入口 | make menuconfig 的入口文件 |
Makefile |
顶层构建规则,定义架构、交叉编译器变量 | 需设置 ARCH= 和 CROSS_COMPILE= |
3.4 解压后快速验证源码完整性
解压完成后,建议执行以下检查,确保源码未被损坏且版本正确:
# 进入源码目录
cd linux-6.1.112
# 查看顶层 Makefile 确认版本
head -5 Makefile
# 输出应包含:
# VERSION = 6
# PATCHLEVEL = 1
# SUBLEVEL = 112
# 统计源码行数(粗略验证)
find . -name "*.c" -o -name "*.h" | wc -l
# 正常应在 60000~80000 之间
# 检查关键目录是否存在
ls -d arch/arm64 drivers/i2c include/linux kernel/ mm/ scripts/dtc
实战要点:
- 解压后不要立即删除 tarball,后续可能需对比原始文件。
- 建议在
/opt/kernel/或~/kernel_src/下建立版本化目录,如linux-6.1.112/,便于多版本管理。 - 若使用 Git 克隆内核仓库,可切换至对应 LTS 分支:
git checkout linux-6.1.y,但 tarball 方式更适用于离线或受限网络环境。
3.5 本章小结
本章完成了内核源码获取、LTS 版本选型决策、解压验证及目录结构认知。这些是后续配置与移植的基础:选对版本决定了项目维护成本,理解目录决定了裁剪效率。下一阶段将基于此源码树,配置交叉编译环境并执行首次内核编译。