如何(方法)仅构建一个内核模块?

如何(方法)仅构建一个内核模块?

Linux 内核模块中有一个错误,导致原有的 Ubuntu 14.04 内核崩溃。

这就是为什么我想编辑/修补唯一的来源单内核模块添加一些额外的调试输出。有问题的内核模块不是mvsas启动所必需的。因此,我认为没有必要更新任何 initrd 映像。

我阅读了很多资料(如下所示),发现设置和构建过程很混乱。我需要两个配方:

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

已使用的来源包括:

答案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 .

这是为了防止出现消息“module_layout 没有符号版本“当使用 insmod 或 modprobe 加载模块时。

$ 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

.ko这将使用存储在中的现有 Ubuntu 发行版的内核配置来编译和构建内核模块文件/lib/modules/$(uname -r)/

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

这将安装内核模块/lib/modules/$(uname -r)/extra/,而不会覆盖分发模块(如果您没有重命名分发内核模块文件)。在这种情况下,它还将运行德普莫德

$ lsmod | grep mvsas

如果这导致任何输出,则 mvsas 模块需要modprobe -r 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
# sudo modprobe -v mvsas

笔记

  1. 可能出现这样的情况:生成的.ko模块文件比 Ubuntu 分发的原始模块文件大很多(例如 20 倍);在这种情况下,该make prepare步骤可能创建了一个 Linux 开发人员调试内核配置文件,而您正在从源目录进行构建。您的-C参数可能无法按预期运行。
  2. 我曾看到过带有其他命令的指南,例如make modules_prepare和,make M=scripts/mod但我不认为这些对于这种情况是必要的。
  3. 您可以使用 Linux 开发人员调试配置,方法是将其替换-C /lib/modules/$(uname -r)/build-C /usr/src/linux-headers-$(uname -r)
  4. 在默认设置下,apt-get source linux-sources将返回错误E: You must put some 'source' URIs in your sources.list。要修复此问题,您可以/etc/apt/sources.list通过取消注释(删除#第一deb-src行的开头)来修改文件。Ubuntu 17.10 的示例:deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted. run sudo apt-get update,然后命令将为您提供源。另请参阅这个问题其中也描述了实现此目的的 GUI 方法。

相关内容