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。

参考

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

原创文章,转载请注明: 转载自孙希栋的博客

本文链接地址: 《Linux内核热补丁》

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Scroll Up