眾所周知,Linux是一個內(nèi)核,當(dāng)大家談及Linux時,通常指的是”Linux發(fā)行版”。例如Rocky Linux和Debian是Linux發(fā)行版的類型。 發(fā)行版使用獨立于Linux的各種開源項目的代碼。本篇教程主要介紹獲取Rocky Linux內(nèi)核源代碼樹、配置它、編譯它,最后安裝和引導(dǎo)內(nèi)核的過程。
注意:Rocky Linux不支持內(nèi)核重建,在建立一個定制的內(nèi)核或者考慮建立之前,請注意一下條件:
- 需要的功能是否可以通過安裝 [elrepo](https://elrepo.org) 中的內(nèi)核模塊來實現(xiàn)?
- 你需要的功能,是否可以作為內(nèi)核本身的一個獨立模塊?
- Rocky Linux 和大多數(shù)其他 EL 衍生工具,都是作為一個完整的環(huán)境來設(shè)計的。 更換關(guān)鍵部件會影響系統(tǒng)的運行。
- 大多數(shù)用戶不再需要構(gòu)建自己的內(nèi)核。 可能只需要一個內(nèi)核模塊/驅(qū)動程序,或者構(gòu)建自己的內(nèi)核模塊(kmod/dkms)。
一、內(nèi)核介紹
Linux內(nèi)核是操作系統(tǒng)的核心部分。雖然內(nèi)核在整個Linux發(fā)行版中只是一個小組件,但它是最關(guān)鍵的部分。如果內(nèi)核出現(xiàn)故障或崩潰,系統(tǒng)的其他部分也會隨之受到影響。
二、Rocky Linux內(nèi)核源代碼
每個Linux發(fā)行版都有其支持的特定內(nèi)核版本源代碼,包括編譯的二進(jìn)制文件(.src.rpm)、源代碼RPM(.srpm)等多種形式。如果你需要下載與當(dāng)前Rocky Linux版本不同的內(nèi)核版本(如更新版本),可以首先訪問官方內(nèi)核網(wǎng)站:[www.kernel.org](http://www.kernel.org)。該網(wǎng)站維護(hù)著內(nèi)核源代碼及大量其他開源軟件的鏡像列表,鏡像地址為:[mirrors.kernel.org](http://mirrors.kernel.org)。
在接下來的教程中,下載、配置和編譯Linux內(nèi)核的大部分工作可以以非特權(quán)用戶身份完成,而實際安裝或修改系統(tǒng)文件和二進(jìn)制文件的最后步驟則需要使用高權(quán)限。我們通過使用特殊的內(nèi)核構(gòu)建選項,可以指定自定義工作或輸出目錄,以便不需要根權(quán)限即可完成大部分工作。
具體而言,本文將使用 “O=~/build/kernel” 選項來處理所有適用的構(gòu)建操作。此處的 “~/build/kernel” 等同于 “/home/$USER/build/kernel” 或 “$HOME/build/kernel”。
三、內(nèi)核版本和命名約定
在網(wǎng)站上,會看到可用內(nèi)核對應(yīng)的文件夾,例如 v1.0、v2.5、v2.6、v3.0、v3.x、v4.x、v5.x 和 v6.x。在急于獲取最新版本之前,了解Linux內(nèi)核版本系統(tǒng)的工作原理十分重要。
目前的慣例是將主要的新內(nèi)核版本命名為“Linux 5.x”(通常被稱為vanilla或主線內(nèi)核)。例如,這個系列的第一個版本是Linux 5.0(也可視為5.0.0),隨后的版本依次為Linux 5.1(5.1.0)、Linux 5.2等。
穩(wěn)定點發(fā)布:如某一系列內(nèi)核的下一個穩(wěn)定點版本將是Linux 5.0.1,然后是Linux 5.0.2,以此類推。例如,Linux 5.0.4是基于Linux 5.0.0系列的第四個穩(wěn)定版本。
四、安裝必備工具和庫
在構(gòu)建內(nèi)核的過程中,常見的故障往往源于缺乏必要的編譯和構(gòu)建工具。缺少的軟件可以通過Rocky Linux系統(tǒng)中的DNF軟件包管理器進(jìn)行安裝。在Rocky Linux上,可以運行以下命令來快速獲得大多數(shù)必要的開發(fā)工具:
sudo dnf -y groupsinstall "C 開發(fā)工具和庫"
如果遇到類似“模塊或組 ‘C 開發(fā)工具和庫’不可用”的錯誤,可以嘗試:
sudo dnf -y groupsinstall '開發(fā)工具'
其他一些可能需要的庫、頭文件和應(yīng)用程序,可以通過安裝以下軟件包獲得:
sudo dnf -y install \ ncurses-devel openssl-devel elfutils-libelf-devel python3
接下來需要啟用某些第三方倉庫,如Powertools倉庫。輸入以下命令:
sudo dnf config-manager --set-enable powertools
最后從Powertool倉庫安裝所需的軟件包:
sudo dnf -y install dwarves
五、下載和解壓Linux內(nèi)核
接下來,我們將構(gòu)建的內(nèi)核版本是6.5.7,可以從以下網(wǎng)址獲?。?/p>
www.kernel.org/pub/linux/kernel/v5.x/linux-5.16.9.tar.xz
開始這一過程。首先,使用以下 “curl” 命令下載所需的內(nèi)核源到當(dāng)前工作目錄:
curl -L -o linux-5.16.9.tar.xz \ https://www.kernel.org/pub/linux/kernel/v5.x/linux-5.16.9.tar.xz
當(dāng)你下載的內(nèi)核源是一個壓縮包時,你需要解壓和解包來使用源代碼。確保你在下載Kernel tarball的目錄中,然后使用 “tar” 命令來解壓和解包文件,運行:
tar xvJf linux-5.*.tar.xz
這樣就準(zhǔn)備好進(jìn)行內(nèi)核的配置和構(gòu)建了。
六、構(gòu)建內(nèi)核
與macOS或Windows等操作系統(tǒng)的預(yù)配置特性不同,Linux的設(shè)計理念允許用戶決定內(nèi)核的重要部分。這種個性化的設(shè)計讓用戶可以根據(jù)特定需求定制功能,從而使Linux能夠在各種硬件設(shè)置中高效運行,從低端系統(tǒng)到嵌入式系統(tǒng),甚至到高端系統(tǒng)。
1、構(gòu)建內(nèi)核的主要步驟
- 應(yīng)用安全或錯誤修復(fù):如果安全性問題或錯誤影響了系統(tǒng),必須應(yīng)用相關(guān)修復(fù);
- 進(jìn)行編譯:通過編譯將配置好的內(nèi)核源代碼轉(zhuǎn)化為可用的內(nèi)核模塊。
在運行Linux的系統(tǒng)中,可以使用類似”lspci”、”lshw”等命令,顯示系統(tǒng)上確切安裝的硬件的詳細(xì)信息。對于基于RPM的系統(tǒng),這些實用程序由”pciutils.rpm”和”lshw.rpm”軟件包提供,因此需要準(zhǔn)備一個硬件清單。
2、準(zhǔn)備構(gòu)建環(huán)境
在開始實際配置之前,我們需要確保我們的構(gòu)建環(huán)境是干凈的。Linux內(nèi)核源樹中包含多個名為Makefile的文件,這些Makefile用于將構(gòu)成內(nèi)核源代碼的成千上萬個文件連接在一起。更重要的是,Makefile還定義了可執(zhí)行的目標(biāo),這些目標(biāo)是Make執(zhí)行的命令。
如果系統(tǒng)運行穩(wěn)定且良好,通常沒有升級內(nèi)核的必要。需要考慮的情況有:
- 應(yīng)用影響系統(tǒng)的安全或錯誤修復(fù);
- 在穩(wěn)定版本中需要特定的新功能。
例如某個未使用的設(shè)備驅(qū)動程序發(fā)現(xiàn)安全問題,可能并不需要升級;而對于錯誤修復(fù),若與實際使用無關(guān),也無必要去升級內(nèi)核。應(yīng)具備充分的理由,而不是僅僅追求“最新內(nèi)核”。
3、清理構(gòu)建環(huán)境命令
在本節(jié)中,為了配置內(nèi)核,我們將使用以下命令之一:
- “make mrproper”:清除先前構(gòu)建中遺留的所有文件和依賴,從構(gòu)建環(huán)境中徹底移除所有以前內(nèi)核的配置;
- “make clean”:盡管這也會刪除大多數(shù)生成的文件,但不會移除內(nèi)核配置文件(.config);
- “make menuconfig”:在文本界面中配置內(nèi)核的命令,所有的菜單、選項列表和對話框都可以直觀操作。
更多的配置選項包括:
- “make xconfig”:基于GUI的內(nèi)核配置工具,依賴于Qt庫;
- “make gconfig”:同樣為基于GUI的工具,但依賴于GTK+庫;
- “make olddefconfig”:使用當(dāng)前目錄中的.config文件來更新依賴關(guān)系,將新符號設(shè)置為默認(rèn)值;
- “make help”:顯示所有其他可能的目標(biāo),提供在線幫助。
4、內(nèi)核配置
要清理并準(zhǔn)備構(gòu)建環(huán)境,我們先進(jìn)入內(nèi)核源代碼目錄,并使用”make mrproper”命令:
cd linux-5.* make O=~/build/kernel mrproper
接下來將詳細(xì)介紹配置Linux 5.x系列內(nèi)核的過程。我們將重點啟用對NTFS文件系統(tǒng)的支持,這是一項在現(xiàn)代Linux系統(tǒng)中常見的需求。通常大多數(shù)現(xiàn)代Linux發(fā)行版會在其文件系統(tǒng)中提供運行內(nèi)核的配置文件,通常位于”/boot”目錄下,命名為類似”config-4.*”的格式。該配置文件列出了構(gòu)建時啟用的特性和選項。為了高效地構(gòu)建配置文件,我們將參考已存在的文件。接下來的步驟將幫助逐步配置內(nèi)核。
首先將已知的配置文件復(fù)制到我們的內(nèi)核構(gòu)建環(huán)境中,并重命名為”.config”:
cp /boot/config-$(uname -r) ~/build/kernel/.config
這里”uname -r”命令有助于獲取當(dāng)前運行的內(nèi)核版本,以確保獲取到正確的配置文件,避免因存在多個版本而混淆。
5、啟動內(nèi)核配置工具
要配置 Linux 5.* 系列內(nèi)核以支持 NTFS 文件系統(tǒng),可以按照以下步驟操作:
- 復(fù)制現(xiàn)有的配置文件到構(gòu)建環(huán)境:
cp /boot/config-$(uname -r) ~/build/kernel/.config
- 啟動圖形內(nèi)核配置工具:
make O=~/build/kernel menuconfig
- 在主配置屏幕上,導(dǎo)航到文件系統(tǒng)部分,然后選擇 DOS/FAT/NT 文件系統(tǒng);
- 在 DOS/FAT/NT 文件系統(tǒng)部分中,導(dǎo)航到 NTFS 文件系統(tǒng)支持;
- 輸入 M (大寫)以便通過模塊支持 NTFS 文件系統(tǒng);
- 使用箭頭鍵導(dǎo)航到 NTFS 調(diào)試支持 (NEW),然后按 y 將其包括在內(nèi);
- 使用箭頭鍵導(dǎo)航到 NTFS 寫支持,然后按 y 將其包括在內(nèi);完成時字母M或星號 (*) 應(yīng)該在每個選項旁邊顯示,如顯示在這里:
- 保存更改并退出內(nèi)核配置實用程序;
- 編輯 Makefile,將 EXTRAVERSION 變量更改為:
EXTRAVERSION = -custom
編譯內(nèi)核:
make O=~/build/kernel
安裝內(nèi)核模塊:
sudo make O=~/build/kernel modules_install
完成這些步驟后,將在 “/lib/modules/” 目錄下看到一個名為 “5.16.9-custom” 的目錄,其中包含已編譯的內(nèi)核模塊。
七、安裝內(nèi)核
假設(shè)正在使用一臺PC,當(dāng)前目錄為 “~/build/kernel/”,在上一次練習(xí)中創(chuàng)建的編譯內(nèi)核就位于此目錄中。確切地說,內(nèi)核鏡像可以在 “<kernel-build-dir>/arch/x86/boot/bzImage” 查找,在本示例中為 “~/build/kernel/arch/x86/boot/bzImage”。
在系統(tǒng)出現(xiàn)錯誤并生成“Oops”消息時,”System.map” 文件是非常有用的。某些內(nèi)核錯誤可能是由內(nèi)核缺陷或硬件故障引起的,這些錯誤類似于Microsoft Windows中的藍(lán)屏死機(BSOD)。錯誤信息會詳細(xì)包括當(dāng)前系統(tǒng)狀態(tài)的信息和幾個十六進(jìn)制數(shù)字。
“System.map” 使Linux能夠?qū)⑦@些十六進(jìn)制數(shù)字轉(zhuǎn)換為可讀的名稱,從而方便調(diào)試。雖然這主要是為了開發(fā)人員的便捷,但在需要報告問題時也會很有幫助。
1、安裝新內(nèi)核鏡像
接下來,我們將執(zhí)行所需的步驟,以安裝新的內(nèi)核鏡像。
首先在內(nèi)核構(gòu)建目錄的根目錄中,將 “bzImage” 文件復(fù)制并重命名到 “/boot” 目錄中:
sudo cp ~/build/kernel/arch/x86/boot/bzImage /boot/vmlinuz-<kernel-version>
在這里,”<kernel-version>” 是內(nèi)核版本號。對于我們本指南中使用的示例內(nèi)核,文件名將是 “vmlinuz-5.16.9-custom”。因此,具體命令為:
sudo cp ~/build/kernel/arch/x86/boot/bzImage /boot/vmlinuz-5.16.9-custom
2、System.map文件的復(fù)制
現(xiàn)在內(nèi)核鏡像已經(jīng)就位,接下來我們需要將相應(yīng)的 “System.map” 文件復(fù)制并重命名到 “/boot” 目錄,使用相同的命名約定:
sudo cp -v ~/build/kernel/System.map /boot/System.map-5.16.9-custom
3、使用kernel-install
一旦內(nèi)核和系統(tǒng)映射文件都就位,我們就可以邁出最后一步,使用以下命令來安裝內(nèi)核:
sudo kernel-install add 5.16.9-custom /boot/vmlinuz-5.16.9-custom
“kernel-install” 命令是一個簡單的 shell 腳本,可能并非所有Linux發(fā)行版都預(yù)裝,但在較新的 Fedora、RHEL 和 CentOS 版本中都能找到。該工具可以自動完成許多我們通常需要手動完成的設(shè)置工作,使系統(tǒng)能夠啟動我們剛剛編譯的新內(nèi)核。
具體而言,該工具會執(zhí)行以下操作:
- 創(chuàng)建初始RAM文件系統(tǒng)圖像(initramfs image),即 “/boot/initramfs-.img” 文件;
- 如果需要手動執(zhí)行此操作,可以使用 “mkinitramfs” 命令;
- 運行深度模塊命令,以創(chuàng)建模塊依賴列表;
- 更新引導(dǎo)加載器配置:
對于使用新的 GRUB2 的系統(tǒng),該配置文件通常是 “/boot/grub2/grub.cfg”。在基于 EFI 的系統(tǒng)上,還會更新 “/boot/efi/fedora/grub.cfg”;對于老舊版本的 GRUB,文件路徑可能是 “/boot/grub/grub.conf” 或 “/boot/grub/menu.lst”。
此外如果使用的是BLS(Boot Loader Specification)進(jìn)行最新磁盤的管理,則新的引導(dǎo)條目會添加到 “/boot/loader/entries/” 目錄中,或者在由變量 “blsdir” 指定的任何目錄中。
4、查看新創(chuàng)建的引導(dǎo)條目
在基于 EFI 的 Rocky 服務(wù)器上,當(dāng)使用 BLS 運行 GRUB2 時,新的引導(dǎo)條目會在以下路徑創(chuàng)建:
sudo cat /boot/loader/entries/6fa25ca775f64accb0d3e53f0e4e6e92-5.16.9-custom.conf
該配置文件的內(nèi)容將顯示類似于:
title Rocky Linux (5.16.9-custom) version 5.16.9-custom linux /vmlinuz-5.16.9-custom initrd /initramfs-5.16.9-custom.img $tuned_initrd options $kernelopts $tuned_params id rocky-202202120135-5.16.9-custom
八、啟動自定義內(nèi)核
完成上述步驟后,可以重啟系統(tǒng)并在引導(dǎo)菜單中選擇新內(nèi)核:
sudo reboot
系統(tǒng)重啟后,可以使用 “uname” 命令來確認(rèn)當(dāng)前運行的內(nèi)核版本:
uname -r
如果返回的是 “5.16.9-custom”,說明成功啟動了新內(nèi)核。
接下來可以使用以下命令檢查新內(nèi)核是否支持NTFS文件系統(tǒng):
modinfo ntfs
查詢結(jié)果應(yīng)顯示與NTFS模塊相關(guān)的信息,例如文件路徑、許可證和版本號,以確保支持已成功添加。