使用SysCare
本章介绍在openEuler中使用SysCare的方法
前提条件
安装openEuler 22.03 LTS SP1版本
SysCare cli使用
介绍SysCare cli使用方法,使用SysCare build cli制作补丁,使用SysCare patch cli管理补丁,包括安装、激活、去激活、卸载补丁。
补丁制作
介绍SysCare build补丁制作功能,示例如下:
syscare-build --name redis_cve_2021_32675 \
--source redis-6.2.5-1.src.rpm \
--debuginfo redis-debuginfo-6.2.5-1.x86_64.rpm \
--target-elfname redis-server \
--summary CVE-2021-32675 \
0001-Prevent-unauthenticated-client-from-easily-consuming.patch
补丁管理
patch-name格式为:目标包名/补丁名,其中“目标包名/”在补丁名唯一的情况下可以省略
- 补丁安装:
syscare apply patch-name
- 补丁激活:
syscare active patch-name
- 补丁去激活:
syscarae deactive patch-name
- 补丁卸载/移除:
syscare remove patch-name
- 补丁状态查询:
syscare status patch-name
- 查询syscare所有补丁:
syscare list
补丁制作模块
源码编译
syscare/build目录下存放的是SysCare补丁制作的源码
cd syscare/build
cargo build
补丁制作
SysCare 补丁制作工具
SysCare build为纯CLI工具,提供从RPM包生成热补丁包的功能,补丁包以RPM包的形式封装维护,支持制作内核热补丁及用户态热补丁。
命令行参数
usage: syscare build [OPTIONS] --patch-name <PATCH_NAME> --source <SOURCE> --debuginfo <DEBUGINFO> <PATCHES>...
Arguments:
<PATCHES>... Patch file(s)
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-description <PATCH_DESCRIPTION> Patch description [default: (none)]
--target-name <TARGET_NAME> Patch target name
-t, --target-elfname <TARGET_ELFNAME> Patch target executable name
--target-arch <TARGET_ARCH> parch target architecture
--target-epoch <TARGET_EPOCH> Patch target epoch
--target-version <TARGET_VERSION> Patch target version
--target-release <TARGET_RELEASE> Patch target release
--target-license <TARGET_LICENSE> Patch target license
-s, --source <SOURCE> Source package
-d, --debuginfo <DEBUGINFO> Debuginfo package
--workdir <WORKDIR> Working directory [default: .]
-o, --output <OUTPUT> Generated patch output directory [default: .]
--kjobs <N> Kernel make jobs [default: 32]
--skip-compiler-check Skip compiler version check (not recommended)
--skip-cleanup Skip post-build cleanup
-v, --verbose Provide more detailed info
-h, --help Print help information
-V, --version Print version information
必要参数:
字段名称 | 字段描述 |
---|---|
--patch-name | 补丁名称 |
--source | 目标软件源码包 |
--debuginfo | 目标软件调试信息包 |
--target-elfname | 目标软件可执行文件名(内核补丁可忽略) |
--PATCHES | 补丁列表 |
示例如下:
syscare-build \
--patch-name CVE-2021-32675 \
--source redis-6.2.5-1.src.rpm \
--debuginfo redis-debuginfo-6.2.5-1.x86_64.rpm \
--target-elfname redis-server \
--output output \
0001-Prevent-unauthenticated-client-from-easily-consuming.patch
输出
- 补丁包:包含SysCare热补丁的二进制及元信息,用于热补丁安装。
- 补丁源码包:包含目标软件源码及新增补丁,用于新版本热补丁制作。
命名规则:
- 补丁包:patch-目标软件全名-补丁名称-补丁版本-补丁release.架构名.rpm
- 补丁源码包:目标软件全名.patched.补丁名称.补丁版本.补丁release.src.rpm
补丁信息
补丁元信息中包含以下字段:
字段名称 | 字段描述 |
---|---|
name | 补丁名称 |
type | 补丁类型 |
arch | 补丁架构 |
target | 目标软件名 |
elf_name | 目标软件可执行文件名称 |
license | 目标软件许可证 |
version | 补丁版本 |
release | 补丁Release |
description | 补丁描述 |
builder | 补丁制作工具版本 |
示例:
Collecting patch info
------------------------------
name: CVE-2021-32675
type: UserPatch
target: redis-6.2.5-1
elf_name: redis-server
license: BSD and MIT
version: 1
release: 31fc7544
description: None
patch list:
0001-Prevent-unauthenticated-client-from-easily-consuming.patch 31fc7544
------------------------------
补丁制作流程
准备补丁目标软件源码包(source rpm)及软件调试信息包(debuginfo rpm)
示例:
yumdownloader kernel --source yumdownloader kernel --debuginfo
确认满足对应软件编译依赖
示例:
dnf install make gcc bison flex openssl-devel dwarves python3-devel elfutils-libelf-devel
执行SysCare build命令
示例:
syscare-build \ --patch-name kernel_version \ --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 \ 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 ...
若补丁制作成功,将自动删除该临时文件夹。
检查编译结果
示例:
dev@openeuler-dev:[~]$ ls -l total 189680 -rw-r--r--. 1 dev dev 194218767 Nov 12 00:00 kernel-5.10.0-60.66.0.91.oe2203.patched.kernel_version.1.c15c1a6a.src.rpm -rw-r--r--. 1 dev dev 10937 Nov 12 00:00 patch-kernel-5.10.0-60.66.0.91.oe2203-kernel_version-1-c15c1a6a.x86_64.rpm
其中
patch-kernel-5.10.0-60.66.0.91.oe2203-kernel_version-1-c15c1a6a.x86_64.rpm为补丁包
kernel-5.10.0-60.66.0.91.oe2203.patched.kernel_version.1.c15c1a6a.src.rpm为二进制包
补丁包安装
rpm -ivh patch-xxx.rpm
补丁包安装后,相关文件在如下路径:
/usr/lib/syscare/patches/目标软件包名/补丁名
补丁包卸载
rpm -e patch-xxx.rpm
补丁在not-apply状态下,补丁包才可卸载
错误处理
如果出现错误,请参考编译日志:
错误示例:
...
Building patch, this may take a while
ERROR: Process '/usr/libexec/syscare/upatch-build' exited unsuccessfully, exit_code=255