如果需要在Alibaba Cloud Linux内核中启用特定的功能或模块,或者禁用默认内核中的某些功能以满足特定的性能或安全要求,您可以基于Alibaba Cloud Linux内核源代码进行修改,并使用rpm软件包管理工具进行重新编译和构建自定义的内核rpm包。这样可以确保所使用的内核与Alibaba Cloud Linux发行版本的兼容性,并且可以灵活地满足特定需求。本文为您介绍如何基于Alibaba Cloud Linux的ECS环境,在容器中修改并编译Alibaba Cloud Linux内核的rpm包。
前提条件
已创建基于Alibaba Cloud Linux的ECS实例。具体操作,请参见使用向导创建实例。
镜像:Alibaba Cloud Linux 2或者Alibaba Cloud Linux 3
实例规格:建议选择32 vCPU及以上的实例规格
说明编译
rpm
包过程比较耗时,建议您使用32 vCPU及以上规格的ECS实例进行编译,提高编译效率。
步骤一:准备环境
远程连接ECS实例。
具体操作,请参见使用Workbench工具以SSH协议登录Linux实例。
运行以下命令,下载Docker镜像并进入容器。
#安装docker sudo yum install -y docker #拉取docker镜像 sudo docker pull <image_url> #拉起容器 sudo docker run -itd --net host --name alinux-build <image_url> bash # 进入容器 sudo docker exec -it alinux-build bash
<image_url>
需替换为Alibaba Cloud Linux 2/3对应的Docker镜像地址。产品
Docker镜像地址
Alibaba Cloud Linux 2
alibaba-cloud-linux-2-registry.cn-hangzhou.cr.aliyuncs.com/alinux2/alinux2
Alibaba Cloud Linux 3
alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3
本文以下载Alibaba Cloud Linux 3对应的Docker镜像为例。
sudo yum install -y docker sudo docker pull alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3 sudo docker run -itd --net host --name alinux-build alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/alinux3 bash sudo docker exec -it alinux-build bash
步骤二:下载源码
运行以下命令,下载并安装待修改的rpm包。
#下载源码包
yum install -y wget
wget <rpm_url>/<src.rpm_name>
#安装源码包
rpm -ivh <src.rpm_name>
<rpm_url>
是Alibaba Cloud Linux 2/3对应的rpm
包地址。产品
rpm包地址
Alibaba Cloud Linux 2
Alibaba Cloud Linux 3
https://mirrors.aliyun.com/alinux/3/plus/source/SRPMS/kernels/
<src.rpm_name>
为待修改的src.rpm
包名称,请您根据需要替换。
本文以下载Alibaba Cloud Linux 3的rpm
包为例,其中src.rpm
包的名称为kernel-5.10.134-13.1.al8.src.rpm
。
yum install -y wget
wget https://mirrors.aliyun.com/alinux/3/plus/source/SRPMS/kernels/kernel-5.10.134-13.1.al8.src.rpm
rpm -ivh kernel-5.10.134-13.1.al8.src.rpm
源码包安装完成后,文件保存在/root/rpmbuild
目录中,您可以通过ls /root/rpmbuild
命令查询。查询结果如下图所示。
步骤三:修改源码
运行以下命令,安装依赖组件。
yum install -y rpm-build yum-utils yum-builddep -y <src.rpm_name>
<src.rpm_name>
为待修改的src.rpm
包名,请您根据需要替换。本文src.rpm
包名称为kernel-5.10.134-13.1.al8.src.rpm
。yum install -y rpm-build yum-utils yum-builddep -y kernel-5.10.134-13.1.al8.src.rpm
运行以下命令,解压源码包。
# 先进入到源码目录 cd /root/rpmbuild/SOURCES # 再对源码包进行解压 tar xf <源码压缩包名称>
本示例的
<源码压缩包名称>
为linux-5.10.134-13.1.al8.tar.xz
,请您根据实际情况替换。cd /root/rpmbuild/SOURCES tar xf linux-5.10.134-13.1.al8.tar.xz
运行以下命令,进入解压后的目录。
cd <解压后的源码包名称>
本示例的
<解压后的源码包名称>
为linux-5.10.134-13.1.al8
,请您根据实际情况替换。cd linux-5.10.134-13.1.al8
(可选)修改
config
配置。请您根据实际需求对源码或
config
配置文件进行相应修改。源码的修改方法应根据实际需求而定。对于config
的修改方法,您可以参考以下操作。运行以下命令,查看并选择待修改的
config
文件。ls /root/rpmbuild/SOURCES
在
/root/rpmbuild/SOURCES
目录下有四个config
文件,具体说明如下。config文件
说明
kernel-5.10.134-aarch64.config
Arm架构、release版本的config配置。
kernel-5.10.134-aarch64-debug.config
Arm架构、debug版本的config配置,仅能用于测试。
kernel-5.10.134-x86_64.config
x86架构、release版本的config配置。
kernel-5.10.134-x86_64-debug.config
x86架构、debug版本的config配置,仅能用于测试。
根据平台是
Arm
还是x86
架构,选择kernel-5.10.134-aarch64.config
或者kernel-5.10.134-x86_64.config
文件即可,也可以同时修改两个平台的配置。运行以下命令,修改
config
文件。本文以
x86
架构的kernel-5.10.134-x86_64.config
文件为例。复制
config
文件到源码目录下。cd /root/rpmbuild/SOURCES cp kernel-5.10.134-x86_64.config linux-5.10.134-13.1.al8/.config
进入源码目录。
cd linux-5.10.134-13.1.al8
刷新
config
文件中的默认值。make olddefconfig
通过
menuconfig
进行修改,确保能正确处理好config
依赖。make menuconfig
进入
menuconfig
的界面。您可以按/
键搜索待修改项,然后根据需要对待修改项进行变更。拷贝修改后的
config
文件,覆盖原有配置。cp .config ../kernel-5.10.134-x86_64.config
返回上级目录。
cd ..
说明您可以按照同样的方法修改Arm架构的config配置。
运行以下命令,更新版本号。
cd /root/rpmbuild/SPECS vi kernel.spec
按
i
键进入编辑模式。修改完成后按Esc
键,输入:wq
后按Enter
键,保存并退出配置文件。修改建议:
如果是类似
5.10.134-12
这种大版本号,建议将其版本更新为5.10.134-12.0.1
这类x.y.z
的形式,以便与官方的版本号区分。如果是类似
5.10.134-13.1
这种x.y
的小版本号,建议将其版本更新为5.10.134-13.1.1
。
本文以将
5.10.134-13.1
版本号更新为5.10.134-13.1.1
为例。在该文件中,找到
%define pkgrelease %{?KREL:%{KREL}}%{?!KREL:13.1}
字段,将其更新为%define pkgrelease %{?KREL:%{KREL}}%{?!KREL:13.1.1}
。同时您还可以在
kernel.spec
的changelog
中补充此次的变更说明。
步骤四:重新构建rpm包
运行以下命令,重新压缩src.rpm包。
本文示例的源码包名称是
linux-5.10.134-13.1.al8
,示例命令如下。进入SOURCES目录。
cd /root/rpmbuild/SOURCES/
修改源码目录的文件名。
上述示例中将
5.10.134-13.1
版本号更新为5.10.134-13.1.1
,因此修改源码目录的文件名为linux-5.10.134-13.1.1.al8
,请您根据实际情况进行修改。mv linux-5.10.134-13.1.al8 linux-5.10.134-13.1.1.al8
重新压缩为tar包。
tar cJf linux-5.10.134-13.1.1.al8.tar.xz linux-5.10.134-13.1.1.al8
移除解压的目录以及旧的压缩包。
rm -rf linux-5.10.134-13.1.al8 rm -f linux-5.10.134-13.1.al8.tar.xz
运行以下命令,重新构建
src.rpm
包。cd /root rpmbuild -bs rpmbuild/SPECS/kernel.spec
执行完成后返回如下信息,表示
src.rpm
包存放在/root/rpmbuild/SRPMS/kernel-5.10.134-13.1.1.al8.src.rpm
。(可选)运行以下命令,降级
dwarves
软件包。如果您安装的
src.rpm
中的内核版本小于等于5.10.134-13.1.al8
,需使用dwarves-1.22-1.al8
进行编译,否则可能会编译报错。yum downgrade dwarves-1.22-1.al8 -y
运行以下命令,重新构建rpm包。
rpmbuild --rebuild /root/rpmbuild/SRPMS/<src.rpm_name>
其中
<src.rpm_name>
是修改后的src.rpm包名称,本文示例修改后的src.rpm包名称是kernel-5.10.134-13.1.1.al8.src.rpm
,请您根据实际情况替换。rpmbuild --rebuild /root/rpmbuild/SRPMS/kernel-5.10.134-13.1.1.al8.src.rpm
编译rpm包时间较长,请您耐心等待。返回如下信息时,表示rpm包已构建成功。