Kpatch不重启给Linux内核打补丁
<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>如何部署热升级补丁<ul class="second_class_ul"><li>服务器首次部署kpatch</li><ul class="third_class_ul"><li>升级内核版本</li><li>安装kaptch及kpatch core模块</li></ul><li>安装kpatch 热补丁</li><ul class="third_class_ul"><li>加载热补丁</li><li>显示已安装的补丁</li></ul></ul></li></ul></div><h3>搭建kpatch builder</h3><p>以centos7.2为例。</p>
<p>默认centos7.2的安装的内核版本是<code>3.10.0-327.el7.x86_64</code>,这个内核版本当初是通过<code>gcc 4.8.3</code>编译的。 而centos7.2自带gcc rpm包的版本则是 <code>4.8.5</code></p>
<p>kpatch build命令执行的时候,首先检查gcc的版本是否一致, 因为两者的版本不一致,所以kpatch build命令会失败。 当然我们可以使用<code>--skip-gcc-check</code>,跳过这个检查,我也测试发现在一些简单补丁下可以打包通过。 但是系统不推荐这样做的,会有一定的风险。</p>
<h4>搭建步骤:</h4>
<ul>
<li>升级kernel</li>
</ul>
<p>升级kernel版本到<code>kernel-3.10.0-327.36.3.el7.x86_64</code></p><pre class="brush:bash;toolbar:false">yum update kernel -y
kernel-3.10.0-327.36.3.el7.x86_64</pre><p></p>
<ul>
<li>重启系统,并切换到新安装的内核reboot(switch to new kernel)</li>
<li>安装所需的rpm包</li>
</ul>
<p></p><pre class="brush:bash;toolbar:false">yum install -y gcc kernel-devel elfutils elfutils-develrpmdevtools pesign yum-utils zlib-devel \
binutils-devel newt-devel python-devel perl-ExtUtils-Embed \
audit-libs audit-libs-devel numactl-devel pciutils-devel bison</pre><p></p>
<ul>
<li>打开debug源</li>
</ul>
<p></p><pre class="brush:bash;toolbar:false">yum-config-manager --enable debug</pre><p></p>
<ul>
<li>安装编译kernel所需的rpm报文</li>
</ul>
<p></p><pre class="brush:bash;toolbar:false">yum-builddep kernel</pre><p></p>
<ul>
<li>安装debuginfo相关的rpm包</li>
</ul>
<p></p><pre class="brush:bash;toolbar:false">sudo debuginfo-install kernel</pre><p></p>
<ul>
<li>但是这个命令在选择kernel版本的时候,失败。 通过手动安装两个debuginfo的rpm报文,跳过了这一步</li>
</ul>
<p></p><pre class="brush:bash;toolbar:false">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</pre><p></p>
<ul>
<li>从github上下载并安装kpatch</li>
</ul>
<p>centos默认的kpatch rpm里只有kpatch的命令行工具, 没有<code>kpatch-core.ko</code>, 这个ko是kpatch的必备文件。 kpatch的版本是<code>tag: v0.3.4</code></p><pre class="brush:bash;toolbar:false">yum install git -y
git clone https://github.com/dynup/kpatch.git
cd kpatch
make
make install(root)</pre><p></p>
<h3>制作热升级补丁</h3>
<p>制作补丁很简单可以通过命令<code>kpatch-build</code>。 如:</p><pre class="brush:bash;toolbar:false">kpatch-build vxlan.patch</pre><p>第一次安装的时候,需要下载kernel src rpm包,速度会慢一些。</p><pre class="brush:bash;toolbar:false"># kpatch-buildvxlan.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</pre><p>最后,在命令执行的当前目录下回产生一个ko文件</p>
<p class="maodian"></p><h2>如何部署热升级补丁</h2>
<p class="maodian"></p><h3>服务器首次部署kpatch</h3>
<p class="maodian"></p><h4>升级内核版本</h4>
<p>确保被升级机器的内核版本跟builder机一致。</p>
<p>如不一致, 升级kernel到<code>3.10.0-327.36.3.el7.x86_64</code></p><pre class="brush:bash;toolbar:false">yum update kernel</pre><p></p>
<p class="maodian"></p><h4>安装kaptch及kpatch core模块</h4>
<p></p><pre class="brush:bash;toolbar:false">yum install kpatch
insmod kpatch-core.ko</pre><p>centos7.2自带的kpatch rpm包里只有kpatch的一些脚本命令,缺少<code>kpatch-core.ko</code>, 这个需要我们手动从builder机里copy。</p>
<p class="maodian"></p><h3>安装kpatch 热补丁</h3>
<p class="maodian"></p><h4>加载热补丁</h4>
<p></p><pre class="brush:bash;toolbar:false">kpatch install kpatch-vxlan.ko</pre><p></p>
<p class="maodian"></p><h4>显示已安装的补丁</h4>
<p></p><pre class="brush:bash;toolbar:false"># kpatch list
Loaded patch modules:
Installed patch modules:
kpatch_vxlan (3.10.0-327.36.3.el7.x86_64)</pre><p> </p>
頁:
[1]