Kpatch 使用过程及其原理

1、简介

给 Linux 内核动态打补丁而不必重启系统是最近的一项 热点技术 。 虽然此前已经有了 Ksplice 来达到此类目
的 , 但最近 SUSE 和 Redhat 却先后推出了类似的项目 。 其中,前者为 kGraft, 后者是 kpatch。

kGraft : 为了使 Linux 管理人员更容易的安装重要的 Kernel 安全补丁,同时又不让系统宕机,SUSE Labs 开发了 kGraft。kGraft 使用一组diff文件来计算内核中需要修改的部分。Kgraft在做替换时,不需要完全停止内核。 在打补丁时,正在运行的函数可以先使用老版本或新内核中对应的部分,当补丁打完后就可以完全切换新的版本。

kpatch : Redhat 目前已经以 GPLv2 许可发布了kpatch 的源代码 ,其主要包含以下 4 个组件 :

  • kpatch-build: 用来将 source diff patch 转换成 hot patch module;
  • hot patch module: 包含替代函数及原始函数元数据的内核模块;
  • kpatch core module: 为 hot patch 注册新的函数以用于替换提供接口的内核模块;
  • kpatch utility: 允许用户管理 hot patch 模块的命令行工具;

Kpatch运行时并不将内核调用重定向到老版本。相反,它会等待所有函数调用都停止时,再切换到新内核。Red Hat的工程师认为这种方法更为安全,且更容易维护,缺点就是在打补丁的过程中会带来更大的延迟。

2、Kpatch 详解

下面我们就来详细的看一下Kpatch的使用过程及原理

Kpatch安装见:http://blog.csdn.net/u012343297/article/details/79147781
Kpatch原理:
kpatch 主要有两个组件 kpatch build 和 kpatch.ko

kpatch build — 主要用来建立一个二进制的 patch 模块

kpatch.ko — kpatch产生的内核模块
这里写图片描述
kpatch 提供了一个 kaptch_register() 的接口函数主要用来为 “patch modules” 作函数替换,即: 该接口函数的主要作用是将旧函数用新函数替换掉(这里的新函数就是我们要打的补丁函数)。

kpatch 使用Ftrace 进行打补丁的操作

  • 使用hook 链接到目标函数寄存器
  • 修改 regs->ip 指针,将其指向新函数
    这里写图片描述

考虑如下两个问题是否会出现?

1、如果需要打补丁的函数正在执行,kaptch 将如何操作?
2、新的函数和旧的函数是否会同时执行?
为了避免以上两个问题的出现,kaptch 在运行过程中会确保旧函数不被执行( 使用 stop_machine() 检查栈):
这里写图片描述

其大致流程如下:
这里写图片描述

1、补丁进程 增加一个ftrace 跟踪项(eg:foo() 函数),追踪哪些进程使用旧foo()函数;
2、调用 stop_machine 停止所有正在运行的进程和中断,并且遍历 stop_machine 的返回值,用来确保旧的foo() 函数确实已经被停止。检查旧的 foo() 函数在栈中的位置
3、更新hash 表,使函数调用栈中的指针指向新的 foo()函数,但是旧的foo()函数的指针地址保留方便还原。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值