Total Pageviews

Sunday, 10 January 2021

linux内核的热补丁

 常用方法

kgraft与kpatch,一个显著的差异是,当kGraft可能花费数分钟的时候,Kpatch可以只需要1到40毫秒,但他们从不会停机。

内核版本如果低于4.0,也可以使用kpatch工具。

1、kpatch依赖

(1)/home/目录有至少15G空间
(2)gcc版本不低于4.8.3

2、kpatch 编译安装

源码地址:https://github.com/dynup/kpatch

依赖的内核编译选项:
CONFIG_FUNCTION_TRACER, (默认可能未启用)
CONFIG_HAVE_FENTRY,
CONFIG_MODULES,
CONFIG_SYSFS,
CONFIG_KALLSYMS_ALL

下载kpatch-0.63.tar.gz,编译

并记录下kmod/patch/目录的路径,记录下Module.symvers文件的路径,或将Module.symvers拷贝到指定目录。

3、kpatch-build脚本修改

由于是自定义裁剪的内核及系统,因此默认的kpatch-build脚本会有比较多的问题,主要是路径的问题,需要对其做一些修改。
主要的修改点如下:
find_core_symvers()中对Module.symvers文件的绝对路径的获取,保存到变量SYMVERSFILE中。需要在kpatch-build的find_core_symvers()中的[[ -e “$SYMVERSFILE” ]]之前添加以下内容:

4、热补丁编译

在项目目录下,执行以下命令。路径根据实际情况修改:

如果没有其他错误,则生成名为kpatch-test-patch.ko的模块文件。

test.patch示例:

5、热补丁加载

在要打补丁的系统,
先加载kpatch源码编译出的kpatch.ko,
再加载编译好的热补丁kpatch-test-patch.ko,
之后,通过cat /proc/meminfo,就可以看到VmallocChunk已经被替换为了VMALLOCCHUNK。


参考

https://github.com/dynup/kpatch
https://www.oschina.net/translate/no-reboot-patching-comes-to-linux-4-0

No comments:

Post a Comment