内核热补丁原理介绍、制作、使用、验证方法
此文已由作者杨延亮授权网易云社区发布。
欢迎访问网易云社区,了解更多网易技术产品运营经验。
简介
内核热补丁是一种无需重启操作系统,动态为内核打补丁的技术。系统管理员基于该技术,可以在不重启系统的情况下,修复内核BUG或安全漏洞,可以在最大程度上减少系统宕机时间,增加系统的可用性。
使用场景
1、修复内核或模块的缺陷函数
内核热补丁能够动态的修复内核和模块的缺陷函数。在开发人员发现问题,或者操作系统发现安全漏洞需要修复时,可以通过将缺陷函数或者安全补丁制作成内核热补丁打入系统中的方法,在不需要重启系统或者插拔模块、不中断业务的前提下修复缺陷。
2、开发过程中增加调试或测试手段
内核热补丁也适用于在开发过程中进行调试和测试。比如在模块或者内核的开发过程中,如果需要通过在某一个函数中添加打印信息,或者为函数中某一个变量赋予特定的值,可以通过内核热补丁的形式实现,而不需要重新编译内核、安装、重启的操作。
原理分析
Kpatch基于ftrace实现内核函数的替换,类似于ftrace的动态探测点。利用mcount机制,在内核编译时在每个函数入口保留数个字节,然后在打补丁时将“被替换函数”入口保留的字节替换为跳转指令,跳转到Kpatch的相关流程中,最终进入“新函数”的执行流程,实现函数级别的执行流程在线替换。具体而言如下图:
举例说明
1、以如下patch为例:
2、将步骤1中的patch制作为对应ko文件,执行命令及结果显示如下:
说明:关于make-kpatch命令的执行参数说明可执行"make-kpatch --help"命令来查看
3、执行如下命令,打入内核热补丁:
4、查看对应dmesg信息如下:
5、执行查看内存信息命令,查看到结果以及dmesg信息如下所示:
结合步骤1中的代码对比发现,在/proc/meminfo所看到的内容中,多了LivePatchtest项,并且在执行"cat /proc/meminfo"命令时,dmesg信息中也打印了步骤1中patch代码打印片段。这就证明了我们制作的热补丁是有效的,成功打入了当前运行的内核中。
以上即为热补丁原理、制作、打入热补丁、验证热补丁是否生效的基本方法,有兴趣的同学可以在开发环境上尝试一下。
更多网易技术、产品、运营经验分享请点击。
相关文章:
【推荐】 微服务化的数据库设计与读写分离
【推荐】 用供应链管理思路降低教培产品成本