实时内核补丁如何工作?

3 kernel

如果内核一直被 Ubuntu 使用,如何在不重启的情况下修改它?

小智 6

服务器或 HPC(高性能计算)旨在以 24x7x365 的方式运行,但是由于基本安全更新或操作系统更新,它们必须重新启动才能应用更改。Linux 内核实时修补可解决此问题并避免重新启动。

实时修补从制作补丁以更改特定内核功能开始。可以使用kpatch-build 之类的工具制作补丁。结果是内核模块,然后交付。在加载此模块时,它保证使用特定系统调用的进程正在使用其修补形式。

有三个内核特性使打补丁成为可能。

  • 探针

    Kprobes 或内核探针是开发人员用来评估 Linux 内核和执行调试的功能。Kprobes 使开发人员能够在许多代码地址处进入内核例程。这称为断点,使开发人员能够进行一些操作,例如,运行一组新指令。

  • 跟踪

    以下元素称为函数跟踪器或 Ftrace。这是一个惊人而强大的框架,可以衡量内核中的多个方面,例如事件和中断。例如,它可以测量写入磁盘等特定功能的延迟。

  • 实时补丁

    Livepatch 是第三个部分。它同样是内核的最新扩展。使用自定义 Ftrace 处理程序,它可以重定向例程并跳转到一组修补过的指令。

实时补丁包括定义每个实时补丁生命周期的四个基本操作。

  1. 登记:

    每个补丁必须首先使用klp_register_patch()进行注册。这使实时补丁框架知道补丁。经过一些初步的计算和检查,补丁被包含在已知补丁列表中。修补函数的地址可以通过它们的名称找到。应用了“新功能”部分中引用的特殊重定位。适用的部分位于/sys/kernel/livepatch/ 下。当任何操作失败时,补丁将被解除。

  2. 启用:

    可以通过调用klp_enable_patch() 或通过将“1”写入/sys/kernel/livepatch//enabled来启用已注册的补丁。在此阶段,系统将开始使用修补功能的新实现。具体来说,如果第一次修补原始函数,则会创建特定函数的struct_klp_ops并注册 Ftrace 处理程序。

  3. 禁用:

    可以通过调用klp_disable_patch() 或将“0”写入/sys/kernel/livepatch//enabled来禁用启用的补丁。在这个阶段,要么使用最近启用的补丁中的代码,要么使用原始代码。必须以与启用补丁相反的顺序禁用补丁。它使处理问题和使用变得更加简单。

  4. 注销:

    可以通过调用klp_unregister_patch()取消注册已禁用的补丁 。仅当补丁被禁用并且代码不再使用时,这应该是可能的。必须在卸载实时补丁模块之前调用它。

要检查是否启用了实时补丁功能,请运行以下命令:

cat /boot/config-$(uname - r) | grep LIVEPATCH
Run Code Online (Sandbox Code Playgroud)