修改并编译Alibaba Cloud Linux内核的rpm包

如果需要在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实例进行编译,提高编译效率。

步骤一:准备环境

  1. 远程连接ECS实例。

    具体操作,请参见通过密码或密钥认证登录Linux实例

  2. 运行以下命令,下载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

https://mirrors.aliyun.com/alinux/2/plus/source/SRPMS/

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命令查询。查询结果如下:

image

步骤三:修改源码

  1. 运行以下命令,安装依赖组件。

    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
  2. 运行以下命令,解压源码包。

    # 先进入到源码目录
    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
  3. 运行以下命令,进入解压后的目录。

    cd <解压后的源码包名称>

    本文示例的<解压后的源码包名称>linux-5.10.134-13.1.al8,请您根据实际情况替换。示例命令如下:

    cd linux-5.10.134-13.1.al8
  4. (可选)请您根据实际需要修改源码或者config配置。修改源码的方法根据实际需求而定,本文不做示例。修改config的方法,您可以参考如下操作:

    1. 运行以下命令,查看并选择待修改的config文件。

      ls /root/rpmbuild/SOURCES

      image

      /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文件即可,也可以同时修改两个平台的配置。

    2. 运行以下命令,修改config文件。

      本文以x86架构的kernel-5.10.134-x86_64.config文件为例,示例命令如下:

      1. 复制config文件到源码目录下。

        cd /root/rpmbuild/SOURCES
        cp kernel-5.10.134-x86_64.config linux-5.10.134-13.1.al8/.config
      2. 进入源码目录。

        cd linux-5.10.134-13.1.al8
      3. 刷新config文件中的默认值。

        make olddefconfig
      4. 通过menuconfig进行修改,确保能正确处理好config依赖。

        make menuconfig

        进入menuconfig的界面。您可以按/键搜索待修改项,然后根据需要对待修改项进行变更。

        image

      5. 拷贝修改后的config文件,覆盖原有配置。

        cp .config ../kernel-5.10.134-x86_64.config
      6. 返回上级目录。

        cd ..
      说明

      您可以按照同样的方法修改Arm架构的config配置。

  5. 运行以下命令,更新版本号

    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}1

    同时您还可以在kernel.specchangelog中补充此次的变更说明。2

步骤四:重新构建rpm包

  1. 运行以下命令,重新压缩src.rpm包。

    本文示例的源码包名称是linux-5.10.134-13.1.al8,示例命令如下。

    1. 进入SOURCES目录。

      cd /root/rpmbuild/SOURCES/
    2. 修改源码目录的文件名。

      上述示例中将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
    3. 重新压缩为tar包。

      tar cJf linux-5.10.134-13.1.1.al8.tar.xz linux-5.10.134-13.1.1.al8
    4. 移除解压的目录以及旧的压缩包。

      rm -rf linux-5.10.134-13.1.al8
      rm linux-5.10.134-13.1.al8.tar.xz
  2. 运行以下命令,重新构建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

    image

  3. (条件必选)运行以下命令,降级dwarves软件包。

    如果您的内核版本(通过uname -r命令查询)高于5.10.014版本,需使用老版本dwarves进行编译,否则可能会编译出错。

    yum downgrade dwarves
  4. 运行以下命令,重新构建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包已构建成功。1