在Debian系统中,内核是操作系统的核心,它负责管理硬件资源并与应用程序交互。本教程将介绍关于Debian内核的一些基本概念和操作技巧,包括内核参数的配置、内核头文件的作用、编译内核及其相关模块的方法,以及按照Debian内核团队的推荐来编译内核源代码等方面。
一、内核参数
许多 Linux 特性可以按下面的方式,通过内核参数来配置:
- 内核参数通过 bootloader 初始化;
- 对通过 sysfs 访问的内核参数,在运行时通过 sysctl(8) 修改;
- 当一个模块被激活时,通过 modprobe(8) 参数来设置模块参数。
二、内核头文件
大部分普通程序编译时不需要内核头文件,如果你直接使用它们来编译,甚至会导致编译中断。在 Debian 系统上,普通程序编译依赖 libc6-dev 软件包 (由 glibc 源代码包创建)提供的,在”/usr/include/linux” 和 “/usr/include/asm” 里的头文件。
对于编译一些内核相关的程序,比如说从外部源代码编译的内核模块和 automounter 后台守护(daemon)程序(amd),你必须包含相应的内核头文件到路径里,比如”-I/usr/src/linux-particular-version/include/”, 到你的命令行。
三、编译内核/相关模块
Debian 有它自己的方式来编译内核和相关模块。
Debian 系统内核编译需要安装的主要软件包列表:
软件包 | 流行度 | 大小 | 说明 |
build-essential | I:481 | 17 | 创建 Debian 软件包所必须的软件包: make, gcc, … |
bzip2 | V:161, I:969 | 112 | bz2 文件压缩和解压缩工具 |
libncurses5-dev | I:73 | 6 | ncurses 开发者库和文档 |
git | V:345, I:547 | 46734 | git:Linux 内核使用的分布式版本控制系统 |
fakeroot | V:28, I:489 | 224 | 为非 root 用户创建软件包提供一个伪造的 root 环境 |
initramfs-tools | V:429, I:989 | 113 | 创建 initramfs 的工具(Debian 规范) |
dkms | V:75, I:164 | 195 | 动态内核模块支持 dynamic kernel module support (DKMS) (通用) |
module-assistant | V:1, I:20 | 406 | 制作模块软件包的帮助工具(Debian 规范) |
devscripts | V:6, I:41 | 2658 | Debian 软件包维护者的帮助脚本(Debian 规范) |
在编译 Linux 内核源代码时,请不要放置从”/usr/include/linux” 和 “/usr/include/asm” 到源代码树(比如:”/usr/src/linux*”) 里目录的符号链接。
当在 Debian stable 版里编译最新的 Linux 内核时, 可能需要使用一些从 Debian unstable 版里 向后移植(backported)的工具的最新版本。
module-assistant(8) (或者它的短形式 m-a) 帮助用户,从一个或多个定制的内核,容易的构建和安装模块软件包。
dynamic kernel module support (DKMS)动态内核模块支持 是一个新的分布式独立框架,被设计用来允许单个的内核模块在不改变整个内核的情况下升级。这可以用于维护内核代码树外部的模块。这也使你升级内核时,重新编译模块变得非常简单。
四、编译内核源代码
从上游内核源代码编译个性化的内核二进制包,你应当使用由它提供的 “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内核源代码。
从 Debian 内核源代码软件包编译特定的二进制包,你应当使用 “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
五、硬件驱动和固件
硬件驱动是运行在目标系统上主 CPU 上的代码。大部分硬件驱动现在是自由软件,已经包含在普通的 Debian 内核软件包里,放在 main 区域。
1、GPU 驱动。
- Intel GPU 驱动 (main);
- AMD/ATI GPU 驱动 (main)和/;
- NVIDIA GPU 驱动 (nouveau 驱动放在 main , 由厂家支持的二进制驱动,放在 non-free.)。
固件是加载在连接在目标系统设备上的代码或数据(比如说,CPU microcode、 GPU 运行的渲染代码 或 FPGA / CPLD 数据……)部分固件包是作为自由软件存在,但是很多固件包由于包含有没有源代码的数据,二进制不是作为自由软件存在。安装这些固件数据是必需的,这样设备才能按期望运行。
2、固件数据软件包,含有加载到目标设备易失性存储器上的数据。
- 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、固件更新程序软件包,更新在目标设备非易失性存储器上的数据。
- fwupd (main):从 Linux Vendor Firmware Service 下载固件数据的固件更新后台守护进程(daemon);
- gnome-firmware (main): fwupd 的 GTK 前端;
- plasma-discover-backend-fwupd (main): fwupd 的 Qt 前端。
注意:
- 从 Debian 12 Bookworm 开始,用户使用由官方安装介质里面提供的 non-free-firmware 软件包来提供完善的安装体验。
- fwupd 从 Linux Vendor Firmware Service 下载的固件数据并加载到正在运行的 Linux 内核,可能是 non-free。