如果需要在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实例。
具体操作,请参见通过密码或密钥认证登录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>
是Docker镜像地址,请您根据需要替换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包地址、<src.rpm_name>
是待修改的src.rpm包名称,请您根据需要替换。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/ |
本文以下载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/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文件。
ls /root/rpmbuild/SOURCES
在
/root/rpmbuild/SOURCES
目录下有4个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
修改建议:
如果是类似
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 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软件包。
如果您的内核版本(通过
uname -r
命令查询)高于5.10.014
版本,需使用老版本dwarves进行编译,否则可能会编译出错。yum downgrade dwarves
运行以下命令,重新构建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包已构建成功。