From 2784f5056b74afa8b8caf085fe10ec2a91110978 Mon Sep 17 00:00:00 2001 From: anatasluo Date: Sun, 24 Apr 2022 09:30:23 +0000 Subject: [PATCH 1/2] kpatch-build: add support for openEuler As I noticed, commit eaaced191 has added partial support for openEuler. This patch enables usage in openEuler like: kpatch-build xxxx.patch I test it in openEuler 21.09, for people who want to use kpatch in openEuler, two more steps are needed. 1) add repo source source rpm package of openEuler kernel are put in two places. One is https://repo.openeuler.org/openEuler-21.09/source/ Another one is https://repo.openeuler.org/openEuler-21.09/update/source/ The latter one is not inclued in rpm repo lists by default. 2) compile kernel with CONFIG_LIVEPATCH_PER_TASK_CONSISTENCY enabled openEuler has its own strategy when trying to apply patches. We can use the klp_enable_patch function only when CONFIG_LIVEPATCH_PER_TASK_CONSISTENCY is enabled. Signed-off-by: anatasluo --- kpatch-build/kpatch-build | 25 +++++++++++++++++++++---- test/integration/lib.sh | 13 +++++++++++++ 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/kpatch-build/kpatch-build b/kpatch-build/kpatch-build index 634095d..5cd292f 100755 --- a/kpatch-build/kpatch-build +++ b/kpatch-build/kpatch-build @@ -750,9 +750,13 @@ elif [[ -e "$KERNEL_SRCDIR"/.config ]] && [[ -e "$VERSIONFILE" ]] && [[ "$(cat " echo "Using cache at $KERNEL_SRCDIR" else - if [[ "$DISTRO" = fedora ]] || [[ "$DISTRO" = rhel ]] || [[ "$DISTRO" = ol ]] || [[ "$DISTRO" = centos ]]; then + if [[ "$DISTRO" = fedora ]] || [[ "$DISTRO" = rhel ]] || [[ "$DISTRO" = ol ]] || [[ "$DISTRO" = centos ]] || [[ "$DISTRO" = openEuler ]]; then - echo "Fedora/Red Hat distribution detected" + [[ "$DISTRO" = fedora ]] && echo "Fedora distribution detected" + [[ "$DISTRO" = rhel ]] && echo "RHEL distribution detected" + [[ "$DISTRO" = ol ]] && echo "Oracle Linux distribution detected" + [[ "$DISTRO" = centos ]] && echo "CentOS distribution detected" + [[ "$DISTRO" = openEuler ]] && echo "OpenEuler distribution detected" clean_cache @@ -773,7 +777,13 @@ else rpmbuild -D "_topdir $RPMTOPDIR" -bp --nodeps "--target=$(uname -m)" "$RPMTOPDIR"/SPECS/kernel$ALT.spec 2>&1 | logger || die "rpmbuild -bp failed. you may need to run 'yum-builddep kernel' first." - mv "$RPMTOPDIR"/BUILD/kernel-*/linux-* "$KERNEL_SRCDIR" 2>&1 | logger || die + if [[ "$DISTRO" = openEuler ]]; then + # openEuler has two directories with the same content after 'rpm -D' + # openEuler 21.09 has linux-* and linux-*-source while openEuler 20.03 has linux-* and linux-*-Source + mv "$RPMTOPDIR"/BUILD/kernel-*/linux-*[sS]ource "$KERNEL_SRCDIR" 2>&1 | logger || die + else + mv "$RPMTOPDIR"/BUILD/kernel-*/linux-* "$KERNEL_SRCDIR" 2>&1 | logger || die + fi rm -rf "$RPMTOPDIR" rm -rf "$KERNEL_SRCDIR/.git" @@ -783,7 +793,11 @@ else echo "$ARCHVERSION" > "$VERSIONFILE" || die - [[ -z "$CONFIGFILE" ]] && CONFIGFILE="$KERNEL_SRCDIR/configs/kernel$ALT-$KVER-$ARCH.config" + if [[ "$DISTRO" = openEuler ]]; then + [[ -z "$CONFIGFILE" ]] && CONFIGFILE="/boot/config-${ARCHVERSION}" + else + [[ -z "$CONFIGFILE" ]] && CONFIGFILE="$KERNEL_SRCDIR/configs/kernel$ALT-$KVER-$ARCH.config" + fi (cd "$KERNEL_SRCDIR" && make mrproper 2>&1 | logger) || die @@ -841,6 +855,9 @@ fi # shellcheck disable=SC1090 source "$CONFIGFILE" +[[ "$DISTRO" = openEuler ]] && [[ -z "$CONFIG_LIVEPATCH_PER_TASK_CONSISTENCY" ]] && \ + die "openEuler kernel doesn't have 'CONFIG_LIVEPATCH_PER_TASK_CONSISTENCY' enabled" + [[ -z "$CONFIG_DEBUG_INFO" ]] && die "kernel doesn't have 'CONFIG_DEBUG_INFO' enabled" # Build variables - Set some defaults, then adjust features diff --git a/test/integration/lib.sh b/test/integration/lib.sh index aff7c6e..f181149 100644 --- a/test/integration/lib.sh +++ b/test/integration/lib.sh @@ -116,6 +116,19 @@ kpatch_centos_dependencies() sudo yum remove -y epel-release } +kpatch_openEuler_dependencies() +{ + local kernel_version + local arch + kernel_version=$(uname -r) + arch=$(uname -m) + + sudo yum install -y make gcc patch bison flex openssl-devel dwarves \ + rpm-build dnf-plugins-core python3-devel openssl-devel ncurses-devel elfutils-libelf-devel + sudo yum install -y "kernel-source-${kernel_version%.*}" \ + "kernel-debuginfo-${kernel_version%.*}" "kernel-devel-${kernel_version%.*}" +} + kpatch_dependencies() { # shellcheck disable=SC1091 From e68008756767ca857cae5835c18376eb5aa9173b Mon Sep 17 00:00:00 2001 From: anatasluo Date: Mon, 2 May 2022 15:07:52 +0800 Subject: [PATCH 2/2] doc/install.md: add instructions for openEuler Signed-off-by: anatasluo --- doc/INSTALL.md | 110 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/doc/INSTALL.md b/doc/INSTALL.md index 73f7437..4c6dbd5 100644 --- a/doc/INSTALL.md +++ b/doc/INSTALL.md @@ -12,6 +12,7 @@ Table of contents - [Debian 8 (Jessie)](#debian-8-jessie) - [Debian 7 (Lenny)](#debian-7-lenny) - [Gentoo](#gentoo) + - [OpenEuler](#openeuler) - [Build](#build) - [Install](#install) @@ -187,6 +188,115 @@ Configure ccache: ccache --max-size=5G ``` +### OpenEuler + +*ATTENTION: openEuler maintains its own version of kpatch which work with its +own kernel. You can check this [link](https://gitee.com/src-openeuler/kpatch) +to see its documents. This document describes how to run mainline kpatch in openEuler.* + +*NOTE: You'll need about 15GB of free disk space for the kpatch-build cache in +`~/.kpatch` and for ccache.* + +Install the dependencies for compiling kpatch and running kpatch-build: + +```bash +source test/integration/lib.sh +# Will request root privileges +kpatch_dependencies +``` + +Before running kpatch-build, two more things need to be checked: +------- +1. Ensure current kernel compiled with *CONFIG_LIVEPATCH_PER_TASK_CONSISTENCY* set + + openEuler has two strategies to apply kernel live patches and it is decided at compile time. + + When CONFIG_LIVEPATCH_STOP_MACHINE_CONSISTENCY set, openEuler uses its own strategy. + + When CONFIG_LIVEPATCH_PER_TASK_CONSISTENCY set, openEuler uses the conventional strategy. + + Only one config option can take effect at the same time. + A [chinese blog](https://www.modb.pro/db/232858) written by the openEuler official describes + their modifications for kernel livepatch. The main difference is CONFIG_LIVEPATCH_STOP_MACHINE_CONSISTENCY + will disable the usage of ftrace handler in livepatch, they believe it will be faster. + + Check whether your current kernel compiled with *CONFIG_LIVEPATCH_PER_TASK_CONSISTENCY* + ```bash + grep "CONFIG_LIVEPATCH_PER_TASK_CONSISTENCY" /boot/config-$(uname -r) + ``` + + If you see any output, it means your kernel satisfies, you can go directly to check step 2. + + If not, then you need to recompile your current kernel with CONFIG_LIVEPATCH_PER_TASK_CONSISTENCY set. + + You can reference the following steps to recompile the kernel if needed + 1. download source code of the current kernel + ```bash + # set working directories + TEMPDIR=~/.tmp + mkdir -p $TEMPDIR + mkdir -p $TEMPDIR/buildroot + + # download kernel source rpm package + yumdownloader --source --destdir "$TEMPDIR" kernel-$(uname -r) + + # obtain source code from package + rpm -D "_topdir $TEMPDIR/buildroot" -ivh $TEMPDIR/kernel-*.src.rpm + rpmbuild -D "_topdir $TEMPDIR/buildroot" -bp --nodeps --target=$(uname -m) $TEMPDIR/buildroot/SPECS/kernel.spec + + # check source code and copy config file + cd $TEMPDIR/buildroot/BUILD/kernel-*/linux-*[sS]ource + cp /boot/config-$(uname -r) .config + ``` + + 2. set CONFIG_LIVEPATCH_PER_TASK_CONSISTENCY + ```bash + make menuconfig + ``` + select order + + -> Processor type and features + -> Enable Livepatch + -> Kernel Live Patching + -> live patching method + + choose + > based on ftrace + + After this step, you shoud see CONFIG_LIVEPATCH_PER_TASK_CONSISTENCY in .config file + + 3. recompile kernel and install it to your running environment. + + Just to remind, after installing the recompiled kernel, the config file should also be updated. + + +2. Ensure */update/source* is in the rpm repo lists + + openEuler releases its source rpm package of the kernel in two places. + + One is /source and it is included in rpm repo lists by default. + + One is /update/source and it may not be included it in some release versions. + + ```bash + grep "/update/source" /etc/yum.repos.d/openEuler.repo + ``` + + If you can't see any output, add it to the end of /etc/yum.repos.d/openEuler.repo + + For example, if you use openEuler 21.09, you will add something like: + ``` + [update-source] + name=update-source + baseurl=https://repo.openeuler.org/openEuler-21.09/update/source/ + enabled=1 + gpgcheck=0 + ``` + + *baseurl* is releated with your release version, be careful please! + + Goto [openEuler repo](https://repo.openeuler.org/), find your own suitable baseurl. + Build -----