常用方法
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,编译
| $ make make KPATCH_BUILD=/path/to/kernel $ sudo make install PREFIX=/usr $ cp kmod/core/kpatch.ko /path/to/project-driver $ sudo mkdir /usr/libexec/kpatch/ $ sudo cp kpatch-build/create-diff-object /usr/libexec/kpatch/ $ sudo cp kpatch-build/create-klp-module /usr/libexec/kpatch/ $ sudo cp kpatch-build/create-kpatch-module /usr/libexec/kpatch/ $ sudo cp kpatch-build/kpatch-gcc /usr/libexec/kpatch/ |
并记录下kmod/patch/目录的路径,记录下Module.symvers文件的路径,或将Module.symvers拷贝到指定目录。
3、kpatch-build脚本修改
由于是自定义裁剪的内核及系统,因此默认的kpatch-build脚本会有比较多的问题,主要是路径的问题,需要对其做一些修改。
主要的修改点如下:
find_core_symvers()中对Module.symvers文件的绝对路径的获取,保存到变量SYMVERSFILE中。需要在kpatch-build的find_core_symvers()中的[[ -e “$SYMVERSFILE” ]]之前添加以下内容:
| if [[ -e "$SCRIPTDIR/../lib/kpatch/`uname -r`/Module.symvers" ]]; then SYMVERSFILE="$(readlink -f "./Module.symvers")" fi |
4、热补丁编译
在项目目录下,执行以下命令。路径根据实际情况修改:
| $ sudo ./kpatch-build -v build/x86_64/kernel/vmlinux -t vmlinux -s build/x86_64/packages/linux-3.16.44 -c build/x86_64/kernel/.config test.patch -o /path/to/compiled-ko-file-dir/ |
如果没有其他错误,则生成名为kpatch-test-patch.ko的模块文件。
test.patch示例:
| --- linux-3.16.44/fs/proc/meminfo.c 2019-06-26 14:44:29.349567988 +0800 +++ linux-3.16.44/fs/proc/meminfo.c 2019-06-26 14:45:21.045443105 +0800 @@ -131,7 +131,7 @@ "Committed_AS: %8lu kB\n" "VmallocTotal: %8lu kB\n" "VmallocUsed: %8lu kB\n" - "VmallocChunk: %8lu kB\n" + "VMALLOCCHUNK: %8lu kB\n" #ifdef CONFIG_MEMORY_FAILURE "HardwareCorrupted: %5lu kB\n" #endif |
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