在Debian系統(tǒng)中,內(nèi)核是操作系統(tǒng)的核心,它負(fù)責(zé)管理硬件資源并與應(yīng)用程序交互。本教程將介紹關(guān)于Debian內(nèi)核的一些基本概念和操作技巧,包括內(nèi)核參數(shù)的配置、內(nèi)核頭文件的作用、編譯內(nèi)核及其相關(guān)模塊的方法,以及按照Debian內(nèi)核團(tuán)隊的推薦來編譯內(nèi)核源代碼等方面。
一、內(nèi)核參數(shù)
許多 Linux 特性可以按下面的方式,通過內(nèi)核參數(shù)來配置:
- 內(nèi)核參數(shù)通過 bootloader 初始化;
- 對通過 sysfs 訪問的內(nèi)核參數(shù),在運行時通過 sysctl(8) 修改;
- 當(dāng)一個模塊被激活時,通過 modprobe(8) 參數(shù)來設(shè)置模塊參數(shù)。
二、內(nèi)核頭文件
大部分普通程序編譯時不需要內(nèi)核頭文件,如果你直接使用它們來編譯,甚至?xí)?dǎo)致編譯中斷。在 Debian 系統(tǒng)上,普通程序編譯依賴 libc6-dev 軟件包 (由 glibc 源代碼包創(chuàng)建)提供的,在”/usr/include/linux” 和 “/usr/include/asm” 里的頭文件。
對于編譯一些內(nèi)核相關(guān)的程序,比如說從外部源代碼編譯的內(nèi)核模塊和 automounter 后臺守護(hù)(daemon)程序(amd),你必須包含相應(yīng)的內(nèi)核頭文件到路徑里,比如”-I/usr/src/linux-particular-version/include/”, 到你的命令行。
三、編譯內(nèi)核/相關(guān)模塊
Debian 有它自己的方式來編譯內(nèi)核和相關(guān)模塊。
Debian 系統(tǒng)內(nèi)核編譯需要安裝的主要軟件包列表:
軟件包 | 流行度 | 大小 | 說明 |
build-essential | I:481 | 17 | 創(chuàng)建 Debian 軟件包所必須的軟件包: make, gcc, … |
bzip2 | V:161, I:969 | 112 | bz2 文件壓縮和解壓縮工具 |
libncurses5-dev | I:73 | 6 | ncurses 開發(fā)者庫和文檔 |
git | V:345, I:547 | 46734 | git:Linux 內(nèi)核使用的分布式版本控制系統(tǒng) |
fakeroot | V:28, I:489 | 224 | 為非 root 用戶創(chuàng)建軟件包提供一個偽造的 root 環(huán)境 |
initramfs-tools | V:429, I:989 | 113 | 創(chuàng)建 initramfs 的工具(Debian 規(guī)范) |
dkms | V:75, I:164 | 195 | 動態(tài)內(nèi)核模塊支持 dynamic kernel module support (DKMS) (通用) |
module-assistant | V:1, I:20 | 406 | 制作模塊軟件包的幫助工具(Debian 規(guī)范) |
devscripts | V:6, I:41 | 2658 | Debian 軟件包維護(hù)者的幫助腳本(Debian 規(guī)范) |
在編譯 Linux 內(nèi)核源代碼時,請不要放置從”/usr/include/linux” 和 “/usr/include/asm” 到源代碼樹(比如:”/usr/src/linux*”) 里目錄的符號鏈接。
當(dāng)在 Debian stable 版里編譯最新的 Linux 內(nèi)核時, 可能需要使用一些從 Debian unstable 版里 向后移植(backported)的工具的最新版本。
module-assistant(8) (或者它的短形式 m-a) 幫助用戶,從一個或多個定制的內(nèi)核,容易的構(gòu)建和安裝模塊軟件包。
dynamic kernel module support (DKMS)動態(tài)內(nèi)核模塊支持 是一個新的分布式獨立框架,被設(shè)計用來允許單個的內(nèi)核模塊在不改變整個內(nèi)核的情況下升級。這可以用于維護(hù)內(nèi)核代碼樹外部的模塊。這也使你升級內(nèi)核時,重新編譯模塊變得非常簡單。
四、編譯內(nèi)核源代碼
從上游內(nèi)核源代碼編譯個性化的內(nèi)核二進(jìn)制包,你應(yīng)當(dāng)使用由它提供的 “deb-pkg” 對象。
$ sudo apt-get build-dep linux $ cd /usr/src $ wget https://mirrors.edge.kernel.org/pub/linux/kernel/v6.x/linux-version.tar.xz $ tar --xz -xvf linux-version.tar.xz $ cd linux-version $ cp /boot/config-version .config $ make menuconfig ... $ make deb-pkg
linux-source-version 軟件包使用 “/usr/src/linux-version.tar.bz2” 提供有 Debian 補丁的 Linux內(nèi)核源代碼。
從 Debian 內(nèi)核源代碼軟件包編譯特定的二進(jìn)制包,你應(yīng)當(dāng)使用 “debian/rules.gen” 里的 “binary-arch_architecture_featureset_flavour” 對象。
$ sudo apt-get build-dep linux $ apt-get source linux $ cd linux-3.* $ fakeroot make -f debian/rules.gen binary-arch_i386_none_686
五、硬件驅(qū)動和固件
硬件驅(qū)動是運行在目標(biāo)系統(tǒng)上主 CPU 上的代碼。大部分硬件驅(qū)動現(xiàn)在是自由軟件,已經(jīng)包含在普通的 Debian 內(nèi)核軟件包里,放在 main 區(qū)域。
1、GPU 驅(qū)動。
- Intel GPU 驅(qū)動 (main);
- AMD/ATI GPU 驅(qū)動 (main)和/;
- NVIDIA GPU 驅(qū)動 (nouveau 驅(qū)動放在 main , 由廠家支持的二進(jìn)制驅(qū)動,放在 non-free.)。
固件是加載在連接在目標(biāo)系統(tǒng)設(shè)備上的代碼或數(shù)據(jù)(比如說,CPU microcode、 GPU 運行的渲染代碼 或 FPGA / CPLD 數(shù)據(jù)……)部分固件包是作為自由軟件存在,但是很多固件包由于包含有沒有源代碼的數(shù)據(jù),二進(jìn)制不是作為自由軟件存在。安裝這些固件數(shù)據(jù)是必需的,這樣設(shè)備才能按期望運行。
2、固件數(shù)據(jù)軟件包,含有加載到目標(biāo)設(shè)備易失性存儲器上的數(shù)據(jù)。
- firmware-linux-free (main);
- firmware-linux-nonfree (non-free-firmware);
- firmware-linux-* (non-free-firmware);
- *-firmware (non-free-firmware);
- intel-microcode (non-free-firmware);
- amd64-microcode (non-free-firmware)。
3、固件更新程序軟件包,更新在目標(biāo)設(shè)備非易失性存儲器上的數(shù)據(jù)。
- fwupd (main):從 Linux Vendor Firmware Service 下載固件數(shù)據(jù)的固件更新后臺守護(hù)進(jìn)程(daemon);
- gnome-firmware (main): fwupd 的 GTK 前端;
- plasma-discover-backend-fwupd (main): fwupd 的 Qt 前端。
注意:
- 從 Debian 12 Bookworm 開始,用戶使用由官方安裝介質(zhì)里面提供的 non-free-firmware 軟件包來提供完善的安裝體驗。
- fwupd 從 Linux Vendor Firmware Service 下載的固件數(shù)據(jù)并加載到正在運行的 Linux 內(nèi)核,可能是 non-free。