一、下載源代碼
1、登錄github官網(wǎng)
進入github官網(wǎng),搜索linux,使用git下載最新版本,或者其它版本的內(nèi)核代碼。
2. 命令行下載
使用git clone下載github上linux源代碼,如下:
二、安裝需要的軟件包
安裝一些編譯內(nèi)核的依賴。下面步驟 需要在root下進行 。
[root@localhost ~]# yum install -y ncurses-devel elfutils-libelf-devel openssl-devel bc
安裝編譯內(nèi)核rpm包的依賴
[root@localhost ~]# yum install -y gcc rpm-build rpm-devel rpmlint make bash python3 coreutils diffutils patch rpmdevtools
三、配置內(nèi)核代碼
在編譯內(nèi)核之前,我們可以對內(nèi)核源代碼進行配置。配置的目的主要是確定哪些模塊會編譯到內(nèi)核當中。
1、進入源代碼目錄
cd linux/
2、拷貝當前主機系統(tǒng)內(nèi)核使用的config文件
從當前機器的啟動目錄拷貝config文件到內(nèi)核源代碼目錄。目標是使編譯內(nèi)核的config采用與當前環(huán)境一致的配置。這個文件保存了在安裝系統(tǒng)時內(nèi)核所安裝的模塊配置信息,否則需要重新手動指定每一個模塊的編譯配置。
cp -v /boot/config-$(uname -r) .config
或者
make oldconfig
make oldconfig
命令的作用是檢查已有的.config文件和Kconfig文件的規(guī)則是否一致,如果一致,就什么都不做,否則提示用戶哪些源代碼中有的選項在.config文件沒有。一般情況下一直執(zhí)行回車即可。
執(zhí)行后,內(nèi)核源碼目錄下會生成.config文件
[root@localhost linux]# ls -al | grep -w "config"
-rw-r--r-- 1 root root 232033 May 6 13:39 .config
.config
中保存的就是內(nèi)核編譯的相關(guān)設(shè)置。它的內(nèi)容大致是這樣的:
# 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_*
就是設(shè)置項,這些設(shè)置項與Linux內(nèi)核的各功能相對應(yīng),它的值有三種分別表示編譯時的三種操作:
- CONFIG_*=y
表示該項目所對應(yīng)的功能會被靜態(tài)地添加到內(nèi)核中
- CONFIG_*=m
表示該項目對應(yīng)的功能會被編譯成模塊,在內(nèi)核需要時再加載入內(nèi)核
- CONFIG_* is not set
表示不編譯該項目對應(yīng)的功能
注意 :由于內(nèi)核間功能的相互依賴十分復(fù)雜,因此不要嘗試手工編輯
.config
文件,否則可能出現(xiàn)編譯失敗,或者編譯后內(nèi)核無法執(zhí)行的情況!
3、啟動配置界面(可選)
該命令會運行一些腳本,然后打開一個配置界面
4、打開配置界面
可以看出里面包含所有的內(nèi)核組件,包括文件系統(tǒng),網(wǎng)絡(luò),IO棧,虛擬化和設(shè)備驅(qū)動等等。
可以通過該圖形界面對內(nèi)核加載的模塊編譯選項進行調(diào)整,如修改編譯后的內(nèi)核名稱、新添加之前系統(tǒng)缺少的模塊等。
如果你不熟悉,可以不做任何修改。
5、確認config文件中功能是否配置成功
vi .config
打開.config文件,搜索相關(guān)變量名,即可查看。本文未進行相關(guān)修改,一切采用系統(tǒng)默認的config文件。
四、編譯內(nèi)核
1、編譯內(nèi)核rpm包
使用如下命令編譯內(nèi)核rpm包
make -j $(nproc --all) INSTALL_MOD_STRIP=1 rpm-pkg
編譯完后會自動生成 rmp 安裝包,編譯時間比較長,建議使用配置較大的機器進行編譯,磁盤空間要保持在20G以上。
INSTALL_MOD_STRIP 指定是否剔除模塊的調(diào)試信息。通過傳參或定義環(huán)境變量的方式定義為
1
,使其生效。這個變量如果被指定,模塊就會將一些額外的、運行時非必要的信息剝離出來以縮減模塊的大小,當INSTALL_MOD_STRIP為1時,--strip-debug選項就會被使用,模塊的調(diào)試信息將被刪除,否則就執(zhí)行默認的參數(shù),模塊編譯時會添加一些輔助信息。
編譯后會在如下路徑生成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、安裝新編譯好的內(nèi)核rpm包
#yum install編譯好的內(nèi)核
[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