如何(配方)只构建一个内核模块?

我在一个Linux内核模块中发现了一个bug,它导致了Ubuntu 14.04内核的崩溃。

这就是为什么我想要编辑/修补只有这个单独的内核模块的源代码,以添加一些额外的调试输出。所涉及的内核模块是mvsas,并且不是启动所必需的。因此,我认为没有必要更新任何initrd映像。

我已经阅读了很多信息(如下所示),并对设置和构建过程感到困惑。我需要以下两个步骤:

  1. 首次设置/配置构建环境
  2. 在编辑此内核模块的任何源文件(.c和.h)并将该编辑转换为新的内核模块(.ko)后要执行的步骤

使用的来源有:

可能是如何构建一个单独的内核模块?的重复问题。 - Ciro Santilli OurBigBook.com
也许这篇文章也能帮到你:https://stackoverflow.com/questions/8744087/how-to-recompile-just-a-single-kernel-module/44204152#44204152 - Oleg Kokorin
1个回答

建立自定义模块的步骤可能需要分为三个部分。

只需设置一次

$ cd ~
$ apt-get source linux-source-3.13.0 

我太懒了,不想复制mvsas特定驱动程序的源文件;只需将它们全部复制到您当前的工作目录即可。如果使用apt-get时出现关于“缺少源URI”的错误消息,请参阅底部的注释#4。
$ cd linux-3.13.0
$ make oldconfig
$ make prepare
$ make scripts

这将准备一些构建内核模块所需的文件。
每个内核版本
$ apt-get install linux-headers-$(uname -r)

这将在/lib/modules中安装头文件和Ubuntu内核配置文件,用于该内核版本。
$ cd ~/linux-3.13.0
$ cp -v /usr/src/linux-headers-$(uname -r)/Module.symvers .

为了在使用 insmod 或 modprobe 加载模块时避免出现消息 "no symbol version for module_layout",需要进行以下操作。
$ mv -v /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko.backup

这将重命名原始(Ubuntu构建)内核模块,以确保加载自定义修补的模块。
每次编辑
$ cd ~/linux-3.13.0/drivers/scsi/mvsas
$ nano mv_sas.h
$ nano mv_sas.c

这些是用来编辑的。
$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

这将使用存储在/lib/modules/$(uname -r)/中的您的标准Ubuntu发行版的内核配置,编译和构建内核模块.ko文件。
$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

这将在/lib/modules/$(uname -r)/extra/中安装内核模块,以防止覆盖发行版模块,如果您没有重命名发行版内核模块文件。在这种mvsas情况下,它还会运行depmod
$ lsmod | grep mvsas

如果这导致任何输出,首先需要使用(modprobe -r mvsas)卸载mvsas模块。
$ sudo modprobe -v mvsas

这应该加载新的内核模块。

检查输出以验证/lib/modules/.../extra/mvsas.ko是否被加载。

Modprobe错误:无法插入

在某些情况下,您可能会遇到modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg)的错误,而在详细的modprobe输出中,您会看到insmod正在尝试从内核默认位置加载模块。例如:

# insmod /lib/modules/3.17.0-031700rc7-generic/kernel/drivers/scsi/pm8001/pm80xx.ko
modprobe: ERROR: could not insert 'pm80xx': Unknown symbol in module, or unknown parameter (see dmesg)

在这种情况下,您需要手动运行depmod并尝试重新加载模块。
# depmod
# sudo modprobe -v mvsas

笔记

  1. 可能情况是,生成的 .ko 模块文件的大小比 Ubuntu 发行的原始模块文件要大得多(例如大约 20 倍);在这种情况下,make prepare 步骤可能已创建了一个用于 Linux 开发人员调试的内核配置文件,并且您正在从源代码目录构建。您的 -C 参数可能无法按预期工作。
  2. 我看过其他命令的指南,例如 make modules_preparemake M=scripts/mod,但我认为在这种情况下它们不是必需的。
  3. 您可以通过将 -C /lib/modules/$(uname -r)/build 替换为 -C /usr/src/linux-headers-$(uname -r) 来使用 Linux 开发人员调试配置。
  4. 在默认设置中,apt-get source linux-sources 将返回错误 E: You must put some 'source' URIs in your sources.list。要解决此问题,您可以通过取消注释(删除开头的 #)第一行的 deb-src 来修改文件 /etc/apt/sources.list。例如,对于 Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted。运行 sudo apt-get update,然后该命令将为您提供源代码。还可以参考this question,其中还描述了一种使用 GUI 方法来执行此操作的方法。

我收到了错误信息:/bin/sh: arm-none-linux-gnueabi-gcc: 找不到。 - Dr.jacky
$(uname -r) 显然是错误的... 你需要调用 shell 内建命令: $(shell uname -r) - Albus Dumbledore
2@AlbusDumbledore 我也遇到了一些情况,其中 $(shell uname -r) 无法正常工作。为什么 $(uname -r) 看起来是错误的呢? - Pro Backup
我还必须调用 echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.conf,这样 depmod 才能在 .../extra 中看到新更新的文件。 - Martin Pecka
1模块签名错误怎么办,如何避免它?安装 /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko 在 main.c 的第158行: - SSL 错误:02001002:系统库:fopen:没有该文件或目录:bss_file.c:175 - SSL 错误:2006D080:BIO routines:BIO_new_file:没有该文件:bss_file.c:178 sign-file: certs/signing_key.pem:没有该文件或目录 - Envek
当我尝试构建radeon模块时,我遇到了这个问题:https://askubuntu.com/questions/1093718/radeon-trace-h-no-such-file-or-directory-when-trying-to-build-radeon - Tooniis
我已经解决了上面的问题。现在我卡在这里:https://askubuntu.com/q/1135475/632192 - Tooniis
这在构建驱动程序/媒体/v4l2-core中的多个ko时没有起作用,因为一些非Linux头文件包含目录没有添加到编译中。在源目录的根目录中执行以下操作可以使其正常工作: sudo make SUBDIRS=drivers/media/v4l2-core modules - G Huxley
在执行命令$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install之前,一切正常。但是,在执行过程中出现了很多错误,例如sign-file: certs/signing_key.pem: No such file or directory,即使使用https://superuser.com/a/1322832中提供的方法创建了证书文件。看起来,它在本地目录(在我这里是drivers/hwmon)而不是linux-5.8.0文件夹中搜索certs目录。 - doom
同时 ../crypto/bio 文件夹缺失 => SSL错误:2006D080:BIO例程:BIO_new_file:没有这样的文件: ../crypto/bio/bss_file.c:76。你能帮忙修复吗? - doom
解决加密问题的方法:https://askubuntu.com/questions/820883/how-to-resolve-ssl-error-during-make-modules-install-command - dshepherd