一、下載源代碼
1、登錄github官網
進入github官網,搜索linux,使用git下載最新版本,或者其它版本的內核代碼。
2. 命令行下載
使用git clone下載github上linux源代碼,如下:
二、安裝需要的軟件包
安裝一些編譯內核的依賴。下面步驟 需要在root下進行 。
[root@localhost ~]# yum install -y ncurses-devel elfutils-libelf-devel openssl-devel bc
安裝編譯內核rpm包的依賴
[root@localhost ~]# yum install -y gcc rpm-build rpm-devel rpmlint make bash python3 coreutils diffutils patch rpmdevtools
三、配置內核代碼
在編譯內核之前,我們可以對內核源代碼進行配置。配置的目的主要是確定哪些模塊會編譯到內核當中。
1、進入源代碼目錄
cd linux/
2、拷貝當前主機系統內核使用的config文件
從當前機器的啟動目錄拷貝config文件到內核源代碼目錄。目標是使編譯內核的config采用與當前環境一致的配置。這個文件保存了在安裝系統時內核所安裝的模塊配置信息,否則需要重新手動指定每一個模塊的編譯配置。
cp -v /boot/config-$(uname -r) .config
或者
make oldconfig
make oldconfig
命令的作用是檢查已有的.config文件和Kconfig文件的規則是否一致,如果一致,就什么都不做,否則提示用戶哪些源代碼中有的選項在.config文件沒有。一般情況下一直執行回車即可。
執行后,內核源碼目錄下會生成.config文件
[root@localhost linux]# ls -al | grep -w "config"
-rw-r--r-- 1 root root 232033 May 6 13:39 .config
.config
中保存的就是內核編譯的相關設置。它的內容大致是這樣的:
# General setup
#
CONFIG_INIT_ENV_ARG_LIMIT=32
# CONFIG_COMPILE_TEST is not set
# CONFIG_WERROR is not set
CONFIG_LOCALVERSION=""
# CONFIG_LOCALVERSION_AUTO is not set
CONFIG_BUILD_SALT=""
CONFIG_HAVE_KERNEL_GZIP=y
CONFIG_HAVE_KERNEL_BZIP2=y
CONFIG_HAVE_KERNEL_LZMA=y
CONFIG_HAVE_KERNEL_XZ=y
CONFIG_HAVE_KERNEL_LZO=y
CONFIG_HAVE_KERNEL_LZ4=y
CONFIG_HAVE_KERNEL_ZSTD=y
CONFIG_KERNEL_GZIP=y
注 :以
#
開頭的行就是注釋行,這些CONFIG_*
就是設置項,這些設置項與Linux內核的各功能相對應,它的值有三種分別表示編譯時的三種操作:
- CONFIG_*=y
表示該項目所對應的功能會被靜態地添加到內核中
- CONFIG_*=m
表示該項目對應的功能會被編譯成模塊,在內核需要時再加載入內核
- CONFIG_* is not set
表示不編譯該項目對應的功能
注意 :由于內核間功能的相互依賴十分復雜,因此不要嘗試手工編輯
.config
文件,否則可能出現編譯失敗,或者編譯后內核無法執行的情況!
3、啟動配置界面(可選)
該命令會運行一些腳本,然后打開一個配置界面
4、打開配置界面
可以看出里面包含所有的內核組件,包括文件系統,網絡,IO棧,虛擬化和設備驅動等等。
可以通過該圖形界面對內核加載的模塊編譯選項進行調整,如修改編譯后的內核名稱、新添加之前系統缺少的模塊等。
如果你不熟悉,可以不做任何修改。
5、確認config文件中功能是否配置成功
vi .config
打開.config文件,搜索相關變量名,即可查看。本文未進行相關修改,一切采用系統默認的config文件。
四、編譯內核
1、編譯內核rpm包
使用如下命令編譯內核rpm包
make -j $(nproc --all) INSTALL_MOD_STRIP=1 rpm-pkg
編譯完后會自動生成 rmp 安裝包,編譯時間比較長,建議使用配置較大的機器進行編譯,磁盤空間要保持在20G以上。
INSTALL_MOD_STRIP 指定是否剔除模塊的調試信息。通過傳參或定義環境變量的方式定義為
1
,使其生效。這個變量如果被指定,模塊就會將一些額外的、運行時非必要的信息剝離出來以縮減模塊的大小,當INSTALL_MOD_STRIP為1時,--strip-debug選項就會被使用,模塊的調試信息將被刪除,否則就執行默認的參數,模塊編譯時會添加一些輔助信息。
編譯后會在如下路徑生成rpm包:
......
Wrote: /root/rpmbuild/RPMS/x86_64/kernel-6.3.0+-1.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/kernel-headers-6.3.0+-1.x86_64.rpm
Wrote: /root/rpmbuild/RPMS/x86_64/kernel-devel-6.3.0+-1.x86_64.rpm
Executing(%clean): /bin/sh -e /var/tmp/rpm-tmp.k1BYNw
+ umask 022
+ cd /root/rpmbuild/BUILD
+ cd linux
+ rm -rf /root/rpmbuild/BUILDROOT/kernel-6.3.0+-1.x86_64
+ exit 0
Executing(--clean): /bin/sh -e /var/tmp/rpm-tmp.EjpV5x
+ umask 022
+ cd /root/rpmbuild/BUILD
+ rm -rf linux
+ exit 0
2、安裝新編譯好的內核rpm包
#yum install編譯好的內核
[root@localhost ~]# yum install /root/rpmbuild/RPMS/x86_64/kernel-6.3.0+-1.x86_64.rpm
Last metadata expiration check: 4:08:53 ago on Fri 05 May 2023 01:13:32 PM CST.
Dependencies resolved.
===================================================================================================================================================================================================
Package Architecture Version Repository Size
===================================================================================================================================================================================================
Installing:
kernel x86_64 6.3.0+-1 @commandline 61 M
Removing:
kernel x86_64 6.2.0+-1 @@commandline 299 M
Transaction Summary
===================================================================================================================================================================================================
Install 1 Package
Remove 1 Package
Total size: 61 M
Is this ok [y/N]: y
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Installing : kernel-6.3.0+-1.x86_64 1/2
Running scriptlet: kernel-6.3.0+-1.x86_64 1/2
Running scriptlet: kernel-6.2.0+-1.x86_64 2/2
Erasing : kernel-6.2.0+-1.x86_64 2/2
Running scriptlet: kernel-6.2.0+-1.x86_64 2/2
Verifying : kernel-6.3.0+-1.x86_64 1/2
Verifying : kernel-6.2.0+-1.x86_64 2/2
Installed products updated.
Installed:
kernel-6.3.0+-1.x86_64
Removed:
kernel-6.2.0+-1.x86_64
Complete!
kernel-5.19.0_rc4+-1.x86_64
Complete!
[root@localhost ~]# yum install /root/rpmbuild/RPMS/x86_64/kernel-devel-6.3.0+-1.x86_64.rpm
Last metadata expiration check: 4:10:05 ago