首页 > Sysadmin > 正文

Linux 内核补丁应用与回滚

huyuanwen 2026-11-04 Sysadmin

草稿待审,未覆盖 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)不会因源码回滚自动重建,需单独处理。

参考资料

文中主要命令已在 WSL Ubuntu(24.04)实测并核对其在 Debian 系与通用发行版的文档口径。