如何针对自定义内核(Debian)进行编译?

如何针对自定义内核(Debian)进行编译?

version.h中有一个文件/usr/include/linux。许多头文件都包含此文件并使用defines其中的ifdefs.

但是,当我编译自己的内核时,我看不到如何在例如中正确反映这一点 version.h

实际上这适用于所有与内核相关的头文件。 AFAICS/usr/include/linux始终代表我的发行版附带的内核,而不是正在运行的内核,也不是我make通过SYSSRC.

过去,我诉诸于创建指向我自己的内核源代码的符号链接,但我有一种感觉,这不是正确的方法。

这应该如何运作?如何针对自定义内核进行编译(例如内核模块)?

答案1

当针对您自己的自定义内核配置系统时,我建议在修改后的内核源中为当前版本添加一个名称。

例如,在 Armbian 中,他们创建自己的内核包,并将 -sunxi 添加到 kernel.release 中。

以修改4.6.3内核版本为例:

root@ruir:/usr/src/linux-headers-4.6.3-sunxi# grep -ri 4.6.3-sunxi *
include/generated/utsrelease.h:#define UTS_RELEASE "4.6.3-sunxi"
include/config/kernel.release:4.6.3-sunxi

另外,对于内核模块,在/lib/modules/4.6.3-sunxi/build

include/generated/utsrelease.h:#define UTS_RELEASE "4.6.3-sunxi"
include/config/auto.conf.cmd:ifneq "$(KERNELVERSION)" "4.6.3-sunxi"
include/config/kernel.release:4.6.3-sunxi

(看在 ARM / Armbian Jessie 中安装 sysdig - 在错误的内核版本中编译的模块

正如我们所看到的,这可以在uname -r

$uname -r
4.6.3-sunxi

至于自定义内核包:

$dpkg -l | grep sunxi
ii  linux-dtb-next-sunxi             5.16                                  armhf        Linux DTB, version 4.6.3-sunxi
ii  linux-firmware-image-next-sunxi  5.16                                  armhf        Linux kernel firmware, version 4.6.3-sunxi
ii  linux-headers-next-sunxi         5.16                                  armhf        Linux kernel headers for 4.6.3-sunxi on armhf
ii  linux-image-next-sunxi           5.16                                  armhf        Linux kernel, version 4.6.3-sunxi

至于添加你自己的编译内核头文件,我会参考内核头文件(强调是粗体是我的);如果您要替换次要内核版本,您可能(或可能不会)只使用make headers_install.

用户空间程序

一般来说,用户空间程序是根据发行版提供的头文件构建的,通常来自名为 glibc-devel、glibc-kernheaders 或 linux-libc-dev 的包。这些头文件通常来自较旧的内核版本,如果不重新构建 glibc,就无法安全地替换它们。特别是,强烈建议不要将 /usr/include/linux 安装为 /usr/src/linux/include 或 /lib/modules/*/build/include/linux 的符号链接,因为它经常会破坏重建应用程序。例如,较旧的内核在 include/asm-${arch} 中而不是 arch/${arch}/include/asm 中具有特定于体系结构的头文件,并且具有指向特定于体系结构的目录的符号链接。

为发行版打包头文件的正确方法是从内核源目录运行“make headers_install”将头文件安装到 /usr/include 中,然后重建 C 库包,依赖于刚刚的特定版本安装的内核头文件。

如果您正在分发依赖于某些内核头文件的特定版本的用户空间程序,例如因为您的程序仅在修补过的或最新的内核上运行,则您不能依赖于 /usr/include 中的头文件。您也不能使用 /usr/src/linux/include 或 /lib/modules/*/build/include/ 中的头文件,因为它们尚未准备好包含在用户空间中。如果您尝试这样做,内核应该警告您并指向此 Wiki 页面。解决这个问题的正确方法是隔离您需要的特定接口,例如在新内核中修补的单个头文件,为您的程序使用的字符设备提供 ioctl 编号。在您自己的程序中,添加该源文件的副本,并注意它应与新的内核版本保持同步。如果您的程序未获得 GPLv2 许可,请确保您已获得该文件作者的许可,可以根据您自己的程序的许可分发该文件。由于您的程序现在依赖于常规内核中可能不存在的内核接口,因此最好添加运行时检查,以确保内核理解该接口,并在没有回退到旧版本的情况下给出有用的错误消息界面。

也可用于内核开发;或者为不同的服务器或安装了多个内核版本的不同内核编译内核/模块,SYSSRC 可用于指定备用内核源位置。

相关内容