零、原理及參考
kpatch入門實踐教程-CSDN博客
Kpatch 使用過程及其原理-CSDN博客
一、準備工作
- 安裝對應版本的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