搭建kpatch builder
以centos7.2为例。
默认centos7.2的安装的内核版本是3.10.0-327.el7.x86_64,这个内核版本当初是通过gcc 4.8.3编译的。 而centos7.2自带gcc rpm包的版本则是 4.8.5
kpatch build命令执行的时候,首先检查gcc的版本是否一致, 因为两者的版本不一致,所以kpatch build命令会失败。 当然我们可以使用--skip-gcc-check,跳过这个检查,我也测试发现在一些简单补丁下可以打包通过。 但是系统不推荐这样做的,会有一定的风险。
搭建步骤:
升级kernel
升级kernel版本到kernel-3.10.0-327.36.3.el7.x86_64
yum update kernel -y
kernel-3.10.0-327.36.3.el7.x86_64
1
2
yumupdatekernel-y
kernel-3.10.0-327.36.3.el7.x86_64
重启系统,并切换到新安装的内核reboot(switch to new kernel)
安装所需的rpm包
yum install -y gcc kernel-devel elfutils elfutils-devel rpmdevtools pesign yum-utils zlib-devel \
binutils-devel newt-devel python-devel perl-ExtUtils-Embed \
audit-libs audit-libs-devel numactl-devel pciutils-devel bison
1
2
3
yuminstall-ygcckernel-develelfutilselfutils-develrpmdevtoolspesignyum-utilszlib-devel\
binutils-develnewt-develpython-develperl-ExtUtils-Embed\
audit-libsaudit-libs-develnumactl-develpciutils-develbison
打开debug源
yum-config-manager --enable debug
1
yum-config-manager--enabledebug
安装编译kernel所需的rpm报文
yum-builddep kernel
1
yum-builddepkernel
安装debuginfo相关的rpm包
sudo debuginfo-install kernel
1
sudodebuginfo-installkernel
但是这个命令在选择kernel版本的时候,失败。 通过手动安装两个debuginfo的rpm报文,跳过了这一步
rpm -ivh kernel-debuginfo-common-x86_64-3.10.0-327.36.3.el7.x86_64.rpm
rpm -ivh kernel-debuginfo-3.10.0-327.36.3.el7.x86_64.rpm
1
2
rpm-ivhkernel-debuginfo-common-x86_64-3.10.0-327.36.3.el7.x86_64.rpm
rpm-ivhkernel-debuginfo-3.10.0-327.36.3.el7.x86_64.rpm
从github上下载并安装kpatch
centos默认的kpatch rpm里只有kpatch的命令行工具, 没有kpatch-core.ko, 这个ko是kpatch的必备文件。 kpatch的版本是tag: v0.3.4
yum install git -y
git clone https://github.com/dynup/kpatch.git
cd kpatch
make
make install(root)
1
2
3
4
5
yuminstallgit-y
gitclonehttps://github.com/dynup/kpatch.git
cdkpatch
make
makeinstall(root)
制作热升级补丁
制作补丁很简单可以通过命令kpatch-build。 如:
kpatch-build vxlan.patch
1
kpatch-buildvxlan.patch
第一次安装的时候,需要下载kernel src rpm包,速度会慢一些。
[root@vm1 ~]# kpatch-build vxlan.patch
Fedora/Red Hat distribution detected
Downloading kernel source for 3.10.0-327.36.3.el7.x86_64
。。。
dev.o: changed function: __dev_set_promiscuity
dev.o: changed function: __dev_set_allmulti
dev.o: changed function: dev_set_mtu
dev.o: changed function: dev_queue_xmit
dev.o: changed function: unregister_netdevice_queue
dev.o: changed function: netdev_rx_handler_unregister
dev.o: changed function: validate_xmit_skb
dev.o: changed function: __dev_change_flags
dev.o: changed function: netdev_upper_dev_unlink
dev.o: new function: __kpatch_validate_xmit_skb
dev.o: changed function: netdev_has_upper_dev
dev.o: changed function: netdev_master_upper_dev_get
dev.o: changed function: netdev_has_any_upper_dev
dev.o: changed function: dev_change_net_namespace
dev.o: changed function: netdev_rx_handler_register
dev.o: changed function: __netdev_update_features
dev.o: changed function: register_netdevice
Patched objects: vmlinux
Building patch module: kpatch-vxlan.ko
SUCCESS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
[root@vm1~]# kpatch-build vxlan.patch
Fedora/RedHatdistributiondetected
Downloadingkernelsourcefor3.10.0-327.36.3.el7.x86_64
。。。
dev.o:changedfunction:__dev_set_promiscuity
dev.o:changedfunction:__dev_set_allmulti
dev.o:changedfunction:dev_set_mtu
dev.o:changedfunction:dev_queue_xmit
dev.o:changedfunction:unregister_netdevice_queue
dev.o:changedfunction:netdev_rx_handler_unregister
dev.o:changedfunction:validate_xmit_skb
dev.o:changedfunction:__dev_change_flags
dev.o:changedfunction:netdev_upper_dev_unlink
dev.o:newfunction:__kpatch_validate_xmit_skb
dev.o:changedfunction:netdev_has_upper_dev
dev.o:changedfunction:netdev_master_upper_dev_get
dev.o:changedfunction:netdev_has_any_upper_dev
dev.o:changedfunction:dev_change_net_namespace
dev.o:changedfunction:netdev_rx_handler_register
dev.o:changedfunction:__netdev_update_features
dev.o:changedfunction:register_netdevice
Patchedobjects:vmlinux
Buildingpatchmodule:kpatch-vxlan.ko
SUCCESS
最后,在命令执行的当前目录下回产生一个ko文件
如何部署热升级补丁
服务器首次部署kpatch
升级内核版本
确保被升级机器的内核版本跟builder机一致。
如不一致, 升级kernel到3.10.0-327.36.3.el7.x86_64
yum update kernel
1
yumupdatekernel
安装kaptch及kpatch core模块
yum install kpatch
insmod kpatch-core.ko
1
2
yuminstallkpatch
insmodkpatch-core.ko
centos7.2自带的kpatch rpm包里只有kpatch的一些脚本命令,缺少kpatch-core.ko, 这个需要我们手动从builder机里copy。
安装kpatch 热补丁
加载热补丁
kpatch install kpatch-vxlan.ko
1
kpatchinstallkpatch-vxlan.ko
显示已安装的补丁
[root@vm2 ~]# kpatch list
Loaded patch modules:
Installed patch modules:
kpatch_vxlan (3.10.0-327.36.3.el7.x86_64)
1
2
3
4
5
[root@vm2~]# kpatch list
Loadedpatchmodules:
Installedpatchmodules:
kpatch_vxlan(3.10.0-327.36.3.el7.x86_64)