如果需要在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包已構建成功。