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


34

我在Linux内核模块中有一个错误,该错误会导致普通的Ubuntu 14.04内核崩溃(崩溃)。

这就是为什么我只想编辑 / 修补单个内核模块的源代码以添加一些额外的调试输出。有问题的内核模块是mvsas引导的,并且不是必需的。因此,我看不到需要更新任何initrd映像。

我已经阅读了很多信息(如下所示),并发现设置和构建过程令人困惑。我需要两个食谱:

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

已使用的来源是:



也许这篇文章将帮助太:stackoverflow.com/questions/8744087/...
奥列格科科林

Answers:


32

构建自定义模块的方法可能需要分为三个部分。

设置一次

$ 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加载模块时出现消息“ 无符号版本的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

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

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

这将在中安装内核模块/lib/modules/$(uname -r)/extra/,以防您未重命名分发内核模块文件而不会覆盖分发模块。在这种mvsas情况下,它还将运行depmod

$ 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并尝试再次加载该模块:

# 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将返回error 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。运行sudo apt-get update,然后该命令将为您提供源。另请参见此问题,其中也描述了用于执行此操作的GUI方法。

我收到错误:/ bin / sh:arm-none-linux -gnueabi-gcc:未找到
Dr.jacky

$(uname-r)显然是错误的...您需要致电shell内置的电话:$(shell uname -r)
Albus Dumbledore 2015年

2
@AlbusDumbledore我也看到不起作用的情况$(shell uname -r)。为什么$(uname -r)这么显然是错误的?
Pro

我还必须致电,echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.conf以便depmod看到中的新更新文件.../extra
马丁·佩卡

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例程:BIO_new_file:没有这样的文件:bss_file.c:178签名文件:certs / signing_key.pem:没有这样的文件或目录```
-Envek
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.