跳至內容
出自 Arch Linux 中文维基

根據維基百科:

Linux 內核是一個開源的、類 Unix 的、作業系統宏內核。

Arch Linux 基於 Linux 內核。除了最新的穩定內核之外,還有許多各種各樣的 Linux 內核可供選擇。本文列出了倉庫中提供的一些選擇,並對它們簡要介紹。本文還介紹了一些可用的內核補丁。文章的最後總覽了自行編譯內核的方法,並包含各種方法的連結。

內核包安裝/usr/lib/modules/ 路徑下,用於生成 /boot/ 目錄中的 vmlinuz 可執行鏡像[1]。安裝新的內核包後,需重新配置引導加載程序以適配變更。若需降級內核,請參閱降級軟體包#降級內核

官方支持的內核

官方支持的內核可通過論壇漏洞報告獲取社區支持。

  • Stable — 採用了一些補丁的原版 Linux 內核和模塊。
https://www.kernel.org/ || linux
  • Hardened — 注重安全的 Linux 內核,採用一系列加固補丁以緩解內核和用戶空間漏洞。和 linux 相比,它啟用了上游更多的內核加固功能。
https://github.com/anthraxx/linux-hardened || linux-hardened
  • Longterm — 長期支持(LTS)的 Linux 內核及模塊,提供針對伺服器使用場景優化的配置選項。
https://www.kernel.org/ || linux-lts
  • Realtime kernel英語Realtime kernel — 由 Ingo Molnar 領導的核心開發者小組維護。該補丁使內核的幾乎所有部分可被搶占(除少量「raw_spinlock critical regions」(「原始自旋鎖關鍵區域」)代碼段外),通過將大多數內核自旋鎖替換為支持優先級繼承的互斥鎖,並將所有硬體中斷和軟體中斷遷移至內核線程處理實現。
https://wiki.linuxfoundation.org/realtime/start || linux-rtlinux-rt-lts
注意:實時內核支持已併入 Linux 6.12
https://github.com/zen-kernel/zen-kernel || linux-zen

編譯

可通過以下方式編譯內核:

/Arch 構建系統
利用已有的高質量的 linux PKGBUILD 且可受益於包管理系統
/傳統編譯
需要手動下載內核原始碼包,並以普通用戶身份在自己的主目錄中進行編譯。
警告:
  • 使用自定義內核可能會引起各種穩定性和可靠性問題,包括數據丟失。強烈建議操作前進行備份
  • Arch Linux 僅對 #官方支持的內核提供官方支持。若使用非官方支持的內核,務必在請求支持時提及。
提示:
  • 提高系統速度的最佳方法是先根據架構和處理器類型定製內核配置。
  • 可以通過移除不使用的功能模塊來減小內核體積(從而縮短編譯時間)。例如禁用藍牙、video4linux、千兆乙太網等支持。
Arch 內核包的 config 文件位於 Arch 軟體包的源文件中(例如 linux 連結到的 [2])。如果啟用了 CONFIG_IKCONFIG_PROC 內核選項,當前運行的內核的 config 文件也可通過 /proc/config.gz 路徑獲取。

部分列出的軟體包也可通過非官方用戶倉庫獲取預編譯版本。


kernel.org 內核

  • Git — 使用 Linus Torvalds Git 倉庫源碼構建的 Linux 內核及模塊。
https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git || linux-gitAUR
  • Mainline — 每 2~3 個月發布一次的引入所有新功能的內核。
https://www.kernel.org/ || linux-mainlineAUR
  • Next — 包含待合併至下個 Mainline 版本的功能的前沿內核。
https://www.kernel.org/doc/man-pages/linux-next.html || linux-next-gitAUR
  • DRM — 包含前沿 GPU 驅動程序的 Linux 內核。
https://gitlab.freedesktop.org/drm || linux-drm-tip-gitAURlinux-drm-next-gitAUR
  • Longterm — 長期支持(LTS)的 Linux 內核和模塊。
https://www.kernel.org/ || linux-lts66AURlinux-lts61AURlinux-lts515AURlinux-lts510AURlinux-lts54AUR

非官方內核

  • linux-lily — 本站站長 Lilydjwg 使用的內核,包含 cjktty、Android binder 和默認 BBR。這是一個較少更新的內核包,可以通過添加 archlinuxcn 倉庫來安裝。
https://github.com/archlinuxcn/repo/tree/master/archlinuxcn/linux-lily || linux-lilyCNRepo
  • Ck — 包含 Con Kolivas 開發的補丁集(含 MuQSS 調度器),專為提升系統響應速度設計,特別針對桌面環境優化,也適用於其它各類工作負載。
http://ck.kolivas.org/ || linux-ckAUR
  • Clear — 包含 Intel Clear Linux 項目的優化補丁,提供性能與安全增強。
https://github.com/clearlinux-pkgs/linux || linux-clearAUR
https://www.fsfla.org/ikiwiki/selibre/linux-libre/ || linux-libreAUR
  • Liquorix — 基於 Zen 內核源碼並使用 Debian 配置方案構建的替代內核,專為桌面、多媒體和遊戲場景優化,常用作 Debian 性能增強內核。維護者 Damentz 同時也是 Zen 補丁集的開發者。
https://liquorix.net || linux-lqxAUR
  • pf-kernel — 包含多項未合併入主線的前沿特性,由內核工程師維護。若補丁未正式移植到新版內核,項目將提供支持。當前主要特性包含 UKSM、DDCCI、v4l2loopback 和 BBRv3。
https://pfkernel.natalenko.name || 軟體包:
  • Project C — 包含 Alfred Chen 的 Project C 補丁集(含 BMQ 和 PDS 調度器)。
https://gitlab.com/alfredchen/projectc || linux-prjcAUR
  • Nitrous — 針對 Skylake 及更新架構優化的修改版內核。
https://gitlab.com/xdevs23/linux-nitrous || linux-nitrousAUR
  • tkg — 高度可定製的內核構建系統,提供多項性能優化補丁和調校選項(含 CFS、Project C PDS/BMQ、MuQSS 和 CacULE 調度器),由 Etienne Juvigny 維護。
https://github.com/Frogging-Family/linux-tkg || 通過 chaotic-aur 獲取
  • VFIO — 包含 Alex Williamson 開發的補丁(acs override 和 i915),用於在特定設備上實現 KVM PCI 直通功能。
https://lwn.net/Articles/499240/ || linux-vfioAURlinux-vfio-ltsAUR
  • XanMod — 專為高性能工作站、遊戲主機和媒體中心優化,採用 BFQ I/O 調度器、TCP BBRv3 擁塞控制、x86_64 高級指令集支持和部分 Clear Linux 補丁集。
https://xanmod.org/ || linux-xanmodAURlinux-xanmod-ltsAURlinux-xanmod-rtAURlinux-xanmod-boreAUR
  • linux-cachyos — 由 CachyOS 開發的 SCHED-EXT + BORE + Cachy Sauce 增強內核,包含多項優化補丁。
https://github.com/CachyOS/linux-cachyos || linux-cachyosAUR

疑難解答

內核 panic

當 Linux 內核進入不可恢復的故障狀態時,會觸發內核 panic(kernel panic)。該狀態通常由存在缺陷的硬體驅動引發,導致系統死鎖、無響應並需強制重啟。在死鎖發生前,內核會生成診斷信息,包含以下內容:故障發生時的機器狀態(machine state)、指向識別故障的內核函數的調用軌跡(call trace),以及當前已加載的模塊列表。值得慶幸的是,使用主線版本內核(例如官方倉庫所提供的)時,內核 panic 概率較低。但仍需掌握遭遇此情況時的應對方法。

注意:內核 panic 有時也被稱作 oops 或內核 oops(kernel oops)。儘管 panic 和 oops 均由故障狀態引發,但 oops 的範疇更廣——其不一定導致系統死鎖:某些情況下內核可通過終止問題進程繼續運行。
提示:通過以下方式之一可將可恢復的 oops 強制轉為 panic:
  • 啟動時添加內核參數 oops=panic
  • /proc/sys/kernel/panic_on_oops 寫入 1
此設置適用於需嚴格排查因 oops 恢復可能導致的隱蔽性系統不穩定的場景。

檢查 panic 信息

若內核 panic 發生在啟動流程早期,控制台可能顯示含「Kernel panic - not syncing:」的提示信息,而一旦 Systemd 開始運行,內核消息被捕獲並寫入系統日誌。然而,由於 panic 發生時系統會在 system-journald 記錄前即死鎖,故內核輸出的診斷信息幾乎從不寫入磁碟日誌。因此,查看 panic 信息(不配置 kdump crashkernel 的情況下)的唯一方式是在觸發時通過控制台實時觀察。可通過以下內核參數啟動系統,並嘗試在 tty1 復現 panic:

systemd.journald.forward_to_console=1 console=tty1
提示:若 panic 信息滾動過快難以查看,可嘗試添加內核參數 pause_on_oops=secondsseconds 為暫停秒數)來凍結屏幕輸出。
示例:問題模塊分析

通過診斷信息可推測引發 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
  1. 指出引發 panic 的錯誤類型,本例為程序缺陷
  2. 顯示 panic 發生在 firewire_core 模塊的 fw_core_init 函數
  3. 顯示最近加載的模塊是 firewire_core
  4. 顯示調用 fw_core_init 的上層函數是 do_one_initcall
  5. 確認該 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(bisect),並按內核項目回歸問題報告流程提交錯誤報告。具體報告途徑需根據 MAINTAINERS 文件中標註的 Bugtracker(B: 條目)選擇:子系統郵件列表、Kernel Bugzilla 或 DRM Gitlab 等平台。測試時需確保使用未打補丁的「原版」內核以排除第三方修改影響。若確認補丁引發問題,請直接聯繫補丁作者。

注意:由於需要多次編譯不同版本內核,內核二分排查可能耗時較長。

精簡內核構建

通過以下方式可顯著縮短內核編譯時間:

  • 使用 modprobed-db英語modprobed-db 工具僅編譯本地系統所需的模塊
  • 運行 make localmodconfig 自動生成最小化配置

調試特定子系統時(如網絡問題),可完全移除無關驅動(例如音效卡驅動)以進一步精簡配置。

參見