2、内核源码获取与版本选择:从kernel.org获取源码、LTS版本选择、Git仓库管理、补丁应用

嵌入式Linux内核裁剪的第一步,是获取正确、可维护的内核源码。版本选择失误或源码管理混乱,将直接导致后续配置工作无法复用、补丁冲突频发。本节从源码获取渠道、LTS版本策略、Git仓库管理与补丁应用四个维度,构建嵌入式内核源码的标准化操作流程。

2.1 从 kernel.org 获取官方源码

Linux内核官方发布站点为 kernel.org,所有主线(Mainline)、稳定(Stable)及长期支持(LTS)版本均在此归档。嵌入式开发应始终从官方源获取,避免使用发行版二次打包的内核源码,以确保补丁基线清晰。

获取方式 命令/URL 适用场景
HTTP 下载完整 tarball https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz 首次获取、离线环境、快速验证
wget 命令行下载 wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz 自动化脚本、CI/CD 流水线
Git 克隆完整仓库 git clone git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git 长期维护、补丁管理、多版本切换
校验完整性:下载 tarball 后务必校验签名。使用 gpg --verify linux-6.6.tar.sign 验证 GPG 签名,防止源码被篡改。kernel.org 提供 sha256sums.asc 文件用于哈希校验。
嵌入式最佳实践:优先选择 tarball + 增量补丁 方式管理源码,而非每次克隆完整 Git 仓库。tarball 体积小、部署快,适合资源受限的嵌入式构建服务器。
内核源码获取流程 kernel.org 官方源 HTTP tarball 下载 Git 克隆完整仓库 增量补丁叠加 嵌入式内核源码工作目录 推荐:tarball + 补丁 轻量、可追溯、易部署

2.2 LTS 版本选择策略

嵌入式产品生命周期通常为 3~10 年,选择 LTS(Long Term Support) 版本是降低维护成本的关键。LTS 版本提供至少 2 年(通常 4~6 年)的安全更新与关键 Bug 修复,避免因主线版本快速迭代导致的兼容性断裂。

版本类型 支持周期 嵌入式适用性 典型版本示例
主线(Mainline) ~2~3 个月 不推荐,仅用于开发验证 6.8-rc1
稳定(Stable) ~3~6 个月 短期项目、原型机 6.7.5
LTS(长期支持) 4~6 年 强烈推荐 6.6.x、6.1.x、5.15.x、5.10.x
SLTS(超长期支持) 10 年+ 工业/航天/医疗 5.4.x(由 CIP 维护)
版本选择陷阱:不要盲目选择最新 LTS 版本。嵌入式 SoC 厂商(如 NXP、TI、Rockchip)的 BSP 通常基于某个特定 LTS 版本开发。选择与 BSP 基线一致的 LTS 版本,可大幅减少驱动移植工作量。

2.3 Git 仓库管理:分支、标签与子模块

对于需要长期维护的嵌入式项目,Git 仓库管理是必备技能。以下是与内核裁剪直接相关的 Git 操作要点。

2.3.1 克隆与分支策略

# 克隆稳定内核仓库(浅克隆,节省带宽)
git clone --depth 1 --branch v6.6 git://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git

# 查看所有远程标签
git tag -l "v6.6.*"

# 基于特定标签创建开发分支
git checkout -b my_embedded_v6.6 v6.6.15

2.3.2 嵌入式项目分支模型

分支名称 用途 基线来源
upstream/lts-6.6 跟踪上游 LTS 更新 kernel.org 稳定标签
vendor/bsp-6.6 SoC 厂商 BSP 补丁叠加 upstream/lts-6.6
product/board-a 具体产品配置与驱动定制 vendor/bsp-6.6
feature/xxx 功能开发临时分支 product/board-a
管理建议:使用 git submodule 将内核源码作为子模块引入产品仓库,而非直接复制源码。这样可保持内核版本与产品配置的独立版本管理,方便后续升级。
嵌入式内核 Git 分支管理模型 upstream/lts-6.6 vendor/bsp-6.6 product/board-a feature/driver-x release/v1.0 原则:上游跟踪 → 厂商适配 → 产品定制 → 功能分支 → 发布标签 补丁从产品分支向上游回传,保持基线干净

2.4 补丁应用:格式、顺序与冲突解决

嵌入式内核裁剪过程中,补丁管理是日常操作。补丁来源包括:SoC 厂商 BSP 补丁、社区 Backport 补丁、自研驱动补丁、配置优化补丁。

2.4.1 补丁文件标准格式

From: developer@example.com
Date: Mon, 10 Mar 2025 14:30:00 +0800
Subject: [PATCH] arm64: dts: imx8mp: enable watchdog for embedded board

Enable the watchdog timer on i.MX8MP embedded board to support
hardware reset in production environment.

Signed-off-by: Developer <developer@example.com>
---
 arch/arm64/boot/dts/freescale/imx8mp.dtsi | 4 ++++
 1 file changed, 4 insertions(+)

2.4.2 补丁应用命令

# 单个补丁应用
git am 0001-arm64-dts-imx8mp-enable-watchdog.patch

# 批量应用补丁系列(按文件名数字顺序)
git am patches/*.patch

# 检查补丁是否可干净应用
git apply --check 0001-arm64-dts-imx8mp-enable-watchdog.patch

# 使用 quilt 管理补丁栈(嵌入式常用)
quilt push -a   # 应用所有补丁
quilt pop -a    # 回退所有补丁
quilt new my_patch.diff
quilt add drivers/watchdog/imx2_wdt.c

2.4.3 补丁应用顺序规则

优先级 补丁类型 示例 说明
1(最先) 架构/核心修复 arm64 errata 补丁 影响整个内核的底层修复
2 SoC 平台支持 i.MX8MP 时钟/电源管理 厂商 BSP 核心补丁
3 驱动补丁 看门狗、GPIO、I2C 驱动 外设驱动适配
4 设备树补丁 板级 DTS 配置 硬件拓扑描述
5(最后) 配置/裁剪补丁 defconfig 精简 内核配置调整
补丁冲突预防:每次应用新补丁前,先执行 git status 确认工作区干净。使用 git am --reject 模式,冲突时生成 .rej 文件,手动解决后执行 git am --resolved。切勿使用 patch -p1 直接打补丁,会丢失 Git 元数据。

2.5 实战:从 kernel.org 获取并准备 LTS 内核

以下是一个完整的嵌入式内核源码准备流程,涵盖版本选择、下载、校验与补丁应用。

# 步骤1:选择 LTS 版本(以 6.6.15 为例)
LTS_VERSION="6.6.15"
KERNEL_URL="https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-${LTS_VERSION}.tar.xz"
SIGN_URL="https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-${LTS_VERSION}.tar.sign"

# 步骤2:下载源码与签名文件
wget ${KERNEL_URL}
wget ${SIGN_URL}

# 步骤3:导入内核维护者公钥并校验
gpg --locate-keys torvalds@kernel.org gregkh@kernel.org
xz -cd linux-${LTS_VERSION}.tar.xz | gpg --verify linux-${LTS_VERSION}.tar.sign -

# 步骤4:解压并进入源码目录
tar xf linux-${LTS_VERSION}.tar.xz
cd linux-${LTS_VERSION}

# 步骤5:应用厂商 BSP 补丁(假设补丁在 ../patches/ 目录)
git init
git add .
git commit -m "baseline: Linux ${LTS_VERSION}"

# 按顺序应用补丁
for patch in ../patches/*.patch; do
    echo "Applying: ${patch}"
    git am ${patch}
    if [ $? -ne 0 ]; then
        echo "Conflict in ${patch}, please resolve manually."
        exit 1
    fi
done

# 步骤6:验证内核版本
make kernelversion
# 输出: 6.6.15
关键指标:一个典型的嵌入式项目,从 kernel.org 获取源码到完成 BSP 补丁应用,总耗时应控制在 10~15 分钟(取决于网络带宽)。如果超过 30 分钟,说明补丁管理流程需要优化——考虑使用 quilt 或 patches 目录 + series 文件 管理补丁栈。
补丁应用流程与冲突处理 获取基线源码 git init + 基线提交 git am 应用补丁 冲突? 否 补丁成功 是 手动解决冲突 git am --resolved

2.6 版本选择决策清单

在开始内核裁剪前,使用以下清单快速确认版本选择是否合理:

  • ☐ 是否选择了 LTS 版本?(6.6.x / 6.1.x / 5.15.x / 5.10.x)
  • ☐ 该 LTS 版本是否在 SoC 厂商 BSP 支持列表中?
  • ☐ 是否从 kernel.org 官方源下载并校验 GPG 签名?
  • ☐ 是否使用 Git 管理源码,并创建了基线提交?
  • ☐ 补丁是否按 架构修复 → SoC 支持 → 驱动 → 设备树 → 配置 顺序排列?
  • ☐ 是否验证了补丁应用后内核可正常编译?(make defconfig && make -j$(nproc))
快速验证命令:补丁应用完成后,执行 git log --oneline | head -5 查看提交历史,确认基线提交在最底部,补丁按预期顺序叠加。执行 git diff --stat v6.6.15..HEAD 统计改动文件数量,快速评估补丁规模。