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