草稿待审,未覆盖 RPM 系发行版及带签名的企业内核补丁流程。
给内核打补丁,优先 patch 单文件;Debian/Ubuntu 源码场景再上 quilt。patch 读取 diff 文件并应用到源文件[1]。内核官方文档指出多数场景现在更推荐 Git,但 patch 仍是理解补丁格式的基础[2]。
推荐做法
- 单文件或少量文件改动:用
patch,步骤最少。 - Debian/Ubuntu 内核源码包:用
quilt管理补丁栈,方便维护多 patch 顺序[3]。 - 复杂改动或需要版本追溯:直接用 Git 管理,不再单独维护 diff。
单文件补丁:patch
先用 diff -u 生成统一 diff 格式补丁,再应用:
cd /path/to/linux-source
patch -p1 < fix.patch
-p1 去掉 diff 文件第一层路径前缀,这是内核补丁的标准写法[2]。成功后源文件被就地修改,不会自动备份;加 -b 可保留 .orig 副本。
Debian/Ubuntu 源码:quilt
获取内核源码包后,进入源码目录并初始化 quilt:
apt-get source linux-image-$(uname -r)
cd linux-*
quilt push -a
quilt push 按顺序应用 debian/patches/ 里的补丁栈。要新增补丁:
quilt new my-fix.patch
quilt edit drivers/net/ethernet/intel/e1000e/e1000e_main.c
# 编辑文件后...
quilt refresh
刷新后补丁会写入 debian/patches/my-fix.patch,并在 series 文件末尾追加条目[3]。
回滚与撤销
patch 场景用 -R 逆操作:
patch -R -p1 < fix.patch
quilt 场景:
quilt pop -a
pop -a 一次性撤销所有已应用补丁,回到源码原始状态[4]。
排错速查
| 现象 | 原因 | 处理 |
|---|---|---|
can't find file to patch |
-p 层级不对 |
用 patch --dry-run 试 -p0/-p1 |
Hunk #1 FAILED |
上下文不匹配 | 检查补丁基础版本,换 -F 3 降低容错 |
quilt push 冲突 |
补丁顺序或内容冲突 | 先 quilt pop 再调整顺序 |
No series file found |
不在 quilt 源目录 | 进入带 debian/patches 的目录 |
实测与局限性
- 实测环境:WSL2 Ubuntu 24.04,GNU patch 2.7.6;已验证
patch -p1正常应用 diff。 - 已阅读但未安装执行:quilt 0.67 官方文档与 Debian manpage,源码包结构已确认。
- 未覆盖:带签名的企业内核补丁(Secure Boot/DBX)、RPM 系(kernel-<version>.src.rpm + rpmbuild)、实时内核(PREEMPT_RT)补丁特殊流程。
- 回滚需谨慎:已编译内核模块(
dkms)不会因源码回滚自动重建,需单独处理。
参考资料
- [1] patch(1) – Linux manual page(man7-patch)
- [2] Applying Patches To The Linux Kernel(kernel-apply-patch)
- [3] How to manage patches – Ubuntu Docs(ubuntu-quilt)
- [4] quilt(1) — quilt — Debian bookworm(debian-quilt)
文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。