跳到内容跳到页面导航:上一页 [access key p]/下一页 [access key n]
documentation.suse.com / SUSE Linux Enterprise Server 文档 / 管理指南 / 常用任务 / 用户空间在线增补
适用范围 SUSE Linux Enterprise Server 15 SP4

12 用户空间在线增补

本文档介绍用户空间在线增补的基本原理和用法。

12.1 关于用户空间在线增补

用户空间在线增补 (ULP) 是指在不中断正在运行的进程的情况下将补丁应用到该进程所使用的库的过程。在线增补操作使用作为 libpulp 的一部分的 ulp 工具来执行。

libpulp 是可实现用户空间在线增补的框架。它由 libpulp.so 库和用于使库可在线增补以及应用在线补丁的工具(ulp 二进制文件)组成。

12.1.1 先决条件

要使 ULP 正常工作,必须满足两个要求。

  • 要使库可在线增补,必须使用 -fpatchable-function-entry GCC 标志编译库。不需要更改库源代码。

  • 进程必须预装载 libpulp.so 库。

12.1.2 使用 libpulp

要对应用程序使用 libpulp,必须执行以下步骤:

  1. 使库可在线增补。

  2. 启动应用程序时,使用以下命令预装载 libpulpLD_PRELOAD=/usr/lib64/libpulp.so ./APPLICATION

12.1.2.1 准备可在线增补的库

为了使库能够在线增补,它必须在所有函数调用中包含 NOP 序言。GCC 版本 8 及更高版本以及 SUSE Linux Enterprise Server 随附的 GCC 版本专门为此提供了 -fpatchable-function-entry。因此,在 AMD64/Intel 64 体系结构上,使用 -fpatchable-function-entry=16,14 标志编译一个用 C 编写的库就足以使该库可在线增补。

Glibc、libssl.so.1.1 和 libcrypto.so.1.1 库原本就可在 SUSE Linux Enterprise 15 SP4 上在线增补。

12.1.2.2 检查库是否可在线增补

要检查库是否可在线增补,请使用以下命令:

ulp livepatchable LIBRARY

12.1.2.3 应用在线补丁

可以使用 ulp trigger 命令应用在线补丁,例如:

ulp trigger -p PID LIVEPATCH.ulp

在此示例中,PID 是正在运行的进程的 PID,该进程使用的库要进行增补,LIVEPATCH.ulp 是实际的在线补丁文件。

live patching succeeded 消息表示在线增补操作成功。

12.1.2.4 还原在线补丁

ulp trigger 可用于还原在线补丁。可以通过两种方法还原在线补丁。您可以通过应用相应的 .rev 补丁来还原在线补丁:

ulp trigger -p PID LIVEPATCH.rev

或者,可以去除与特定库关联的所有补丁。例如:

ulp trigger -p PID --revert-all=LIBRARY

在上面的示例中,LIBRARY 指的是实际的库,例如:libcrypto.so.1.1

当原始在线补丁的源代码不可用时,或者当您希望去除特定的旧补丁并应用新补丁,但又不想让目标应用程序运行可能不安全的代码时,后一种方法可能很有用。例如:

ulp trigger -p PID  --revert-all=libcrypto.so.1.1 new_livepatch2.ulp

12.2 更多信息

项目的 Git 软件源中提供了有关 libpulp 的更多信息。