鲲鹏社区首页
中文
注册
开发者
openEuler SysCare使用介绍

openEuler SysCare使用介绍

openEuler

发表于 2025/12/09

0

认识SysCare

简介

SysCare是一个操作系统热补丁服务,统一了操作系统内核态、用户态热补丁服务。为操作系统提供在线的热补丁修复能力,可以自动化、无感知地在线修复内核、用户态服务、动态库等系统基础组件bug和漏洞。

SysCare系统功能

SysCare提供补丁制作、补丁激活和补丁卸载等功能,支持内核热补丁、用户态热补丁制作和管理:

  1. 一键式补丁制作能力 目前SysCare统一内核热补丁和用户态热补丁的制作流程,提供一键制作补丁能力,对用户屏蔽制作补丁细节及用户态、内核态补丁制作差异。
  2. 补丁安装、激活、卸载 SysCare提供统一补丁管理接口,方便用户在补丁安装、激活、卸载查询使用。

SysCare系统技术

  1. SysCare归一化补丁制作,对用户屏蔽补丁制作的细节及差异,提供统一的补丁管理工具,提升运维效率。
  2. SysCare提供的用户态热补丁支持在用户态多进程/多线程业务热修复,具有修复简单的特点,能够提升运维效率;在进程/线程新拉起、重启均生效。
  3. 热补丁lazy机制,克服ptrace缺陷(需全部退出内核调用),提升修复成功率。

安装SysCare

本章介绍在openEuler中安装SysCare的方法。

安装SysCare核心组件

最低硬件要求

  • 2 CPU (x86_64 / aarch64)
  • 4GB RAM
  • 100GB 硬盘

前提条件

安装openEuler 25.03版本。

源码编译安装SysCare

SysCare源码已经归档至代码仓https://gitee.com/openeuler/syscare.git,用户可自行下载并编译安装。

SysCare在编译前需要安装依赖包,相关命令如下:

dnf install cmake make rust cargo kernel-devel elfutils-libelf-devel llvm clang bpftool libbpf libbpf-devel libbpf-static

示例如下:

git clone https://gitee.com/openeuler/syscare.git
cd syscare
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr -DKERNEL_VERSION=$(uname -r) ..
make
make install

repo安装SysCare

如果repo源中有SysCare相关的包,则可以通过dnf或yum命令进行下载、安装。

相关命令如下:

dnf install syscare syscare-kmod syscare-build syscare-build-ebpf

卸载SysCare

相关命令如下:

dnf erase syscare syscare-kmod syscare-build syscare-build-ebpf

使用SysCare

本章介绍在openEuler中使用SysCare的方法。

前提条件

安装openEuler 25.03版本。

SysCare使用

本章节将介绍 SysCare 的使用方法,包含热补丁制作及热补丁管理。

热补丁制作

用户可以使用syscare build命令制作热补丁,该命令为纯CLI工具,提供从RPM包生成热补丁包的功能,热补丁包以RPM包的形式封装维护,支持制作内核热补丁及用户态热补丁。

热补丁制作流程

  • 准备热补丁目标软件源码包(source rpm)及软件调试信息包(debuginfo rpm)。示例:
yumdownloader kernel --source --debuginfo
  • 确认满足对应软件编译依赖。示例:
dnf install make gcc bison flex openssl-devel dwarves python3-devel elfutils-libelf-devel
  • 执行syscare build命令构建热补丁。示例:
syscare build \
        --patch_name HP001 \
        --source kernel-5.10.0-60.66.0.91.oe2203.src.rpm \
        --debuginfo kernel-debuginfo-5.10.0-60.66.0.91.oe2203.x86_64.rpm \
        --output output \
        --patch 001-kernel-patch-test.patch
  • 热补丁制作过程将会在由--workdir参数所指定的目录中(默认为当前目录)创建以syscare-build开头的临时文件夹,用于存放临时文件及编译日志。示例:
dev@openeuler-dev:[~]$ ls -l syscare-build.111602/
total 100
-rw-r--r--. 1 dev dev 92303 Nov 12 00:00 build.log
drwxr-xr-x. 6 dev dev 4096 Nov 12 00:00 package
drwxr-xr-x. 4 dev dev 4096 Nov 12 00:00 patch

编译日志将会生成在临时文件夹中,名称为build.log。

dev@openeuler-dev:[~]$ cat syscare-build.111602/build.log | less

若补丁制作成功,且未指定--skip-compiler-check参数,将不会保留该临时文件夹。

  • 检查编译结果示例:
dev@openeuler-dev:[~]$ ls -l
total 189680
-rw-r--r--. 1 dev dev 194218767 Nov 12 00:00 kernel-5.10.0-60.91.0.115.oe2203-HP001-1-1.x86_64.src.rpm
-rw-r--r--. 1 dev dev     10937 Nov 12 00:00 patch-kernel-5.10.0-60.91.0.115.oe2203-HP001-1-1.x86_64.rpm

其中,patch-kernel-5.10.0-60.91.0.115.oe2203-HP001-1-1.x86_64.rpm为补丁包。kernel-5.10.0-60.91.0.115.oe2203-HP001-1-1.x86_64.src.rpm为二进制包。

热补丁制作工具

USAGE:
    syscare build [OPTIONS] --patch_name <PATCH_NAME> --source <SOURCE> --debuginfo <DEBUGINFO>... --patch <PATCH_FILES>...

OPTIONS:
    -n, --patch_name <PATCH_NAME>                  Patch name
        --patch_arch <PATCH_ARCH>                  Patch architecture [default: x86_64]
        --patch_version <PATCH_VERSION>            Patch version [default: 1]
        --patch_release <PATCH_RELEASE>            Patch release [default: 1]
        --patch_description <PATCH_DESCRIPTION>    Patch description [default: (none)]
    -s, --source <SOURCE>                          Source package
    -d, --debuginfo <DEBUGINFO>...                 Debuginfo package(s)
        --workdir <WORKDIR>                        Working directory [default: .]
    -o, --output <OUTPUT>                          Output directory [default: .]
    -j, --jobs <JOBS>                              Parllel build jobs [default: 96]
        --skip_compiler_check                      Skip compiler version check (not recommended)
        --skip_cleanup                             Skip post-build cleanup
    -v, --verbose                                  Provide more detailed info
    -p, --patch <PATCH_FILES>...                   Patch file(s)
    -h, --help                                     Prints help information
    -V, --version                                  Prints version information
名称 描述 类型 备注
-n, --patch_name <PATCH_NAME> 补丁名称 字符串 必选参数,需符合RPM命名规范
--patch_arch <PATCH_ARCH> 补丁架构 字符串 默认为当前架构,需符合RPM命名规范
--patch_version <PATCH_VERSION> 补丁版本号 字符串 默认值为1,需符合RPM命名规范
--patch_release <PATCH_RELEASE> 补丁release 数字 默认值为1,需符合RPM命名规范
--patch_description <PATCH_DESCRIPTION> 补丁描述 字符串 默认为(none)
-s, --source <SOURCE> 目标软件src.rpm源码包路径 字符串 必选参数,需为合法路径
-d, --debuginfo <DEBUGINFO>... 目标软件debuginfo包路径 字符串 必选参数,可指定多个,需为合法路径
--workdir <WORKDIR> 临时文件夹路径 字符串 默认为当前执行目录,需为合法路径
-o, --output <OUTPUT> 补丁输出文件夹 字符串 默认为当前执行目录,需为合法路径
-j, --jobs <JOBS> 并行编译线程数 数字 默认为cpu线程数
--skip-compiler-check 跳过编译器检查 标识 -
--skip-cleanup 跳过临时文件清理 标识 -
-v, --verbose 打印详细信息 标识 -
-p, --patch <PATCHES>... 补丁文件路径 字符串 必选参数,可指定多个,需为合法路径
-h, --help 打印帮助信息 标识 -
-V, --version 打印版本信息 标识 -

示例:

syscare build \
    --patch_name "HP001" \
    --patch_description "CVE-2021-32675 - When parsing an incoming Redis Standard Protocol (RESP) request, Redis allocates memory according to user-specified values which determine the number of elements (in the multi-bulk header) and size of each element (in the bulk header). An attacker delivering specially crafted requests over multiple connections can cause the server to allocate significant amount of memory. Because the same parsing mechanism is used to handle authentication requests, this vulnerability can also be exploited by unauthenticated users." \
    --source ./redis-6.2.5-1.src.rpm \
    --debuginfo ./redis-debuginfo-6.2.5-1.x86_64.rpm \
    --output ./output \
    --patch ./0001-Prevent-unauthenticated-client-from-easily-consuming.patch

热补丁包命名规则

  • 热补丁包:patch-目标软件全名-补丁名称-补丁版本-补丁release.架构名.rpm
  • 热补丁源码包:目标软件全名-补丁名称-补丁版本-补丁release.架构名.src.rpm

输出

  • 热补丁包:包含SysCare热补丁的二进制及元信息,用于热补丁安装。
  • 热补丁源码包:包含目标软件源码及新增补丁文件,用于新版本热补丁制作。

错误定位

如果热补丁制作过程出现错误,请参考位于工作目录下名称为build.log的编译日志。

示例:

Building patch, this may take a while
- Preparing build requirements
- Building patch
Error: UserPatchBuilder: Failed to build patch

Caused by:
    Process "/usr/libexec/syscare/upatch-build" exited unsuccessfully, exit_code=253
For more information, please check "/home/dev/syscare-build.345549/build.log"

热补丁包管理

热补丁的安装以及卸载需要提供对应rpm包的名称,下面使用$patch_package来指代rpm包名称。

  1. 热补丁包安装dnf install $patch_package.rpm热补丁包安装后,热补丁相关文件存放在如下路径:/usr/lib/syscare/patches
  2. 热补丁包卸载dnf remove $patch_package注:若热补丁处于ACTIVED以上状态时,热补丁将会被自动卸载。

热补丁管理

使用syscare命令可以对热补丁进行管理。

对单一热补丁操作前,用户需要提供一个字符串来搜索热补丁,后续使用$patch_identifier来指代这个字符串。

热补丁管理搜索规则为:目标包名/补丁名,其中“目标包名/”在补丁名唯一的情况下可以省略,也可使用UUID来进行管理。

  • 目标包名:待打入补丁的目标软件的软件包名称;
  • 补丁名:热补丁名称。

补丁元信息

补丁元信息中包含以下字段:

字段名称 字段描述
uuid 补丁ID
name 补丁名称
version 补丁版本
release 补丁Release
arch 补丁架构
type 补丁类型
target 目标软件名
entities 目标软件可执行文件名称
digest 补丁指纹
license 目标软件许可证
description 补丁描述
patch 补丁文件列表

示例:

sudo syscare info redis-6.2.5-1/HP002-1-1
uuid:        980fa0d0-e753-447c-8494-01de595f35d0
name:        HP002
version:     1
release:     1
arch:        x86_64
type:        UserPatch
target:      redis-6.2.5-1
target_elf:  redis-server, redis-benchmark, redis-cli
license:     BSD and MIT
description: CVE-2021-32675 - When parsing an incoming Redis Standard Protocol (RESP) request, Redis allocates memory according to user-specified values which determine the number of elements (in the multi-bulk header) and size of each element (in the bulk header). An attacker delivering specially crafted requests over multiple connections can cause the server to allocate significant amount of memory. Because the same parsing mechanism is used to handle authentication requests, this vulnerability can also be exploited by unauthenticated users.
patch:
0001-Prevent-unauthenticated-client-from-easily-consuming.patch

热补丁状态

SysCare将热补丁的生命周期分成如下状态:

  • 未加载:NOT-APPLIED
  • 未激活:DEACTIVED
  • 已激活:ACTIVED
  • 已接受:ACCEPTED

补丁信息查询

  1. 补丁基本信息查询:syscare info $patch_identifier
  2. 补丁状态查询:syscare status $patch_identifier
  3. 查询所有补丁状态:syscare list

热补丁状态管理

  1. 加载热补丁:syscare apply $patch_identifier
  2. 卸载热补丁:syscare remove $patch_identifier
  3. 激活热补丁:syscare active $patch_identifier
  4. 反激活热补丁:syscare deactive $patch_identifier
  5. 接受热补丁:syscare accept $patch_identifier
  6. 保存所有补丁状态:syscare save
  7. 恢复所有补丁状态:syscare restore

约束限制

版本约束

内核版本:当前SysCare支持openEuler 22.03 LTS SP1及以上版本。

硬件架构:x86_64 / aarch64。

应用约束

  1. 当前对LINE宏的处理需要对每个软件进行适配,当前仅考虑适配redis、nginx,其他未适配的软件可能会造成patch的size过大。后续会考虑引入参数支持用户自行适配。
  2. 用户态热补丁对于一个ELF文件,只支持一个补丁,如需修复多个bug,可将多个bugfix的patch文件同时传入补丁制作参数中,可制作出修复多个bug的热补丁。

语言约束

原理上补丁制作在object file一级进行比较,与编程语言无关。 当前仅测试了C / C++语言。

其他约束

  • 当前仅支持64位系统;
  • 当前仅支持ELF格式的热修复,暂不支持解释型语言;
  • 当前仅支持gcc / g++编译器;
  • 编译器需要支持-gdwarf-ffunction-sections-fdata-sections参数;
  • 仅支持DWARF格式的调试信息;
  • 暂不支持交叉编译;
  • 暂无法识别文件名相同,并且局部变量和函数名称完全一致的不同路径源码文件;
  • 暂不支持汇编修改(包括.S文件及内联汇编);
  • 暂不支持新增外部符号(动态库依赖);
  • 暂不支持对同一个二进制打多个补丁;
  • 暂不支持C & C++ 混合编译;
  • 暂不支持C++ exception修改;
  • 暂不支持group section: -g3编译选项,特定编译优化选项,特定gcc plugin等;
  • 暂不支持新增ifunc: __attribute__((ifunc("foo")))
  • 暂不支持新增TLS变量: __thread int foo

本页内容