Linux 内核热补丁方案介绍对比

Leo Xiao 发表于 2021/03/19 19:05:46 2021/03/19
【摘要】 Linux 内核热补丁 linux 内核热补丁技术背景 update和upgrade的区别Linux upgrade (升级)升级是软件的最新版本。升级的频率比更新的频率低,并且通常以软件的重大改进,新功能,增强的功能和其他明显的更改。通常考虑到比较大的变化和更高的性能,必须升级操作系统。Linux update (更新)软件更新是补丁程序,并且可以充当您正在使用的系统的增强版本。通常,更...

Linux 内核热补丁

linux 内核热补丁技术背景

update和upgrade的区别

  • Linux upgrade (升级)
    升级是软件的最新版本。升级的频率比更新的频率低,并且通常以软件的重大改进,新功能,增强的功能和其他明显的更改。通常考虑到比较大的变化和更高的性能,必须升级操作系统。
  • Linux update (更新)
    软件更新是补丁程序,并且可以充当您正在使用的系统的增强版本。通常,更新将解决可能导致先前版本中的问题。更新发生的次数比升级发生的次数要多得多,并且通常更着重于细微调整以改善用户体验或安全性,而不是进行任何重大的软件修改。

需求

客户对厂商提供linux服务都有安全补丁周期SLA的要求(一般是1个月到3个月),由于内核频繁的安全补丁并要求重启服务器,对Linux的SLA以及运维带来了很大的困难。

历史

2008年MIT的 JeffArnold 开发了 KSplice ,支持免重启(无数据结构修改的补丁)的内核安全补丁升级。 KSplice 2011年被Oracle收购,社区开始开发自己的热升级能力,2014年 Redhat推出了 Kpatch, SUSE推出了 Kgraft, 同一年CloudLinux推出了KernelCare。 Ubuntu在14.04以后也推出了Canonical Livepatch

主要项目

项目 厂商 简介 自动化程度 工作级别
KSplice Oracle linux社区第一个热补丁项目,后被Oracle收购 全自动 指令集
Kpatch RedHat 代码开源,但是需要RHEL的license才可以使用 管理员 函数
Kgraft SUSE 在企业版SELS中提供 管理员 函数
Canonical Livepatch Canonical 只在 Ubuntu Advantage Program中提供 全自动
KernelCare CloudLinux 支持所有发行版,按月按Server收费 全自动

这些项目的开源版本都有以下类似的信息:。。。

WARNING: Use with caution! Kernel crashes, spontaneous reboots, and data loss may occur!

方案原理

  • KSplice
    Ksplice的核心原理是做一个binary的diff,再把patch直接加载到内存中,这就需要为每个update写一个自定义的patch.


工作流:

  1. 为了准备对运行中的内核进行更改,Ksplice构建了两个内核树(第1阶段),在目标代码级别做diff (第2阶段),优化(第3阶段),打包(第4阶段) )。

  2. 为启用新功能,Ksplice尝试在旧功能起始为止添加蹦床跳跃,程序首先停止进程,并确保代码不使用线程。

  • Kpatch

    Kpatch工作在function级别,所以最基本的原理就是使用新的function替换旧的function,的主要组件包括:
  1. kpatch-build:将源差异补丁程序转换为热补丁程序模块的工具集合。它们的工作方式是在有或没有源补丁的情况下编译内核,比较二进制文件,并生成一个热补丁模块,其中包括要替换功能的新二进制版本。
  2. 热补丁模块:内核模块(.ko文件),其中包括替换功能和有关原始功能的元数据。
  3. kpatch核心模块:内核模块(.ko文件),为热补丁模块提供接口以注册新功能以进行替换。它使用内核ftrace子系统来挂钩原始函数的mcount调用指令,以便将对原始函数的调用重定向到替换函数。
  4. kpatch utility:命令行工具,允许用户管理热补丁模块的集合。可以将一个或多个热补丁模块配置为在引导时加载,这样,即使在重新引导到相同版本的内核之后,系统也可以保持修补状态
  • kgraft

与kpatch一样kgraft使用ftrace架构打补丁,主要实现方式如下:

  1. 为内核的一个函数打补丁,kGraft需要在当前函数前插入一个跳转到新的函数,这就需要一些内存空间,这个空间是在GCC编译功能打开的情况下由内核编译时分配的。实际效果就是一个5字节的调用指令被注入到内核函数的开始的位置。当内核正在引导时,性能分析调用将被替换为5字节的NOP(无操作)指令。
  2. patch动作执行时,第一个字节被INT3(断点)指令替换。这确保了5字节指令替换的原子性。其他四个字节由新函数的地址替换。最后,第一个字节被JMP(long jump)操作码代替。
  3. 在整个过程中使用处理器间不可屏蔽中断(IPI NMI)刷新系统中其他CPU的推测解码队列。这样就可以在不停止内核的情况下切换到新功能,即使是在很短的时间内也不会停止。IPI NMI的中断可以以微秒为单位进行度量,并且在任何情况下都不会在内核运行时将其视为服务中断。
  4. 调用者永远不会被打补丁。取而代之的是,调用者的NOP被新功能的JMP取代。JMP指令将永远保留。包括函数指针,包括结构中的指针,并且不需要保存任何旧数据就可以取消修补。
  5. 但是,仅靠这些步骤是不够的:由于将以非原子方式替换函数,因此内核某一部分中的新固定函数仍可以在其他位置调用旧函数,反之亦然。如果功能接口的语义在补丁程序中发生了变化,则会造成混乱。
    因此,在替换所有功能之前,kGraft使用基于蹦床的方法并且类似于RCU(读-复制-更新),以确保每个用户空间线程,内核线程和内核中断对的一致性。在每个内核entry和exit都设置一个基于线程的标志。这样,旧function将始终调用另一个旧功能,而新功能将始终调用新功能。一旦所有进程都设置了“ new Universe”标志,修补程序就可以完成,可以删除蹦床,并且除了每个修补函数的extra-long jump外代码可以全速运行而不会影响性能.

功能对比

功能 Ksplice Kgraft Kpatch Livepatch KernelCare
回滚 支持 支持 支持 支持 支持
防火墙友好 不支持 不支持 不支持 不支持 支持
离线更新 支持 不支持 不支持 不支持 支持
访问控制 支持 不支持 不支持 支持 支持
支持的发行版数量 2 1 4 1 9
定制内核 不支持 不支持 支持 不支持 支持

QEMU热升级

  • 主要修改了QEMU和linux内存管理子系统,新增cprsave 和cprload两个工具
  • 主业务流程:
  1. VM running with Old QEMU
  2. Update QEMU binary
  3. Pause Vm, save state and exec new QEMU (cprsave)
  4. Restore state and resume VM (cprload)
  5. VM running with new QEMU

参考

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。