目录
目录README.md

热补丁依赖识别及加载优化

目录结构

kpatch-0.9.5: kpatch源码目录
syscare-1.2.1: syscare源码目录
test: 测试脚本
report.pdf: 本团队解题报告

Build

Prepare

  1. 版本说明

OS: openEuler-22.03-LTS-SP3-x86_64, https://repo.openeuler.org/openEuler-22.03-LTS-SP3/virtual_machine_img/x86_64/ kpatch:https://gitee.com/src-openeuler/kpatch/tree/openEuler-22.03-LTS-SP3/ syscare:https://gitee.com/src-openeuler/syscare/commits/openEuler-22.03-LTS-SP3 commit:ee9a0e3756acb894bd3e0f3db69b4b8d7503132f

  1. 根据制品仓说明首先安装kpatch与syscare

大部分依赖可在此步骤安装完成

kpatch

dnf upgrade --exclude=kernel
dnf install -y make gcc patch bison flex openssl-devel kpatch kpatch-runtime
dnf install -y kernel-source-`uname -r` kernel-debuginfo-`uname -r` kernel-devel-`uname -r`
dnf install -y git rpm-build elfutils-libelf-devel gdb-headless
git clone https://gitee.com/src-openeuler/kpatch.git
mkdir -p ~/rpmbuild/SOURCES/
/bin/cp kpatch/* ~/rpmbuild/SOURCES/
rpmbuild -ba kpatch/kpatch.spec
rpm -Uvh ~/rpmbuild/RPMS/`arch`/kpatch*.rpm
rpm -Uvh ~/rpmbuild/RPMS/noarch/kpatch*.rpm

syscare

dnf install syscare
  1. 安装额外依赖
dnf install -y dwarves python3-devel cmake g++ elfutils elfutils-devel bpftool clang
  1. 安装rust与cargo环境(本工具开发测试版本为rust 1.74、cargo 1.74)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
export PATH=$PATH:$HOME/.cargo/bin
  1. clone本仓库

Kpatch build

cd kpatch-0.9.5
make 
sudo make install

Syscare build

cd syscare-1.2.1
cargo install libbpf-cargo
mkdir tmp
cd tmp
cmake -DCMAKE_INSTALL_PREFIX=/usr -DKERNEL_VERSION=$(uname -r) ..
make 
make install
systemctl daemon-reload
systemctl restart syscare

Test

Task 1: 热补丁依赖元数据补充

cd test
sh task1.sh

Task 2: 热补丁缺失依赖识别

cd test
sh task2.sh

Task 3: 热补丁自加载

cd test
sh task3.sh

题目和提交说明(原)

作品完成和提交方式:选择本赛题的参赛队伍需要首先复刻(Fork)本项目,然后在复刻的项目中添加参赛队员、合作完成作品开发即可,无需提交PR到赛题项目。如果作品为文档形式,也请将作品文档提交到项目代码库中。在作品完成过程中,围绕作品的相关讨论等可以以疑修(Issue)形式发布和讨论,也可使用里程碑对整个任务进行规划管理。

1. 赛题说明

内核热补丁是系统运行时对内核进行修改的一种技术。与传统的内核冷补丁不同,内核热补丁不需要重新编译内核,也不需要重启系统,可以在不停机的情况下实现对内核的修改和更新。内核热补丁技术的实现原理是通过在内核中插入一段代码,这段代码可以在内核运行时被执行,从而实现对内核的修改。这种技术可以用于修复内核中的漏洞,增加新的功能或者改进内核性能等方面。 openEuler使用了kpatch内核热补丁技术,并在其上使用自研syscare技术进行封装,实现用户态、内核态热补丁的统一管理。然而,内核热补丁往往依赖了部分内核模块,导致加载时缺依赖报错。如何及早识别内核热补丁的依赖,并结合syscare实现依赖满足时的自动加载呢? 在这个赛题中,参赛者需基于openEuler 22.03-LTS-SP3分支的kpatch和syscare代码进行设计开发,实现内核热补丁依赖识别与加载过程的优化。

2. 赛题要求

1)热补丁依赖元数据补充 参赛者需基于kpatch原有代码,在热补丁ko生成时将依赖信息注入其元数据中,使用户可以通过modinfo直接看到热补丁所需依赖,而非只能查看制作日志或激活后再通过livepatch -q进行查看。 2)热补丁缺失依赖识别 完成任务1后,参赛者需基于syscare原有代码进行优化,在热补丁加载前添加检查逻辑,通过热补丁ko的依赖信息提前判断当前依赖是否满足。若依赖不满足,则在终端界面提示缺失的所有依赖。 3)热补丁自加载 完成上两点后,参赛者需设计一套机制,监控热补丁依赖的内核模块的加载状态,当所有依赖满足时,自动加载满足条件的热补丁。这样既实现了热补丁的自动加载,又不会在加载时额外加载依赖,导致系统行为发生变化。 注意: a)参赛者无需修改现有热补丁状态机,依赖不满足的待加载热补丁可置为已激活。 b)不推荐使用额外进程或线程的形式轮询监测内核模块列表。 c)系统开销应尽可能低,在x86环境,22.03-LTS-SP3的openEuler操作系统上,cpu使用率小于1%

3. 赛题导师

zhuyuncheng@huawei.com; xiaobo.liu@huawei.com

4. 参考资料

1)kpatch制品仓及使用文档(https://gitee.com/src-openeuler/kpatch/tree/openEuler-22.03-LTS-SP3/) 2)syscare制品仓(https://gitee.com/src-openeuler/syscare/tree/openEuler-22.03-LTS-SP3/) 3)syscare使用文档 (https://gitee.com/openeuler/syscare)

关于
2.7 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

©Copyright 2023 CCF 开源发展委员会
Powered by Trustie& IntelliDE 京ICP备13000930号