Debian 的核心儘量納入所有的功能,以及最多的驅動程式,以便涵蓋現在的硬體組態。所以,有些使用者寧願自行編譯祗包括所需的核心。這麼做有兩個理由。第一,記憶體用量較小,核心程式碼,即使未用到,也佔有記憶體的空間 (而且永遠不 “離開” 置換記憶體,因為它用到實際的 RAM),降低系統的整體效能。在地自行編譯的核心也限制了安全問題的範圍,因為祗編譯與執行部份核心碼。
使用祗在補丁內的功能 (不在標準的核心內) 時,就必須重新編譯核心。
Debian 以套件方式管理核心,與傳統的編譯安裝不同調。核心還是在套件系統的控制下,可以被完整移除,或布建在多個機器上。與該等套件有關的腳本自動與啟動程式和 initrd 產生器互動。
上游的 Linux 原始碼包括建置 Debian 核心套件所需的一切。但是仍可再安裝 build-essential 以確保擁有建立 Debian 套件所需的所有工具。而且,組態核心時需要 libncurses5-dev 套件。最後,fakeroot 套件將在不使用管理者權限的前提下,啟用新增 Debian 套件。
就像 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
下個步驟是根據需要組態核心。確切的程序視需要而訂。
重新編譯較新版本的核心 (可能連同其補丁) 時,應儘量採用 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-dev 與 libgtk2.0-dev。
使用這些組態介面時,建議從合理的預設組態開始。提供該等組態的核心在 arch/arch/configs/*_defconfig
,然後可將選定的組態置於像 make x86_64_defconfig
(64 位元電腦) 或 make i386_defconfig
(32 位元電腦) 這樣的命令。
核心組態完成後,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 由並列的上游版本決定 (如同變數 VERSION
、PATCHLEVEL
、SUBLEVEL
與 EXTRAVERSION
在 Makefile
內所定)、並列的 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
部份模組由 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
[...]
因為不夠成熟或核心維護者意見不一致,很多功能未列入標準的核心。這種功能就以補丁的型式發行,任何人都可以自由地把它維入核心原始碼。
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-*/
資料夾)。大部份的情況下,維護者會指出其補丁適用的核心版本。