From ce9382701fe053d341c028d5c34e311498d0df5c Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 29 Apr 2026 06:49:04 +0000 Subject: [PATCH 1/2] Initial plan From b1e7a25f43c5cca30427f2a82ecba8e7c19eaf18 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Wed, 29 Apr 2026 06:52:39 +0000 Subject: [PATCH 2/2] =?UTF-8?q?docs:=20=E6=96=B0=E5=A2=9E=20docs/livepatch?= =?UTF-8?q?-sysfs.md=20=E7=83=AD=E8=A1=A5=E4=B8=81=E5=86=85=E6=A0=B8=20sys?= =?UTF-8?q?fs=20=E8=8A=82=E7=82=B9=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Agent-Logs-Url: https://github.com/JohnsPony/bpf-developer-tutorial/sessions/7552335a-4aea-473d-95da-5b0d01faeae9 Co-authored-by: JohnsPony <112840588+JohnsPony@users.noreply.github.com> --- docs/livepatch-sysfs.md | 682 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 682 insertions(+) create mode 100644 docs/livepatch-sysfs.md diff --git a/docs/livepatch-sysfs.md b/docs/livepatch-sysfs.md new file mode 100644 index 00000000..059bb35a --- /dev/null +++ b/docs/livepatch-sysfs.md @@ -0,0 +1,682 @@ +# Linux 内核热补丁 sysfs 节点详解:/sys/kernel/livepatch + +> 本文面向 BPF / 内核初学者,系统讲解 Linux 内核 livepatch(热补丁)机制的 sysfs 接口,包含原理、节点结构、操作流程、框架差异、排错思路与参考资料。 + +--- + +## 目录 + +1. [livepatch 子系统概述](#1-livepatch-子系统概述) +2. [热补丁的主要原理](#2-热补丁的主要原理) +3. [/sys/kernel/livepatch 节点结构](#3-syskernellivepatch-节点结构) +4. [关键文件含义与取值说明](#4-关键文件含义与取值说明) +5. [热补丁生命周期与节点变化流程](#5-热补丁生命周期与节点变化流程) +6. [kpatch / livepatch / kgraft 框架对比](#6-kpatch--livepatch--kgraft-框架对比) +7. [常见操作命令速查](#7-常见操作命令速查) +8. [观测节点状态判断补丁是否激活](#8-观测节点状态判断补丁是否激活) +9. [排错思路](#9-排错思路) +10. [参考资料](#10-参考资料) + +--- + +## 1. livepatch 子系统概述 + +**livepatch**(内核热补丁)是 Linux 内核自 4.0 版本(2015 年)引入的官方在线补丁机制,允许在**不重启系统**的前提下对运行中的内核函数打补丁,从而修复安全漏洞或关键 Bug。 + +### 主要用途 + +| 用途 | 说明 | +|------|------| +| 安全漏洞修复 | CVE 级内核漏洞可在生产环境实时修复,无需维护窗口 | +| 关键 Bug 修复 | 修复可能导致数据损坏或系统不稳定的内核缺陷 | +| 长周期在线运行 | 电信、金融、数据库等高可用系统必须保持 SLA 连续性 | +| 紧急响应 | 安全事件发生后快速分发补丁,降低暴露窗口 | + +### 生态工具 + +- **内核原生 livepatch**:`CONFIG_LIVEPATCH=y`,Linux 4.0+,上游维护 +- **kpatch**:Red Hat 开发的自动化热补丁构建/管理工具,基于内核 livepatch 接口 +- **kGraft**:SUSE 开发的早期实现,与 livepatch 合并前的独立方案;现 SUSE 产品基于上游 livepatch + +--- + +## 2. 热补丁的主要原理 + +### 2.1 函数替换机制 + +Linux livepatch 的核心原理是**函数层面的替换**: + +1. **补丁模块加载**:热补丁被编译成一个普通的内核模块(`.ko`),加载到内核 +2. **ftrace hook**:通过 `ftrace`(内核函数追踪框架)在目标函数入口处植入跳转指令 +3. **重定向调用**:当函数被调用时,ftrace hook 将控制流重定向到补丁函数 +4. **一致性模型**:确保所有 CPU 在切换过渡期间不会在被替换函数的中间状态执行 + +``` +调用方 + │ + ▼ +[原始函数入口] + │ ← ftrace 插桩点(每函数开头的 5-byte NOP) + │ ← 打补丁后替换为 JMP 到 ftrace trampoline + │ + ▼ +[ftrace trampoline] + │ + └─→ [livepatch handler] → [补丁函数(新逻辑)] +``` + +### 2.2 一致性模型(Consistency Model) + +为了保证安全切换,livepatch 需要: + +- **堆栈检查(Stack Checking)**:确认所有 CPU 的调用栈中都不包含正在被替换的函数 +- **过渡(transition)状态**:所有任务从旧函数切换到新函数期间,系统处于"过渡"状态 +- **抢占点协作**:每个任务在下一次调度(`schedule()`)时检查并完成切换 + +> **注意**:此过渡期在 sysfs 中可观测为 `transition` 文件值为 `1`。 + +--- + +## 3. /sys/kernel/livepatch 节点结构 + +加载一个热补丁模块后,内核会在 sysfs 下自动创建对应目录: + +``` +/sys/kernel/livepatch/ +└── / # 每个补丁一个子目录,名称 = 模块名 + ├── enabled # 补丁是否启用(0/1,可写) + ├── transition # 是否处于过渡状态(只读) + ├── force # 强制完成过渡(只写,危险!) + └── / # 被修补的内核对象(vmlinux 或模块名) + └── / # 被替换的函数 + └── patched # 该函数是否已完成补丁应用(只读) +``` + +### 3.1 实际示例(加载 kpatch 补丁后) + +``` +/sys/kernel/livepatch/ +└── kpatch_5_15_0_fix_cve_2023_1234/ + ├── enabled → "1" + ├── transition → "0" + ├── force → (write-only) + └── vmlinux/ + ├── tcp_input/ + │ └── patched → "1" + └── ip_rcv/ + └── patched → "1" +``` + +对于修补内核模块(而非 vmlinux)的补丁: + +``` +/sys/kernel/livepatch/ +└── my_module_patch/ + ├── enabled + ├── transition + ├── force + └── ext4/ # 被修补的模块名 + └── ext4_file_write_iter/ + └── patched +``` + +--- + +## 4. 关键文件含义与取值说明 + +### 4.1 `enabled` + +| 属性 | 值 | +|------|----| +| 路径 | `/sys/kernel/livepatch//enabled` | +| 类型 | 读/写(`0` 或 `1`) | +| 默认值 | 模块加载后为 `1`(自动启用) | + +**含义**: + +- `1`:补丁已启用或正在启用(过渡中) +- `0`:补丁已禁用或正在禁用 + +**写入操作**: + +```bash +# 禁用补丁(触发反向过渡,恢复原始函数) +echo 0 > /sys/kernel/livepatch/my_patch/enabled + +# 重新启用补丁 +echo 1 > /sys/kernel/livepatch/my_patch/enabled +``` + +> 写入 `0` 不会立即卸载补丁模块,只是停止重定向。若要卸载模块,需要在 `transition=0` 后执行 `rmmod`。 + +--- + +### 4.2 `transition` + +| 属性 | 值 | +|------|----| +| 路径 | `/sys/kernel/livepatch//transition` | +| 类型 | 只读(`0` 或 `1`) | + +**含义**: + +- `0`:没有进行中的过渡,补丁状态稳定(完全激活或完全禁用) +- `1`:系统正在进行过渡——某些任务仍在执行旧函数,某些已切换到新函数 + +**过渡状态触发时机**: + +1. 模块刚加载,`enabled` 从 `0` 变 `1`(启用过渡) +2. 将 `enabled` 写 `0`(禁用过渡) + +**正常情况**:过渡通常在秒级内完成(所有任务经过一次调度)。若长时间保持 `1`,说明有任务卡住(见[排错](#9-排错思路))。 + +--- + +### 4.3 `force` + +| 属性 | 值 | +|------|----| +| 路径 | `/sys/kernel/livepatch//force` | +| 类型 | 只写(写 `1` 触发) | + +**含义**:强制将所有任务的过渡标志置为完成,无论其堆栈状态如何。 + +```bash +# 强制完成过渡(慎用!) +echo 1 > /sys/kernel/livepatch/my_patch/force +``` + +> ⚠️ **警告**:`force` 会绕过安全检查,可能导致内核崩溃。仅在确认等待中的任务无法正常完成过渡(如僵尸进程、实时任务卡住)且充分了解风险时才使用。 + +--- + +### 4.4 `patched`(函数级) + +| 属性 | 值 | +|------|----| +| 路径 | `/sys/kernel/livepatch////patched` | +| 类型 | 只读(`0` 或 `1`) | + +**含义**: + +- `1`:该函数已完成补丁应用,调用将走补丁逻辑 +- `0`:该函数尚未完成补丁应用(过渡中或已禁用) + +--- + +### 4.5 其他节点(内核版本相关) + +部分较新内核版本或 kpatch 扩展版本中可能存在以下节点: + +| 文件 | 说明 | 内核版本 | +|------|------|----------| +| `callbacks/` | 补丁生命周期回调(pre/post-patch, pre/post-unpatch)的调用状态 | 4.15+ | +| `loaded` | 补丁模块是否已加载(由 kpatch-module 管理工具使用)| kpatch 工具层 | +| `version` | 补丁版本信息(由补丁模块自定义导出) | 视补丁实现 | + +`callbacks/` 目录示例(如果补丁定义了回调): + +``` +/sys/kernel/livepatch/my_patch/ +└── callbacks/ + ├── pre_patch_callback → "ok" / "error" + └── post_patch_callback → "ok" +``` + +--- + +## 5. 热补丁生命周期与节点变化流程 + +### 5.1 加载并启用补丁 + +``` +步骤 1: insmod my_patch.ko + ↓ + /sys/kernel/livepatch/my_patch/ 目录创建 + enabled = 1 ← 自动启用 + transition = 1 ← 开始过渡 + +步骤 2: 系统等待所有任务经过调度点切换 + ↓ + 每个 CPU 上的任务在下一次 schedule() 时更新过渡标志 + +步骤 3: 过渡完成(所有任务切换完毕) + ↓ + enabled = 1 + transition = 0 ← 过渡结束 + vmlinux/target_func/patched = 1 ← 函数已打补丁 +``` + +### 5.2 禁用补丁(不卸载模块) + +``` +echo 0 > /sys/kernel/livepatch/my_patch/enabled + ↓ + enabled = 0 + transition = 1 ← 开始反向过渡(恢复原函数) + +等待过渡完成 + ↓ + transition = 0 + vmlinux/target_func/patched = 0 ← 函数恢复原始 +``` + +### 5.3 卸载补丁模块 + +``` +# 前提:transition = 0,enabled = 0(禁用并完成反向过渡) +rmmod my_patch + ↓ + /sys/kernel/livepatch/my_patch/ 目录消失 +``` + +> 若 `transition = 1` 时尝试 `rmmod`,内核会拒绝并返回 `-EBUSY`。 + +### 5.4 节点状态速查表 + +| 阶段 | `enabled` | `transition` | `patched` | +|------|-----------|--------------|-----------| +| 未加载 | — | — | — | +| 加载中(过渡) | 1 | 1 | 0 | +| 完全激活 | 1 | 0 | 1 | +| 禁用中(反向过渡) | 0 | 1 | 1→0 | +| 完全禁用 | 0 | 0 | 0 | + +--- + +## 6. kpatch / livepatch / kgraft 框架对比 + +### 6.1 框架简介 + +| 框架 | 来源 | 状态 | 节点基础 | +|------|------|------|----------| +| **内核 livepatch**(upstream) | Linux 社区(Red Hat + SUSE 合作) | 主线维护(4.0+) | `/sys/kernel/livepatch/` | +| **kpatch** | Red Hat | 活跃维护,工具层 | 基于内核 livepatch | +| **kGraft** | SUSE | 已并入上游 livepatch | 历史遗留,现基于 livepatch | +| **kpatch-module** | Red Hat | kpatch 的模块格式工具链 | 兼容 livepatch sysfs | + +### 6.2 sysfs 节点差异 + +#### 内核原生 livepatch(上游,推荐) + +``` +/sys/kernel/livepatch// +├── enabled +├── transition +├── force +└── / + └── / + └── patched +``` + +- 所有节点由内核自动管理 +- 无额外工具依赖 + +#### kpatch(Red Hat 工具层) + +kpatch 在内核 livepatch 基础上增加了: + +```bash +# kpatch 命令管理(底层仍是 insmod/rmmod + sysfs) +kpatch install kpatch-patch-5_15_0-1.0-1.x86_64.rpm +kpatch load /usr/lib/kpatch/5.15.0/kpatch-xxx.ko +kpatch list # 列出已加载的补丁及其状态 +kpatch unload xxx # 禁用并卸载补丁 +``` + +kpatch 内部使用 `/sys/kernel/livepatch/` 节点,并在模块命名上遵循 `kpatch__` 约定。 + +#### kGraft(已历史化) + +kGraft 曾有独立的 `/sys/kernel/livepatch/` 实现,与上游略有差异(如任务状态标记方式),但现代 SUSE 产品已统一到上游 livepatch 接口,节点结构与内核原生一致。 + +### 6.3 一致性模型差异(影响 transition 行为) + +| 特性 | 内核 livepatch(4.12+) | kpatch(基于 livepatch) | kGraft(旧) | +|------|------------------------|--------------------------|--------------| +| 堆栈检查 | ✅ 基于 per-task 标记 | ✅(继承) | ✅ 类似机制 | +| 强制完成 | ✅ `force` 节点 | ✅(继承) | ❌ 无 `force` | +| 原子替换(多函数) | ✅ 4.15+ 原子补丁组 | ✅(继承) | 部分支持 | +| 单任务独立过渡 | ✅ | ✅ | ✅(全局过渡不同) | + +--- + +## 7. 常见操作命令速查 + +### 7.1 查看当前已加载的热补丁 + +```bash +# 列出所有补丁目录 +ls /sys/kernel/livepatch/ + +# 查看单个补丁状态 +cat /sys/kernel/livepatch/my_patch/enabled +cat /sys/kernel/livepatch/my_patch/transition + +# 查看所有节点(递归) +find /sys/kernel/livepatch/ -type f | xargs -I{} sh -c 'echo "{}:$(cat {})"' +``` + +### 7.2 加载补丁模块 + +```bash +# 直接加载 +insmod /path/to/my_patch.ko + +# 使用 kpatch 工具 +kpatch load /path/to/kpatch-xxx.ko +``` + +### 7.3 禁用/启用补丁 + +```bash +# 禁用(不卸载模块) +echo 0 > /sys/kernel/livepatch/my_patch/enabled + +# 重新启用 +echo 1 > /sys/kernel/livepatch/my_patch/enabled +``` + +### 7.4 等待过渡完成 + +```bash +# 轮询直到 transition 变为 0 +while [ "$(cat /sys/kernel/livepatch/my_patch/transition)" = "1" ]; do + echo "Still in transition..." + sleep 1 +done +echo "Transition complete" +``` + +### 7.5 卸载补丁 + +```bash +# 确保先禁用并等待过渡完成 +echo 0 > /sys/kernel/livepatch/my_patch/enabled +while [ "$(cat /sys/kernel/livepatch/my_patch/transition)" = "1" ]; do sleep 1; done + +# 再卸载模块 +rmmod my_patch + +# 使用 kpatch +kpatch unload my_patch +``` + +### 7.6 查看内核日志 + +```bash +# 加载补丁时的内核日志 +dmesg | grep -i livepatch | tail -20 + +# 过渡相关日志 +dmesg | grep -E "livepatch|klp_" +``` + +--- + +## 8. 观测节点状态判断补丁是否激活 + +### 8.1 完整激活判断 + +补丁"完整激活"的充要条件: + +```bash +# 条件1: enabled = 1 +[ "$(cat /sys/kernel/livepatch/my_patch/enabled)" = "1" ] || echo "NOT enabled" + +# 条件2: transition = 0(无过渡进行中) +[ "$(cat /sys/kernel/livepatch/my_patch/transition)" = "0" ] || echo "IN TRANSITION" + +# 条件3: 所有目标函数 patched = 1 +find /sys/kernel/livepatch/my_patch/ -name patched | while read f; do + val=$(cat "$f") + echo "$f: $val" + [ "$val" = "1" ] || echo " ↑ NOT fully patched!" +done +``` + +### 8.2 综合状态脚本示例 + +```bash +#!/bin/bash +PATCH=${1:-$(ls /sys/kernel/livepatch/ | head -1)} +BASE="/sys/kernel/livepatch/${PATCH}" + +[ -d "$BASE" ] || { echo "Patch not loaded: $PATCH"; exit 1; } + +ENABLED=$(cat "$BASE/enabled") +TRANSITION=$(cat "$BASE/transition") + +echo "=== Livepatch Status: $PATCH ===" +echo " enabled : $ENABLED" +echo " transition : $TRANSITION" + +if [ "$ENABLED" = "1" ] && [ "$TRANSITION" = "0" ]; then + echo " STATUS : ✅ ACTIVE (fully patched)" +elif [ "$TRANSITION" = "1" ]; then + echo " STATUS : 🔄 IN TRANSITION" +else + echo " STATUS : ❌ DISABLED" +fi + +echo "" +echo "=== Patched Functions ===" +find "$BASE" -name patched | while read f; do + func=$(echo "$f" | awk -F'/' '{print $(NF-1)}') + obj=$(echo "$f" | awk -F'/' '{print $(NF-2)}') + val=$(cat "$f") + echo " [$obj] $func: $([ $val = 1 ] && echo '✅' || echo '❌') ($val)" +done +``` + +### 8.3 示例输出 + +加载并完全激活后的输出: + +``` +=== Livepatch Status: kpatch_5_15_0_fix_cve_2023_1234 === + enabled : 1 + transition : 0 + STATUS : ✅ ACTIVE (fully patched) + +=== Patched Functions === + [vmlinux] tcp_input: ✅ (1) + [vmlinux] ip_rcv: ✅ (1) +``` + +过渡中的输出: + +``` +=== Livepatch Status: kpatch_5_15_0_fix_cve_2023_1234 === + enabled : 1 + transition : 1 + STATUS : 🔄 IN TRANSITION + +=== Patched Functions === + [vmlinux] tcp_input: ❌ (0) + [vmlinux] ip_rcv: ❌ (0) +``` + +--- + +## 9. 排错思路 + +### 9.1 问题:`transition` 长时间保持为 `1` + +**症状**:加载补丁后数分钟甚至数小时,`transition` 仍为 `1` + +**原因与排查**: + +1. **有任务卡在被补丁函数的调用栈中** + + ```bash + # 查看哪些任务正在等待过渡(内核 5.10+ 提供 per-task 状态) + dmesg | grep "livepatch: task" | tail -30 + + # 查看 D 状态(不可中断睡眠)或 R 状态(正在运行)的任务 + ps aux | awk '$8 ~ /^[DR]/' + + # 查看所有任务的堆栈,找包含目标函数的 + # (需要 CONFIG_STACKTRACE=y) + for pid in $(ps -e -o pid=); do + stack=$(cat /proc/$pid/wchan 2>/dev/null) + echo "PID $pid: $stack" + done + ``` + +2. **实时任务(RT)或内核线程不经过调度点** + + ```bash + # 查找优先级极高的实时任务 + ps -eo pid,rtprio,comm | awk '$2 > 0' + + # 查看内核线程 + ps -eo pid,comm | grep '\[' + ``` + +3. **被补丁函数在中断上下文或软中断中执行** + + 中断上下文的任务不经过 `schedule()`,可能长时间不完成过渡。 + +**解决方法**: + +```bash +# 方法1(推荐):等待并触发调度 +# 发送信号让所有用户空间任务重新调度 +kill -CONT -1 # 向所有进程发 SIGCONT(无害) + +# 方法2:使用 klp_try_switch_task(内核调试,需要 debugfs) +# (视内核版本和配置而定) + +# 方法3(危险):强制完成过渡 +echo 1 > /sys/kernel/livepatch/my_patch/force +# 警告:可能导致内核崩溃! +``` + +--- + +### 9.2 问题:`rmmod` 返回 `-EBUSY` + +**症状**:尝试卸载补丁模块时出现 `rmmod: ERROR: Module my_patch is in use` + +**原因**:补丁尚未完全禁用(`transition` 仍为 `1`,或 `enabled` 还是 `1`) + +**解决**: + +```bash +# 步骤1: 先禁用补丁 +echo 0 > /sys/kernel/livepatch/my_patch/enabled + +# 步骤2: 等待过渡完成 +while [ "$(cat /sys/kernel/livepatch/my_patch/transition)" = "1" ]; do + sleep 1 +done + +# 步骤3: 卸载 +rmmod my_patch +``` + +--- + +### 9.3 问题:补丁加载失败(`insmod` 报错) + +**常见错误及原因**: + +| 错误 | 可能原因 | +|------|---------| +| `Invalid module format` | 补丁模块与运行中内核版本不匹配 | +| `Unknown symbol in module` | 依赖的内核符号不存在(内核版本/配置不符) | +| `Operation not permitted` | 缺少 `CAP_SYS_MODULE` 权限;或 Secure Boot/模块签名验证失败 | +| `File exists` | 同名补丁已加载 | +| `No such device` | 内核未启用 `CONFIG_LIVEPATCH` | + +**排查**: + +```bash +# 检查内核是否支持 livepatch +cat /proc/sys/kernel/modules_disabled 2>/dev/null +ls /sys/kernel/livepatch/ 2>/dev/null || echo "livepatch not supported" + +# 查看详细错误 +dmesg | tail -20 +modinfo my_patch.ko | grep vermagic +uname -r +``` + +--- + +### 9.4 问题:补丁激活但漏洞未修复 + +**排查步骤**: + +1. 确认 `enabled=1` 且 `transition=0` 且目标函数 `patched=1` +2. 确认目标函数名称完全匹配(包括静态函数的内联/重命名) +3. 确认代码路径是否确实经过被补丁的函数 +4. 使用 ftrace 验证补丁函数是否被调用: + +```bash +# 通过 ftrace 查看被替换函数是否有调用 +echo 'target_function_name' > /sys/kernel/debug/tracing/set_ftrace_filter +echo 'function' > /sys/kernel/debug/tracing/current_tracer +echo 1 > /sys/kernel/debug/tracing/tracing_on +cat /sys/kernel/debug/tracing/trace +``` + +--- + +### 9.5 dmesg 中常见 livepatch 相关日志 + +``` +# 正常加载流程 +livepatch: enabling patch 'my_patch' +livepatch: 'my_patch': starting patching transition +livepatch: 'my_patch': patching complete + +# 过渡卡住警告(内核主动打印) +livepatch: 'my_patch': patching transition ... stalled! +# → 说明有任务长时间未完成过渡 + +# 强制完成 +livepatch: 'my_patch': force ... complete + +# 禁用流程 +livepatch: 'my_patch': starting unpatching transition +livepatch: 'my_patch': unpatching complete +``` + +--- + +## 10. 参考资料 + +### 官方内核文档 + +- [Documentation/livepatch/livepatch.rst](https://www.kernel.org/doc/html/latest/livepatch/livepatch.html) — 内核 livepatch 官方文档 +- [Documentation/livepatch/api.rst](https://www.kernel.org/doc/html/latest/livepatch/api.html) — livepatch API 参考 +- [Documentation/livepatch/callbacks.rst](https://www.kernel.org/doc/html/latest/livepatch/callbacks.html) — 生命周期回调说明 +- [Documentation/livepatch/consistency-model.rst](https://www.kernel.org/doc/html/latest/livepatch/consistency-model.html) — 一致性模型详解 +- [Documentation/livepatch/shadow-vars.rst](https://www.kernel.org/doc/html/latest/livepatch/shadow-vars.html) — 影子变量(数据补丁) + +### kpatch 工具 + +- [kpatch GitHub](https://github.com/dynup/kpatch) — Red Hat kpatch 工具链 +- [kpatch Documentation](https://github.com/dynup/kpatch/blob/master/doc/patch-author-guide.md) — kpatch 补丁开发指南 + +### 内核源码关键文件 + +``` +kernel/livepatch/ +├── core.c # livepatch 核心实现(模块注册、sysfs 创建) +├── patch.c # 函数替换(ftrace hook 管理) +├── transition.c # 过渡状态机(per-task 过渡逻辑) +├── shadow.c # 影子变量实现(数据补丁支持) +└── callbacks.c # 补丁生命周期回调 +``` + +### 相关 CVE / 示例补丁 + +- [kpatch 示例补丁仓库](https://github.com/dynup/kpatch/tree/master/kpatch-build) — 参考 kpatch 构建过程 +- 内核测试样例:`lib/livepatch/test_klp_*.c`(随内核源码附带) + +--- + +*本文档最后更新于 2024 年,适用于 Linux 4.12+ 内核。部分特性(如 `force` 节点、原子补丁)需要更高版本(4.15+/5.x)。*