零、原理及参考
一、准备工作
- 安装对应版本的kpatch-build.rpm并解决依赖
- diff -Naur dir1 dir2 > hot.patch 拿到补丁文件
- 下载对应内核版本的src.rpm
- 安装好对应的开发包kernel-debuginfo,kernel-debuginfo-common,并可在/lib/debug/lib/modules/xxx-xxx.el7.x86_64/下找到vmlinux内核映像文件
- mkdir -p /usr/share/kpatch/patch提前创建好目录(不然也是~/.kpatch/build.log报错后建)
- kpatch-build -r kernel-bek-4.19.25-200.el7.bclinux.src.rpm -v /lib/debug/lib/modules/4.19.25-200.el7.x86_64/vmlinux Unexpected_TXQ_queue_failure.patch --skip-gcc-check
在当前目录编译出内核热补丁ko后,尝试打入补丁
1.查看已安装的热补丁
# kpatch list (或者 lsmod)
2.加载kpatch热补丁模块
# kpatch load xxx.ko (或者 insmod xxx)
# kpatch list 查看加载情况 (或者 lsmod | grep xxx)
3.卸载某个kpatch热补丁模块
# kpatch unload xxx.ko
rmmod报错是因为该热补丁正在use,不能直接卸载,可以试着用配置取消热补丁:
# echo 0 > /sys/kernel/livepatch/livepatch_xxx/enabled
彻底移除该kpatch热补丁模块可以使用uninstall
# kpatch uninstall xxx.ko
# kpatch list 查看卸载情况
如果仅仅移除kpatch热补丁模块不会卸载运行内核已加载的热补丁模块,除非使用上面描述的kpatch upload命令。
二、制作热补丁时遇到问题及解决方式
- kpatch-build比较占磁盘空间,所以最开始要df -h 确保至少有16G空间
- fatal error: openssl/opensslv.h: No such file or directory
A:缺少包,直接yum -y install openssl-devel即可(apt-get install libssl-dev)
3.
A:有时发现报错“No targets, No makefile”确实离谱,可能是版本不匹配,最后换了个kpatch-build.rpm版本的包就可以了。
三、其它参考笔记
本次热补丁patch如下,本来不应该用热补丁去调试一个功能,而是去修改一个功能。但本次是线上产品,无法本地复现所以就加打印探查一下:
如果是纯学习的话,其实可以用下面这个源码提供的补丁,直接cat /proc/meminfo就能看出区别了
diff -Nupr src.orig/fs/proc/meminfo.c src/fs/proc/meminfo.c
--- src.orig/fs/proc/meminfo.c 2017-09-22 15:27:21.699056179 -0400
+++ src/fs/proc/meminfo.c 2017-09-22 15:27:41.274137239 -0400
@@ -99,7 +99,7 @@ static int meminfo_proc_show(struct seq_
"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