根據維基百科:
- Linux 內核是一個開源的、類 Unix 的、作業系統宏內核。
Arch Linux 基於 Linux 內核。除了最新的穩定內核之外,還有許多各種各樣的 Linux 內核可供選擇。本文列出了倉庫中提供的一些選擇,並對它們簡要介紹。本文還介紹了一些可用的內核補丁。文章的最後總覽了自行編譯內核的方法,並包含各種方法的連結。
內核包安裝在 /usr/lib/modules/
路徑下,用於生成 /boot/
目錄中的 vmlinuz 可執行鏡像[1]。安裝新的內核包後,需重新配置引導加載程序以適配變更。若需降級內核,請參閱降級軟體包#降級內核。
官方支持的內核
- Stable — 採用了一些補丁的原版 Linux 內核和模塊。
- Hardened — 注重安全的 Linux 內核,採用一系列加固補丁以緩解內核和用戶空間漏洞。和 linux包 相比,它啟用了上游更多的內核加固功能。
- Longterm — 長期支持(LTS)的 Linux 內核及模塊,提供針對伺服器使用場景優化的配置選項。
- Realtime kernel — 由 Ingo Molnar 領導的核心開發者小組維護。該補丁使內核的幾乎所有部分可被搶占(除少量「raw_spinlock critical regions」(「原始自旋鎖關鍵區域」)代碼段外),通過將大多數內核自旋鎖替換為支持優先級繼承的互斥鎖,並將所有硬體中斷和軟體中斷遷移至內核線程處理實現。
- https://wiki.linuxfoundation.org/realtime/start || linux-rt包、linux-rt-lts包
- 注意:實時內核支持已併入 Linux 6.12
編譯
可通過以下方式編譯內核:
- /Arch 構建系統
- 利用已有的高質量的
linux
PKGBUILD 且可受益於包管理系統。 - /傳統編譯
- 需要手動下載內核原始碼包,並以普通用戶身份在自己的主目錄中進行編譯。
- 提高系統速度的最佳方法是先根據架構和處理器類型定製內核配置。
- 可以通過移除不使用的功能模塊來減小內核體積(從而縮短編譯時間)。例如禁用藍牙、video4linux、千兆乙太網等支持。
config
文件位於 Arch 軟體包的源文件中(例如 linux包 連結到的 [2])。如果啟用了 CONFIG_IKCONFIG_PROC
內核選項,當前運行的內核的 config
文件也可通過 /proc/config.gz
路徑獲取。部分列出的軟體包也可通過非官方用戶倉庫獲取預編譯版本。
kernel.org 內核
- Git — 使用 Linus Torvalds Git 倉庫源碼構建的 Linux 內核及模塊。
- Mainline — 每 2~3 個月發布一次的引入所有新功能的內核。
- Next — 包含待合併至下個 Mainline 版本的功能的前沿內核。
- DRM — 包含前沿 GPU 驅動程序的 Linux 內核。
- Longterm — 長期支持(LTS)的 Linux 內核和模塊。
- https://www.kernel.org/ || linux-lts66AUR、linux-lts61AUR、linux-lts515AUR、linux-lts510AUR、linux-lts54AUR
非官方內核
- linux-lily — 本站站長 Lilydjwg 使用的內核,包含 cjktty、Android binder 和默認 BBR。這是一個較少更新的內核包,可以通過添加 archlinuxcn 倉庫來安裝。
- Ck — 包含 Con Kolivas 開發的補丁集(含 MuQSS 調度器),專為提升系統響應速度設計,特別針對桌面環境優化,也適用於其它各類工作負載。
- Clear — 包含 Intel Clear Linux 項目的優化補丁,提供性能與安全增強。
- Liquorix — 基於 Zen 內核源碼並使用 Debian 配置方案構建的替代內核,專為桌面、多媒體和遊戲場景優化,常用作 Debian 性能增強內核。維護者 Damentz 同時也是 Zen 補丁集的開發者。
- pf-kernel — 包含多項未合併入主線的前沿特性,由內核工程師維護。若補丁未正式移植到新版內核,項目將提供支持。當前主要特性包含 UKSM、DDCCI、v4l2loopback 和 BBRv3。
-
https://pfkernel.natalenko.name || 軟體包:
- 通過 post-factum kernels 倉庫獲取或使用 linux-pfAUR(由開發者 post-factum 維護)
- Project C — 包含 Alfred Chen 的 Project C 補丁集(含 BMQ 和 PDS 調度器)。
- Nitrous — 針對 Skylake 及更新架構優化的修改版內核。
- tkg — 高度可定製的內核構建系統,提供多項性能優化補丁和調校選項(含 CFS、Project C PDS/BMQ、MuQSS 和 CacULE 調度器),由 Etienne Juvigny 維護。
- VFIO — 包含 Alex Williamson 開發的補丁(acs override 和 i915),用於在特定設備上實現 KVM PCI 直通功能。
- XanMod — 專為高性能工作站、遊戲主機和媒體中心優化,採用 BFQ I/O 調度器、TCP BBRv3 擁塞控制、x86_64 高級指令集支持和部分 Clear Linux 補丁集。
- linux-cachyos — 由 CachyOS 開發的 SCHED-EXT + BORE + Cachy Sauce 增強內核,包含多項優化補丁。
疑難解答
內核 panic
當 Linux 內核進入不可恢復的故障狀態時,會觸發內核 panic(kernel panic)。該狀態通常由存在缺陷的硬體驅動引發,導致系統死鎖、無響應並需強制重啟。在死鎖發生前,內核會生成診斷信息,包含以下內容:故障發生時的機器狀態(machine state)、指向識別故障的內核函數的調用軌跡(call trace),以及當前已加載的模塊列表。值得慶幸的是,使用主線版本內核(例如官方倉庫所提供的)時,內核 panic 概率較低。但仍需掌握遭遇此情況時的應對方法。
- 啟動時添加內核參數
oops=panic
- 向
/proc/sys/kernel/panic_on_oops
寫入1
檢查 panic 信息
若內核 panic 發生在啟動流程早期,控制台可能顯示含「Kernel panic - not syncing:」的提示信息,而一旦 Systemd 開始運行,內核消息應被捕獲並寫入系統日誌。然而,由於 panic 發生時系統會在 system-journald
記錄前即死鎖,故內核輸出的診斷信息幾乎從不寫入磁碟日誌。因此,查看 panic 信息(不配置 kdump crashkernel 的情況下)的唯一方式是在觸發時通過控制台實時觀察。可通過以下內核參數啟動系統,並嘗試在 tty1 復現 panic:
systemd.journald.forward_to_console=1 console=tty1
pause_on_oops=seconds
(seconds 為暫停秒數)來凍結屏幕輸出。示例:問題模塊分析
通過診斷信息可推測引發 panic 的子系統或模塊。本例展示某虛擬設備啟動時發生的 panic,請關注粗體標記的關鍵行:
kernel: BUG: unable to handle kernel NULL pointer dereference at (null) 1 kernel: IP: fw_core_init+0x18/0x1000 [firewire_core] 2 kernel: PGD 718d00067 kernel: P4D 718d00067 kernel: PUD 7b3611067 kernel: PMD 0 kernel: kernel: Oops: 0002 [#1] PREEMPT SMP kernel: Modules linked in: firewire_core(+) crc_itu_t cfg80211 rfkill ipt_REJECT nf_reject_ipv4 nf_log_ipv4 nf_log_common xt_LOG nf_conntrack_ipv4 ... 3 kernel: CPU: 6 PID: 1438 Comm: modprobe Tainted: P O 4.13.3-1-ARCH #1 kernel: Hardware name: Gigabyte Technology Co., Ltd. H97-D3H/H97-D3H-CF, BIOS F5 06/26/2014 kernel: task: ffff9c667abd9e00 task.stack: ffffb53b8db34000 kernel: RIP: 0010:fw_core_init+0x18/0x1000 [firewire_core] kernel: RSP: 0018:ffffb53b8db37c68 EFLAGS: 00010246 kernel: RAX: 0000000000000000 RBX: 0000000000000000 RCX: 0000000000000000 kernel: RDX: 0000000000000000 RSI: 0000000000000008 RDI: ffffffffc16d3af4 kernel: RBP: ffffb53b8db37c70 R08: 0000000000000000 R09: ffffffffae113e95 kernel: R10: ffffe93edfdb9680 R11: 0000000000000000 R12: ffffffffc16d9000 kernel: R13: ffff9c6729bf8f60 R14: ffffffffc16d5710 R15: ffff9c6736e55840 kernel: FS: 00007f301fc80b80(0000) GS:ffff9c675dd80000(0000) knlGS:0000000000000000 kernel: CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 kernel: CR2: 0000000000000000 CR3: 00000007c6456000 CR4: 00000000001406e0 kernel: Call Trace: kernel: do_one_initcall+0x50/0x190 4 kernel: ? do_init_module+0x27/0x1f2 kernel: do_init_module+0x5f/0x1f2 kernel: load_module+0x23f3/0x2be0 kernel: SYSC_init_module+0x16b/0x1a0 kernel: ? SYSC_init_module+0x16b/0x1a0 kernel: SyS_init_module+0xe/0x10 kernel: entry_SYSCALL_64_fastpath+0x1a/0xa5 kernel: RIP: 0033:0x7f301f3a2a0a kernel: RSP: 002b:00007ffcabbd1998 EFLAGS: 00000246 ORIG_RAX: 00000000000000af kernel: RAX: ffffffffffffffda RBX: 0000000000c85a48 RCX: 00007f301f3a2a0a kernel: RDX: 000000000041aada RSI: 000000000001a738 RDI: 00007f301e7eb010 kernel: RBP: 0000000000c8a520 R08: 0000000000000001 R09: 0000000000000085 kernel: R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000c79208 kernel: R13: 0000000000c8b4d8 R14: 00007f301e7fffff R15: 0000000000000030 kernel: Code: <c7> 04 25 00 00 00 00 01 00 00 00 bb f4 ff ff ff e8 73 43 9c ec 48 kernel: RIP: fw_core_init+0x18/0x1000 [firewire_core] RSP: ffffb53b8db37c68 kernel: CR2: 0000000000000000 kernel: ---[ end trace 71f4306ea1238f17 ]--- kernel: Kernel panic - not syncing: Fatal exception 5 kernel: Kernel Offset: 0x80000000 from 0xffffffff810000000 (relocation range: 0xffffffff800000000-0xfffffffffbffffffff kernel: ---[ end Kernel panic - not syncing: Fatal exception
- 指出引發 panic 的錯誤類型,本例為程序缺陷
- 顯示 panic 發生在
firewire_core
模塊的fw_core_init
函數 - 顯示最近加載的模塊是
firewire_core
- 顯示調用
fw_core_init
的上層函數是do_one_initcall
- 確認該 oops 實際已成為 panic,系統進入死鎖
由此可推斷 panic 發生於 firewire_core
模塊加載時的初始化例程(可能是該版本 FireWire 驅動存在程序錯誤,導致與硬體不兼容)。臨時解決方案是阻止該模塊加載:
- 若模塊在 initramfs 階段加載:使用內核參數
rd.blacklist=firewire_core
重啟 - 其他情況:使用內核參數
module_blacklist=firewire_core
重啟
調試回歸問題
可嘗試安裝 linux-mainlineAUR 以確認問題是否已在上游修復。軟體包評論區置頂說明中提及的預編譯內核倉庫可避免耗時的手動編譯。
若問題非近期出現,建議測試 Arch Linux Archive 中的舊版 LTS 內核(linux-lts包)。
若問題仍存,請對 linux-gitAUR 內核進行二分排查(bisect),並按內核項目回歸問題報告流程提交錯誤報告。具體報告途徑需根據 MAINTAINERS
文件中標註的 Bugtracker(B:
條目)選擇:子系統郵件列表、Kernel Bugzilla 或 DRM Gitlab 等平台。測試時需確保使用未打補丁的「原版」內核以排除第三方修改影響。若確認補丁引發問題,請直接聯繫補丁作者。
精簡內核構建
通過以下方式可顯著縮短內核編譯時間:
- 使用 modprobed-db 工具僅編譯本地系統所需的模塊
- 運行
make localmodconfig
自動生成最小化配置
調試特定子系統時(如網絡問題),可完全移除無關驅動(例如音效卡驅動)以進一步精簡配置。
參見
- O'Reilly - Linux Kernel in a Nutshell(免費電子書)
- What Stable Kernel Should I Use?(Greg Kroah-Hartman 撰文)
- Linux 內核官方文檔