0x00 测试环境
发行版:CentOS Linux release 8.0.1905 (Core)
内核版本:4.18.0-305.10.2.el8_4.x86_64
0x01. 准备kpatch
1.先从github上把kpatch工具下载一下
git clone GitHub - dynup/kpatch: kpatch - live kernel patching
2.进入到kpacth目录执行买这一步会安装好kpatch所需的依赖:
source test/integration/lib.sh
# Will request root privileges
kpatch_dependencies
3. 执行make && make install,编译和安装kpatch
0x02. 准备内核编译环境
kpatch制作需要编译内核和内核模块,所以需要内核源码包以及编译内核所需的依赖。
1.下载centos debuginfo包
wget http://debuginfo.centos.org/8/x86_64/Packages/kernel-debuginfo-4.18.0-305.3.1.el8.x86_64.rpm
这俩全部装上
还需要一个内核源码包:kernel-4.18.0-305.10.2.el8_4.src.rpm
网上也能找到,安装上之后就可以有内核源码编译环境了。内核源码位置在/root/rpmbuild/SOURCES/linux-4.18.0-305.10.2.el8_4
2.更新gcc版本
这一步是因为内核编译的 gcc版本和你系统安装的可能不是一个版本。所以需要讲系统安装的gcc更新到内核编译的那个版本。一般都是低的版本,所以这里不是做升级哦。先把系统安装的gcc卸载掉(如果有的话),从网上找对应的gcc版本。一般需要安装cpp、gcc、libgomp 三个包
3.安装内核编译需要的包
yum install patch bison flex openssl openssl-devel
这几个是我编译过程需要安装的
4.修改内核配置
还需要修改一下内核配置,要不然编译报错:
vim /boot/config-xxxxx
找到这个CONFIG_SYSTEM_TRUSTED_KEYS,修改为:
CONFIG_SYSTEM_TRUSTED_KEYS=“”
这里可以先备份一下,然后修改备份文件比较好。到时候制作补丁的时候就可以直接指定备份的文件
0x03. 准备制作patch
patch不是随便做的,首先必须在当前内核的代码基础上进行修改的补丁。
我们安装好kernel-debuginfo-common包之后,已经再/usr/src/debug目录下生成了相应的内核源码。我们可以把代码打包复制到其他目录进行修改。
补丁的制作方法很多,推荐使用git来做。我的方法是:
1.进入内核根目录,执行git init
2.git add .
3.git commit
4. 修改代码
5. git diff > xxx.patch生成补丁文件
4.热补丁制作
有了前面的准备工作,就可以开始制作热补丁了。热补丁制作就一个命令
kpatch-build -s /root/rpmbuild/SOURCES/linux-4.18.0-305.10.2.el8_4 -c /boot/config-4.18.0-305.10.2.el8_4.x86_64 -v /usr/lib/debug/lib/modules/4.18.0-305.10.2.el8_4.x86_64/vmlinux bfq.patch
解释一下三个参数:
-s 内核源码路径
-c vmlinux文件路径
第三个参数释patch文件,可以跟多个文件
不指定参数的话会使用默认的路径,建议还是跟上参数比较好。这样心里有数。
第一次制作过程时间会久,我的2核虚拟机几个小时==!后面再做就快很多了,十几分钟就可以了。
制作完成之后会生成一个livepatch_xx.ko文件
0x05.加载和卸载内核热补丁
insmod livepatch_xxx.ko 像加载驱动模块一样加载就行
或者使用kpatch load livepatch_xx.ko
卸载补丁则需要用kpatch unload livepatch_xx