
編譯內核 Linux 這是區分好奇用戶和真正想要購買的用戶之間的任務。 深入了解作業系統雖然日常使用 GNU/Linux 並不需要這樣做,但它是更好地了解機器工作原理、充分利用硬體以及根據自己的喜好微調系統的絕佳方法。
本指南將一步一步地向您展示如何操作。 從頭開始下載、設定、編譯和安裝 Linux 核心。 我們將介紹基於 Debian 的發行版(Debian、Ubuntu、Mint 及其衍生版本),以及適用於其他發行版系列(例如 Fedora 或 CentOS)的通用概念。我們還將探討為什麼要進行此操作、需要哪些工具、如何重複使用目前的核心配置、如何針對 Docker 或特定硬體調整選項,以及出現問題時如何回溯。
為什麼你可能會對編譯自己的核心感興趣
在動手之前,務必先明確自己想要什麼: 編譯內核並非總是必要的。但這樣做有幾個令人信服的理由。
- 性能和效率刪除您從不使用的驅動程式和功能可以加快系統啟動速度,減少記憶體使用量,並降低某些工作負載下的延遲。
- 安全停用不需要的功能或模組可以減少攻擊面。在許多情況下,更精簡的核心意味著更安全的核心。
- 支援特定硬體有時你的發行版可能尚未包含所需的驅動程序,或者該驅動程序已被禁用;通過編譯自己的內核,你可以解決這個問題。 啟動針對您硬體的專屬支持 (網路卡、RAID、設備) 存儲 不常見等等)。
- 特殊功能您可以嘗試使用新的任務排程器、虛擬化特定功能、Docker、容器、BPF、io_uring 或任何其他預設未啟用的進階功能。
- 學習與實驗編譯核心是一種非常直接的方法。 了解 GNU/Linux 系統的內部組織架構硬體如何初始化以及模組如何整合。
然而,對於只想打開電腦、瀏覽網頁,不太需要其他操作的家庭用戶來說, 手動編譯核心就像用大砲打蒼蠅一樣。這是一個漫長而精細的過程,在過程中吃些東西也是正常的。 內核恐慌 在進行微調之前,如果你喜歡折騰,那就去做吧;否則,最好還是使用發行版的官方軟體包。
Linux核心究竟是什麼?
Linux核心是該系統的核心元件: 位於硬體與其餘程式之間的軟體它負責管理記憶體、進程、檔案系統、輸入/輸出設備、網路、安全性等等。
Linux 始於 1991 年 Linus Torvalds 的個人項目 創建一個自由內核。自那時起,它發展迅猛:如今,它擁有數千萬行程式碼,由數千名開發者根據該許可證維護。 GPLv2我們通常稱之為「Linux」的系統實際上是以下幾種技術的組合: Linux 核心 + GNU 工具及其他元件 誰負責分發。
編譯自訂核心時,你所做的就是產生一個二進位(通常是 /boot/vmlinuz-version加上一組模組 /lib/modules/版本以及以下文件: 系統映射中, 配置 使用所使用的配置和初始啟動映像(initrd 或 initramfs).
編譯核心所需的基本工具
要從原始碼編譯 Linux 內核,您需要一個完整的開發環境。在 Debian、Ubuntu 和 Mint 系統上,這通常涉及安裝… build-essential 以及許多其他函式庫和實用程序.
許多經典指南推薦如下套裝(您可以根據自己的佈局進行調整。):
- Debian/Ubuntu 中的最小集合 對於一個相對較新的核心:
sudo apt-get install build-essential libncurses-dev bison flex libssl-dev libelf-dev libudev-dev libpci-dev libiberty-dev dkms openssl bc autoconf - Debian 打包環境 建構核心 .deb 軟體包:
sudo apt install autoconf automake autotools-dev bison build-essential dh-make debhelper debmake devscripts dpkg fakeroot file gfortran git gnupg fp-compiler lintian patch pbuilder perl quilt xutils-dev
在 Fedora、CentOS 及其衍生版本中方法略有不同,但思路不變: 安裝一套開發工具 以及用於配置介面(文字和圖形)的庫。例如,以下是一些常用的函式庫。 命令 風格:
su -c 'yum groupinstall "Development Tools"'
su -c 'yum install ncurses-devel qt-devel unifdef'
如果沒有這些依賴項,編譯很快就會失敗,所以… 在下載原始碼之前,必須準備好運行環境。.
哪裡可以下載 Linux 核心原始碼
取得內核程式碼的官方途徑是 kernel.org從那裡您可以選擇主線版本、穩定版本和長期支援 (LTS) 版本。每個版本都有自己的資料夾和一個連結。 壓縮包 康普里米多。
一些例子 下載 經常看到的 教學如下:
- 近期測試使用的穩定核心版本為 6.6:
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.6.tar.xz - 核心 6.0.11(v6.x 分支):
wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-6.0.11.tar.xz - 核心 5.10.13(v5.x 分支):
wget https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.13.tar.xz
您也可以從以下位置下載字型: 您的發行版儲存庫例如,在 Debian/Ubuntu 系統中,有這樣的軟體包。 linux-source:
sudo apt-get install linux-source
這將留下一個類型為的文件 linux-source-xxxtar.bz2 en / usr / src你可以用類似解壓縮 kernel.org tarball 的方式來解壓縮它。
準備原始碼樹和磁碟空間
下載內核壓縮包後,需要將其解壓縮到某個位置。 足夠的空間和書寫權限雖然 /usr/src 是一個經典的目錄路徑,但你並非必須使用它。例如,你可以建立一個類似這樣的目錄: ~/下載/我的內核.
請記住,解壓縮後,來源檔案樹可能位於… GB 1,5在編譯過程中,內容很容易跳到…之上。 GB 7所以要留出足夠的容錯空間。
一些 典型的減壓範例 聲音:
- 使用 tar.xz:
tar avxf linux-6.6.tar.xz - 使用 tar.bz2:
tar jxvf linux-2.6.36.tar.bz2 -C /usr/src - 使用 tar.gz:
tar zxvf linux-x.x.x.x.tar.gz -C /usr/src
解壓縮後,您將得到一個類似這樣的目錄。 linux-6.6 o linux-5.10.13您可以建立一個名為「通用符號連結」的符號連結。 Linux的 為了避免路線選擇過於複雜:
cd /usr/src
sudo ln -s linux-6.0.11 linux
並非必須將來源放在… / usr / src雖然很多導遊都這樣做是出於傳統。 在使用者資料夾中進行編譯和安裝,過程是一樣的。前提是您有足夠的空間和相應的許可證。
重複使用當前內核配置
即使對於經驗豐富的人來說,從頭開始逐個選項地配置核心也是一項永無止境的任務。通常的做法是 重複使用您已在使用的核心配置 作為一個起點。
為此,首先需要知道 你載入的是哪個核心? 馬上:
uname -r
結果大概是這樣的 6.1.0-13-amd64 o 4.19.0-6-amd64有了這些訊息,您就可以從…複製當前配置。 /啟動 到新解壓縮來源檔案的目錄:
cd linux-6.6
cp /boot/config-$(uname -r) .config
那個文件 的.config 這將是核心建置系統用作基礎的核心版本。在較新版本中,執行設定工具時,只會要求您提供以下資訊: 之前核心中不存在的選項這樣可以節省大量時間。
如何根據實際硬體調整設定
除了重複使用目前的 .config 檔案之外,您還可以使用核心樹本身提供的工具對其進行更精細的調整。其中一個特別有用的工具是 使localmodconfig它會嘗試產生一個適合你目前已載入模組的配置。
在原始碼目錄中,只需運行:
make localmodconfig
此命令檢查活動模組並 它會停用系統中許多未使用的功能。如果您要為特定機器配置內核,這非常理想。如果您打算為其他機器或伺服器編譯通用內核,則需要在編譯後仔細檢查,以確保沒有遺漏編譯系統上不存在的硬體。
內核配置模式:文字和圖形環境
內核配置可以透過多種方式完成。所有這些方式最終都會產生或修改該檔案。 的.config但不同模式下的體驗卻截然不同:
- 產生配置完全以文本為基礎的問卷調查,逐題進行。如今,這種方式僅在非常特殊的情況下被認為實用;它是 緩慢、乏味且容易出錯.
- make menuconfig基於文字的選單介面(ncurses),在伺服器端或沒有圖形介面時非常常見。您可以使用方向鍵、Tab 鍵和空白鍵進行導航。
- make xconfig基於 Qt 的圖形介面,滑鼠操作舒適。非常適合在桌面環境下工作。
- 執行 gconfig:基於 GTK 的圖形介面,專為 GNOME 類環境設計。
在實踐中, make menuconfig 它幾乎是所有指南中的明星,因為它幾乎適用於任何情況。從你複製的 .config 檔案開始,你只需要執行以下操作:
make menuconfig
您會看到一個主選單,其中包含「處理器類型和功能」、「裝置驅動程式」、「檔案系統」、「網路支援」、「虛擬化」等類別。在每個類別下,您都可以: 啟用、停用或標記為模組 不同的選項。通常情況下:
- [*] 意思是「內建的」。
- [管理] 它表示“它被編譯為可載入模組”。
- [] 它已被“停用”。
其思路是將啟動系統所需的功能(例如根磁碟支援)整合到核心中,並使用模組來實現其他功能。 不太重要的功能或並非總是使用的功能這樣主內核就會更輕量級。
每個選單項目通常都有一個選項 尋求幫助 這部分會詳細說明其功能,有時還會提供預設建議。如果您對某些特定設定不確定,最好使用建議值或先前配置中已啟用的值。
實用設定:檔案系統、虛擬化和 Docker
內核定制的一個重要部分是選擇合適的內核。 哪些檔案系統、容器機制和網路選項? 你會需要它的。例如,如果你打算使用分區。 NTFS 要進行寫入操作,您需要啟動相應的支援(通常位於「檔案系統 → DOS/FAT/EXFAT/NT 檔案系統」中)。
如果您打算使用虛擬化或容器技術,那麼有很多選項需要仔細研究。例如,對於 Docker 和 Docker Swarm,就有許多… 命名空間、cgroups 和網路的功能 必須處於啟動狀態:
- cgroup 層級結構。
CONFIG_NAMESPACES,CONFIG_NET_NS,CONFIG_PID_NS,CONFIG_IPC_NS,CONFIG_UTS_NS.CONFIG_CGROUPS以及以下子選項:CONFIG_CGROUP_CPUACCT,CONFIG_CGROUP_DEVICE,CONFIG_CGROUP_FREEZER,CONFIG_CGROUP_SCHED,CONFIG_CPUSETS,CONFIG_MEMCG.- 關鍵支持(
CONFIG_KEYS). - 網路選項,例如
CONFIG_VETH,CONFIG_BRIDGE,CONFIG_BRIDGE_NETFILTER,CONFIG_NF_NAT_IPV4,CONFIG_IP_NF_FILTER,CONFIG_IP_NF_TARGET_MASQUERADE,CONFIG_NETFILTER_XT_MATCH_ADDRTYPE,CONFIG_NETFILTER_XT_MATCH_CONNTRACK,CONFIG_NETFILTER_XT_MATCH_IPVS,CONFIG_IP_NF_NAT,CONFIG_NF_NAT,CONFIG_NF_NAT_NEEDED. - POSIX 佇列支援(
CONFIG_POSIX_MQUEUE). - 選項如
CONFIG_IPVLAN適用於 Docker 使用的特定網路配置。
其中大部分功能都可以毫無問題地編譯成模組,但是 建議查閱 Docker 文件或使用測試腳本。還有一些實用工具,例如 檢查配置腳本 它會分析核心的 .config 文件,告訴你為了完全相容容器,還需要哪些內容。
基本原理如下:
chmod +x check-config.sh
./check-config.sh .config
輸出結果會顯示哪些選項正常,哪些選項缺失,哪些選項配置錯誤。如果發現任何關鍵選項已停用,可以再次執行命令。 make menuconfig o make xconfig更正後,儲存並重複驗證。
最新核心版本中的一些有趣改進
除了自訂之外,許多人還會編譯新版本的核心。 充分利用效能提升和新功能 仍然需要一些時間才能將軟體包送達您的分發包中。
例如,在 戲劇 6.6 已提及的改進措施包括:
- EXT4效能顯著提升在某些並發寫入負載下,增幅高達 34%。
- GPU 支援方面的改進 NVIDIA 使用免費驅動程式 風格為 NVK(Vulkan)驅動程式做好準備。
- 的選項 配置方面 的BIOS 直接從 HP 裝置透過 Linux 系統.
- 混合處理器叢集調度設置 Intel英特爾 (阿爾德湖、猛禽湖及之後)。
- 優化直接異步 I/O io_uring在某些測試中,效能提升了約 37%。
- 一款新的任務規劃工具 EEVDF(最早符合資格的虛擬截止日期優先)這樣可以改善進程間的 CPU 分配。
現代版本都「開箱即用」了所有這些功能,但您的發行版可能需要一些時間來打包或啟用它們,這就是為什麼許多人會求助於… 手動編譯較新的內核.
編譯核心:make、模組和編譯線程
配置完成後,就可以開始利用CPU了。這時就需要用到指令了。 使 經典內核編譯。編譯時間可能從幾分鐘到一小時以上不等,具體取決於硬體和要產生的模組數量。
從本質上講, 基本流程 在 Debian/Ubuntu(或其他發行版)中,通常是:
- 編譯核心(主鏡像):
make -j$(nproc)
或者,如果您希望它只使用一個核心:
make - 編譯並安裝模組:
sudo make modules_install
選項 -j$(nproc) 它會指示 make 使用與 CPU 核心數相同的平行進程數,這在現代機器上可以節省大量時間。如果在編譯過程中發生錯誤,您需要在錯誤發生的地方進行檢查;錯誤可能是由於以下原因造成的: 此核心版本中存在缺失依賴項、配置衝突或特定錯誤。.
一些較高級的配方會用到 Debian 工具。 製作 kpkg 和包裝 核心封包 將內核打包成 .deb 檔。這樣,您就可以像安裝其他軟體包一樣安裝和卸載自訂內核,例如:
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
cd /usr/src
sudo dpkg -i *.deb
在這種情況下,也經常會遇到與以下方面相關的錯誤: 核心憑證許多指南透過在 .config 檔案中新增類似這樣的行來停用受信任的金鑰,從而解決特定問題:
sed -i '/CONFIG_SYSTEM_TRUSTED_KEYS/s/^/#/g' .config
安裝新編譯的核心並更新引導程序
如果您不使用 .deb 打包方式,而是使用標準的核心樹工具進行「裸機」安裝,那麼 安裝直接從來源目錄進行。編譯後最常見的順序是:
- 安裝模組 (如果您還沒有這樣做的話):
sudo make modules_install - 安裝內核:
sudo make install
核心自身的腳本系統將複製二進位。 bz圖像 腳本會產生到 /boot 目錄,同時產生的還有 System.map 和設定檔。在 Debian/Ubuntu 系統中,腳本通常會在以下位置觸發: /etc/kernel/postinst.d 產生 initramfs的 並自動更新引導管理器(GRUB)。
即便如此,明確執行一下也絕對不會有害:
sudo update-initramfs -u
sudo update-grub
sudo update-grub2
有了這個 確保初始啟動映像已正確重新產生。 對於新核心版本,GRUB 會在其選單中考慮這一點。在其他發行版中,例如一些基於 Red Hat 的發行版,也可以使用它。 mkinitrd o dracut 雖然不是 update-initramfs,但目標是一樣的: 建立一個適用於新核心的 initrd/initramfs 鏡像.
initrd/initramfs 的作用及潛在問題
initrd 或 initramfs 是一個 在啟動過程的早期階段載入到記憶體中的檔案系統映像它包含掛載實際根檔案系統所需的最低驅動程式(例如,支援 / 分割所在的 SATA 或 NVMe 控制器)。
如果您的 initrd 產生不正確或缺少必要的模組,核心將能夠啟動,但無法掛載。 / 最終你會得到一個 內核恐慌 抱怨說他找不到 根 文件系統。這是關鍵核心選項被停用或版本變更後 initramfs 初始化失敗時常見的錯誤。
在 Debian/Ubuntu 系統中,如今的參考命令是 更新初始化記憶體檔案系統:
sudo update-initramfs -c -k x.x.x
參數 -c 創建一張新圖像,並且 -k 指示確切的內核版本。在較舊的發行版(或使用不同的工具)中,它曾經被使用過。 mkinitrd 語法類似:
cd /boot
mkinitrd -o initrd.img-2.6.36 2.6.36
總之,如果在安裝自訂核心後看到與 /lib/modules 或掛載根目錄相關的錯誤, 首先,檢查 initramfs/initrd 和 GRUB 設定。 在接觸其他任何東西之前。
驗證新核心是否正常運作。
所有程式都安裝完畢,啟動管理器也已更新,現在可以重新啟動系統進行測試了。啟動過程中, 監控 GRUB 和內核啟動訊息 如果模組、檔案系統或無法辨識的裝置出現錯誤。
進入系統後,您可以使用以下命令查看您正在使用的核心版本:
uname -a
輸出結果應反映出 新編譯版本接下來,就是測試您常用的服務:Web 伺服器, 數據庫,碼頭工人, 虛擬機桌面程式等等。如果一切運行正常,您可以將該內核保留為主內核,並將舊版本作為備份。
如何回滾到之前的內核版本並卸載新內核
如果出了什麼問題(這種情況可能會發生,尤其是在最初幾次),重要的是… 不要恐慌只要你的 GRUB 列出了其他可用的內核,你就可以輕鬆恢復系統。
這個過程 典型的 將:
- 重新啟動系統。
- 在 GRUB 選單中,使用箭頭鍵移動並進入類型選擇部分。 “高級選項…”.
- 選擇一個你確定運行良好的舊核心版本。
- 使用該核心啟動,進入系統後,刪除有問題的核心。
如果您手動安裝了內核,而沒有使用 .deb 軟體包,則卸載通常涉及以下幾個方面: 刪除 /boot 和 /lib/modules 目錄下的對應檔案。例如,要刪除 6.6.0 版本,您可以這樣做:
cd /boot
sudo rm config-6.6.0 initrd.img-6.6.0 System.map-6.6.0 vmlinuz-6.6.0
然後,刪除它的模組:
cd /lib/modules
sudo rm -rf 6.6.0
完成後,更新 GRUB,使其選單中不再包含該內核,然後重新啟動:
sudo update-grub
sudo update-grub2
sudo reboot
如果安裝的是 .deb 格式的核心包,那就更乾淨了。 使用方法與其他包裝一樣。 使用 apt 或 dpkg 卸載它,可以更好地控制系統狀態。
其他發行版的注意事項:Fedora、CentOS 等
雖然本指南主要針對 Debian/Ubuntu/Mint,但其基本邏輯也適用於基於 Red Hat 的發行版,例如 Fedora 或 CentOS。具體有哪些不同? 軟體包管理工具、一些依賴項名稱以及如何存取啟動管理器.
例如,在 Fedora/CentOS 系統中,從 kernel.org 編譯核心的基本工作流程可能是:
- 安裝開發工具:
su -c 'yum groupinstall "Development Tools"'
su -c 'yum install ncurses-devel qt-devel unifdef' - 下載穩定版本(例如經典範例中的 2.6.36):
cd /tmp
wget http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.36.tar.bz2 - 解壓縮並準備原始碼樹:
mkdir /usr/src/linux
tar -xjvf linux-2.6.36.tar.bz2 -C /usr/src/linux
cd /usr/src/linux - 使用 menuconfig、xconfig 或 gconfig 配置核心。
- 編譯安裝:
make
make modules
make modules_install
make install
然後您需要進行審核和編輯 /boot/grub/grub.conf (或等效文件,取決於您使用的是 GRUB Legacy、GRUB2 等)為新核心及其對應的 initrd 新增條目,務必仔細檢查路徑。 根= 如果使用 LVM,則需要引用邏輯磁碟區。
編譯、配置和安裝自訂 Linux 核心是一個漫長但極具啟發性的過程:它迫使你了解啟動所需的模組、哪些選項對你的服務(例如 Docker 或虛擬化)至關重要、initramfs 和 GRUB 如何整合到啟動過程中,以及如何始終保留回退選項以便在出現問題時恢復到先前的核心版本。如果你花時間仔細閱讀每個部分,巧妙地重複使用目前的核心配置,並養成逐步測試變更的習慣,最終就能擁有一個真正強大的系統。 更加優化,更適合您的硬件,並符合您的實際需求 比大多數分佈的通用核函數所提供的更好。
對字節世界和一般技術充滿熱情的作家。我喜歡透過寫作分享我的知識,這就是我在這個部落格中要做的,向您展示有關小工具、軟體、硬體、技術趨勢等的所有最有趣的事情。我的目標是幫助您以簡單有趣的方式暢遊數位世界。