实时内核修补如何工作?

实时内核修补如何工作?

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

答案1

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

实时补丁始于制作补丁来更改特定的内核功能。可以使用类似以下工具制作补丁:kpatch-build。结果是一个内核模块,然后交付。当加载此模块时,它确保使用特定系统调用的进程正在使用其修补版本。

有三个内核特性使得修补方式成为可能。

  • 探测

    Kprobes 或内核探测器是开发人员用来评估 Linux 内核并执行调试的功能。Kprobes 使开发人员能够在许多代码地址中断内核例程。这称为断点,使开发人员能够采取一些行动,例如运行一组新的指令。

  • 追踪

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

  • 实时补丁

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

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

  1. 登记:

    每个补丁必须先使用以下方式注册注册补丁(klp_register_patch)。这使实时补丁框架知道该补丁。经过一些初步的计算和检查后,该补丁被纳入已知补丁列表。修补函数的地址可通过其名称找到。应用“新功能”部分中引用的特殊重定位。适用部分如下/sys/内核/livepatch/. 当任何操作失败时,补丁将被解除。

  2. 启用:

    可以通过调用以下方法启用已注册的补丁启用补丁() 或者将‘1’写入/sys/kernel/livepatch//已启用。系统将在此阶段开始使用修补函数的新实现。具体而言,如果原始函数是第一次修补,则特定于函数的结构体_klp_ops已创建并且已注册 Ftrace 处理程序。

  3. 禁用:

    可以通过以下方式禁用已启用的补丁:禁用补丁(klp_disable_patch) 或将‘0’写入/sys/kernel/livepatch//已启用。在此阶段,要么使用最近启用的补丁中的代码,要么甚至使用原始代码。必须按照启用补丁的相反顺序禁用补丁。这使得处理问题和使用变得简单得多。

  4. 取消注册:

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

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

cat /boot/config-$(uname - r) | grep LIVEPATCH

答案2

简而言之,v4.0 内核引入了实时修补功能,Ubuntu 16.04 有一个能够使用此功能的内核。它的工作原理是使用ftrace将内核函数调用重定向到新修补的函数。此外,还使用挂钩模块插入和移除的机制来修补可加载模块。此功能还具有系统文件系统用于跟踪应用了哪些补丁以及它们修改了哪些功能的目录。

最简单的可视化方法是将实时修补视为一种动态函数替换的形式,同时通过 sysfs 上的条目跟踪引入了哪些补丁来实现此更改。

相关内容