以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-3.10.0-327.36.3.el7.x86_64
1 2 | yum update kernel – y kernel – 3.10.0 – 327.36.3.el7.x86_64 |
1 2 3 | 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 | yum – config – manager — enable debug |
1 | yum – builddep kernel |
1 | sudo debuginfo – install kernel |
1 2 | 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 |
centos默认的kpatch rpm里只有kpatch的命令行工具, 没有kpatch-core.ko
, 这个ko是kpatch的必备文件。 kpatch的版本是tag: v0.3.4
1 2 3 4 5 | yum install git – y git clone https : //github.com/dynup/kpatch.git cd kpatch make make install ( root ) |
制作补丁很简单可以通过命令kpatch-build
。 如:
1 | kpatch – build vxlan . patch |
第一次安装的时候,需要下载kernel src rpm包,速度会慢一些。
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 / 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 |
最后,在命令执行的当前目录下回产生一个ko文件
确保被升级机器的内核版本跟builder机一致。
如不一致, 升级kernel到3.10.0-327.36.3.el7.x86_64
1 | yum update kernel |
1 2 | yum install kpatch insmod kpatch – core . ko |
centos7.2自带的kpatch rpm包里只有kpatch的一些脚本命令,缺少kpatch-core.ko
, 这个需要我们手动从builder机里copy。
1 | kpatch install kpatch – vxlan . ko |
1 2 3 4 5 | [ root @ vm2 ~ ] # kpatch list Loaded patch modules : Installed patch modules : kpatch_vxlan ( 3.10.0 – 327.36.3.el7.x86_64 ) |
文章转载来自:trustauth.cn