当前位置:首页 > 站长知识 > 正文内容

Debian内核详解

2024-08-27站长知识14

在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-essentialI:48117创建 Debian 软件包所必须的软件包: make, gcc, …
bzip2V:161, I:969112bz2 文件压缩和解压缩工具
libncurses5-devI:736ncurses 开发者库和文档
gitV:345, I:54746734git:Linux 内核使用的分布式版本控制系统
fakerootV:28, I:489224为非 root 用户创建软件包提供一个伪造的 root 环境
initramfs-toolsV:429, I:989113创建 initramfs 的工具(Debian 规范)
dkmsV:75, I:164195动态内核模块支持 dynamic kernel module support (DKMS) (通用)
module-assistantV:1, I:20406制作模块软件包的帮助工具(Debian 规范)
devscriptsV:6, I:412658Debian 软件包维护者的帮助脚本(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。