Product SiteDocumentation Site

8.10. 編譯核心

Debian 的核心儘量納入所有的功能,以及最多的驅動程式,以便涵蓋現在的硬體組態。所以,有些使用者寧願自行編譯祗包括所需的核心。這麼做有兩個理由。第一,記憶體用量較小,核心程式碼,即使未用到,也佔有記憶體的空間 (而且永遠不 “離開” 置換記憶體,因為它用到實際的 RAM),降低系統的整體效能。在地自行編譯的核心也限制了安全問題的範圍,因為祗編譯與執行部份核心碼。
使用祗在補丁內的功能 (不在標準的核心內) 時,就必須重新編譯核心。

8.10.1. 簡介和先決條件

Debian 以套件方式管理核心,與傳統的編譯安裝不同調。核心還是在套件系統的控制下,可以被完整移除,或布建在多個機器上。與該等套件有關的腳本自動與啟動程式和 initrd 產生器互動。
上游的 Linux 原始碼包括建置 Debian 核心套件所需的一切。但是仍可再安裝 build-essential 以確保擁有建立 Debian 套件所需的所有工具。而且,組態核心時需要 libncurses5-dev 套件。最後,fakeroot 套件將在不使用管理者權限的前提下,啟用新增 Debian 套件。

8.10.2. 取得原始碼

就像 Debian 系統內其他有用的東西,Linux 核心原始碼也位在套件內。祗要安裝 linux-source-version 套件,就能取得全部的原始碼。apt-cache search ^linux-source 命令列出 Debian 內各種版本的核心套件。最新的版本在 Unstable 發行版內:可以毫不費力的取得 (尤其是把 APT 根據 節 6.2.6, “在多個發行版工作” 的指示組態後)。這些套件內的原始碼並未完全吻合 Linus Torvalds 與其他核心發展者釋出的內容;如同其他的發行版,Debian 以一系列的補丁搭配,這些補丁可能 (或不可能) 以自己的方法納入 Linux 上游的版本。包括從較新核心版本的 fixes/features/drivers 反向移殖,功能較新但尚未 (全部) 合併入上游的Linux 樹,甚至 Debian 特別的改變。
本節其他內容以 Linux 核心 3.16 版為準,範例則不以此為限,可以調整為特定的核心版本。
假設 linux-source-3.16 套件已安裝好了。包括 /usr/src/linux-source-3.16.tar.xz,核心原始碼的壓縮檔。在另個資料夾解縮 (不能直接在 /usr/src/ 之下,因為不需特別的授權就可以重新編譯 Linux 核心):~/kernel/ 是個不錯的選擇。
$ mkdir ~/kernel; cd ~/kernel
$ tar -xaf /usr/src/linux-source-3.16.tar.xz

8.10.3. 組態核心

下個步驟是根據需要組態核心。確切的程序視需要而訂。
重新編譯較新版本的核心 (可能連同其補丁) 時,應儘量採用 Debian 建議的組態。在此情況下,與其從最基本開始重新編譯,不妨複製 /boot/config-version 檔案 (核心正在使用的版本,可以 uname -r 命令查看) 進入核心原始所在資料夾內的 .config 檔案。
$ cp /boot/config-3.16.0-4-amd64 ~/kernel/linux-source-3.16/.config
需要改變組態的話,就跳至 節 8.10.4, “編譯與建立套件”。或者從基本開始重新組態,就需花時間組態核心。在核心原始碼的資料夾內有很多專屬介面,供呼叫 make target 命令,讓 target 是下列的其中一個值。
make menuconfig 編譯並執行文字模式介面 (即 libncurses5-dev 套件必備) 以階層結構瀏覽可用的選項。按 空格 鍵改變選定的值,並按螢幕下方的 Enter 鈕;Select 送回選定的次選單;Exit 關閉當前的螢幕並回到上個階層;Help 顯示選項的詳細資訊。箭頭鍵在選項及按鈕清單內動。按主選單的 Exit 鈕,就可離開組態程式。此程式可儲存改變的組態;接受改變後的組態。
其他的介面也有類似的功能,但在現代化的圖形介面運作;諸如 make xconfig 使用 Qt 圖形介面,而 make gconfig 使手 GTK+。前者用到 libqt4-dev,後者依賴 libglade2-devlibgtk2.0-dev
使用這些組態介面時,建議從合理的預設組態開始。提供該等組態的核心在 arch/arch/configs/*_defconfig,然後可將選定的組態置於像 make x86_64_defconfig (64 位元電腦) 或 make i386_defconfig (32 位元電腦) 這樣的命令。

8.10.4. 編譯與建立套件

核心組態完成後,make deb-pkg 命令可產生至多 5 個 Debian 套件:linux-image-version 包括核心映像與相關的模組,linux-headers-version 包括建立外部模組所需的標頭檔案,linux-firmware-image-version 包括某些驅動程式所需的韌體 (由 Debian 提供的核心原始檔建立時,可能沒有該套件),linux-image-version-dbg 包括供套件映像及其模組的除錯符號,以及linux-libc-dev 包括 GNU glibc 之類與使用者程式庫相關的標頭。
version 由並列的上游版本決定 (如同變數 VERSIONPATCHLEVELSUBLEVELEXTRAVERSIONMakefile 內所定)、並列的 LOCALVERSION 組態參數、以及並列的 LOCALVERSION 環境變數。套件版本使用同版本字串以及新增的附加版本 (並儲存在 .version),除非以 KDEB_PKGVERSION 環境變數覆寫它們。
$ make deb-pkg LOCALVERSION=-falcot KDEB_PKGVERSION=$(make kernelversion)-1
[...]
$ ls ../*.deb
../linux-headers-3.16.7-ckt4-falcot_3.16.7-1_amd64.deb
../linux-image-3.16.7-ckt4-falcot_3.16.7-1_amd64.deb
../linux-image-3.16.7-ckt4-falcot-dbg_3.16.7-1_amd64.deb
../linux-libc-dev_3.16.7-1_amd64.deb

8.10.5. 編譯外部模組

部份模組由 Linux 官方核心之外維護。使用時,必須與匹配的核心一起編譯。若干常見的第三方模組由 Debian 指定套件提供,諸如 xtables-addons-source (iptables 的外部模組) 或 oss4-source (Open Sound System,某些額外的音效驅動程式)。
這些外部套件極多且雜,在此無法全部列舉;apt-cache search source$ 命令可縮小搜尋的範圍。然而,完整的清單沒什麼用處,祗有明確知道需要時,才會編譯特定的外部模組。在這個情況下,設備的文件會詳述 Linux 環境所需的模組。
xtables-addons-source 套件為例:安裝之後,模組原始檔 .tar.bz2 儲存在 /usr/src/。可以手動解開該壓縮檔並建立模組,也可用 DKMS 自動做它。大部份模組提供必要的 DKMS 以 -dkms 後置文字整合入套件。在本例中,安裝 xtables-addons-dkms 就是為當前核心編譯核心模組,前提是有匹配已安裝核心的 linux-headers-* 套件。例如,使用 linux-image-amd64,則應同時安裝 linux-headers-amd64
$ sudo apt install xtables-addons-dkms

[...]
Setting up xtables-addons-dkms (2.6-1) ...
Loading new xtables-addons-2.6 DKMS files...
First Installation: checking all kernels...
Building only for 3.16.0-4-amd64
Building initial module for 3.16.0-4-amd64
Done.

xt_ACCOUNT:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/3.16.0-4-amd64/updates/dkms/
[...]
DKMS: install completed.
$ sudo dkms status
xtables-addons, 2.6, 3.16.0-4-amd64, x86_64: installed
$ sudo modinfo xt_ACCOUNT
filename:       /lib/modules/3.16.0-4-amd64/updates/dkms/xt_ACCOUNT.ko
license:        GPL
alias:          ipt_ACCOUNT
author:         Intra2net AG <opensource@intra2net.com>
description:    Xtables: per-IP accounting for large prefixes
[...]

8.10.6. 使用核心補丁

因為不夠成熟或核心維護者意見不一致,很多功能未列入標準的核心。這種功能就以補丁的型式發行,任何人都可以自由地把它維入核心原始碼。
Debian 以 linux-patch-*kernel-patch-* 方式散布這些套件 (例如,linux-patch-grsecurity2,可以緊縮核心的安全政策)。這些套件安裝的檔案在 /usr/src/kernel-patches/ 資料夾內。
在原始檔資料夾內,以 patch 命令編譯核心,就能夠納入前述安裝的補丁。
$ cd ~/kernel/linux-source-3.16
$ make clean
$ zcat /usr/src/kernel-patches/diffs/grsecurity2/grsecurity-3.0-3.17.1-201410250027.patch.gz | patch -p1
有些補丁不見得適用於每個核心版本;以 patch 可能無法應用於核心原始碼。將出現錯誤訊息且提示錯誤的原因;在此情況下,參照 Debian 補丁套件的文件 (位於 /usr/share/doc/linux-patch-*/ 資料夾)。大部份的情況下,維護者會指出其補丁適用的核心版本。