Alibaba Cloud Linux 2(原Aliyun Linux 2)内核热补丁功能介绍

简介: 本文介绍如何在 Alibaba Cloud Linux 2 上使用内核热补丁 (Kernel Live Patching) 功能。

本文介绍如何在 Alibaba Cloud Linux 2 上使用内核热补丁 (Kernel Live Patching) 功能。

1. 准备工作

1.1 内核版本

首先要确认当前运行的内核版本。在操作系统内部运行下列命令:

uname -r
4.19.57-15.1.al7.x86_64

1.2 安装依赖包和内核相关工具

sudo yum install -y alinux-release-source alinux-release-kernels
sudo yum install -y yum-utils
sudo debuginfo-install -y kernel-$(uname -r) # 安装 Debuginfo 包
sudo yum install -y kpatch pesign zlib-devel \
  binutils-devel newt-devel python-devel perl-ExtUtils-Embed \
  audit-libs audit-libs-devel numactl-devel pciutils-devel bison patchutils \
  kernel-devel-$(uname -r) # 安装依赖工具
sudo yum-builddep -y kernel-$(uname -r) # 检查 build 内核的时候的依赖

1.3 安装 kpatch-build

要想制作热补丁,需要用到一个还没有放进 YUM 源的工具 kpatch-build,需要从 GitHub 上获取源码。运行下列命令获取代码,并进行编译:

sudo yum install -y git
git clone https://github.com/dynup/kpatch.git
cd kpatch
make

1.4 准备内核源码

sudo yumdownloader --source kernel-$(uname -r) #安装内核源码
export VRDA=$(uname -r)
rpm -ivh kernel-${VRDA/x86_64/src}.rpm
rpmbuild --without debug \
    --without doc \
    --without perf \
    --without tools \
    --without bpftool \
    --without debuginfo \
    -bp ~/rpmbuild/SPECS/kernel.spec
export SourceDir=$(ls -d ~/rpmbuild/BUILD/kernel-${VRDA/-*/}/linux-*)
cp ~/rpmbuild/SOURCES/modsign_alinux.pem $SourceDir/certs
cp ~/rpmbuild/SOURCES/x509.genkey $SourceDir/certs
sed -i "s/CONFIG_LOCALVERSION=.*/CONFIG_LOCALVERSION=\"${VRDA/*-/-}\"/" $SourceDir/.config

2. 准备需要进行热补丁的补丁文件

请根据实际情况准备热补丁文件,一般来说从内核源码的 Git 树中获取的补丁文件就可以使用,但是不是所有补丁文件都可以用来制作热补丁,请确保事先对于热补丁的使用范围与限制有充分的了解,否则可能会出现不仅限于操作系统宕机等严重问题。

这里是一个样例补丁文件:

diff --git a/fs/proc/meminfo.c b/fs/proc/meminfo.c
index edda898..8a4a686 100644
--- a/fs/proc/meminfo.c
+++ b/fs/proc/meminfo.c
@@ -121,7 +121,7 @@ static int meminfo_proc_show(struct seq_file *m, void *v)
        seq_printf(m, "VmallocTotal:   %8lu kB\n",
                   (unsigned long)VMALLOC_TOTAL >> 10);
        show_val_kb(m, "VmallocUsed:    ", 0ul);
-       show_val_kb(m, "VmallocChunk:   ", 0ul);
+       show_val_kb(m, "VMALLOCCHUNK:   ", 0ul);
        show_val_kb(m, "Percpu:         ", pcpu_nr_pages());

注意补丁文件一定要与当前下载的内核源码包解压缩之后的源码相匹配。

3. 执行热补丁制作

cd kpatch
export VRDA=$(uname -r)
export SourceDir=$(ls -d ~/rpmbuild/BUILD/kernel-${VRDA/-*/}/linux-*)
./kpatch-build/kpatch-build -v /usr/lib/debug/usr/lib/modules/$(uname -r)/vmlinux \
    meminfo.patch \
    -s $SourceDir \
    -t vmlinux \
    -j$(getconf _NPROCESSORS_ONLN) #meminfo.patch 是前面一步里的补丁文件

执行完毕后如果顺利,会在当前目录下产生 livepatch-meminfo.ko 文件

4. 加载热补丁

sudo kpatch load livepatch-meminfo.ko

相关文章
|
5天前
|
网络协议 Linux 芯片
Linux 内核 6.11 RC6 发布!
【10月更文挑战第12天】
18 0
Linux 内核 6.11 RC6 发布!
|
1月前
|
存储 安全 Linux
探索Linux操作系统的心脏:内核
在这篇文章中,我们将深入探讨Linux操作系统的核心—内核。通过简单易懂的语言和比喻,我们会发现内核是如何像心脏一样为系统提供动力,处理数据,并保持一切顺畅运行。从文件系统的管理到进程调度,再到设备驱动,我们将一探究竟,看看内核是怎样支撑起整个操作系统的大厦。无论你是计算机新手还是资深用户,这篇文章都将带你领略Linux内核的魅力,让你对这台复杂机器的内部运作有一个清晰的认识。
68 3
|
1月前
|
缓存 安全 Unix
Linux 内核黑客不可靠指南【ChatGPT】
Linux 内核黑客不可靠指南【ChatGPT】
|
1月前
|
Linux 开发者
Linux内核贡献成熟度模型 【ChatGPT】
Linux内核贡献成熟度模型 【ChatGPT】
|
1月前
|
网络协议 Ubuntu Linux
用Qemu模拟vexpress-a9 (三)--- 实现用u-boot引导Linux内核
用Qemu模拟vexpress-a9 (三)--- 实现用u-boot引导Linux内核
|
1月前
|
Linux
用clang编译Linux内核
用clang编译Linux内核
|
1月前
|
Linux API C语言
Linux 内核补丁提交的清单 【ChatGPT】
Linux 内核补丁提交的清单 【ChatGPT】
|
1月前
|
安全 Linux 开发者
Linux内核管理风格 【ChatGPT】
Linux内核管理风格 【ChatGPT】
|
1月前
|
存储 缓存 Linux
Linux文件系统的功能规划
【9月更文挑战第12天】本文通过类比图书馆,形象地解释了文件系统的组织形式和管理方法。首先,文件系统需按块存储文件,并设有索引区方便查找。其次,热点文件应有缓存层提高效率,文件需分类存储以便管理。最后,Linux内核需记录文件使用情况,通过文件描述符区分不同文件,确保文件操作准确无误。
|
1月前
|
Linux API 调度
关于在Linux内核中使用不同延迟/休眠机制 【ChatGPT】
关于在Linux内核中使用不同延迟/休眠机制 【ChatGPT】