Linux 内核模块中有一个错误,导致原有的 Ubuntu 14.04 内核崩溃。
这就是为什么我想编辑/修补唯一的来源单内核模块添加一些额外的调试输出。有问题的内核模块不是mvsas
启动所必需的。因此,我认为没有必要更新任何 initrd 映像。
我阅读了很多资料(如下所示),发现设置和构建过程很混乱。我需要两个配方:
- 设置/配置构建环境一次
- 编辑此内核模块的任何源文件(
.c
和.h
)并将该编辑转换为新内核模块(.ko
)后要执行的步骤
已使用的来源包括:
- 构建一个内核模块 - Google搜索
- http://www.linuxquestions.org/questions/linux-kernel-70/rebuilding-a-single-kernel-module-595116/
- https://stackoverflow.com/questions/8744087/how-to-recompile-just-a-single-kernel-module
- http://www.pixelbeat.org/docs/rebuild_kernel_module.html
- 如何构建单个树内内核模块?
- http://ubuntuforums.org/showthread.php?t=1153067
- http://ubuntuforums.org/showthread.php?t=2112166
- http://ubuntuforums.org/showthread.php?t=1115593
- 构建一个内核模块 ubuntu - Google搜索
- ‘make +single +kernel +module’ - 询问 Ubuntu
- ‘make +kernel +module’——询问 Ubuntu
- 我的 makefile 结果是:没有规则来生成目标“arch/x86/tools/relocs.c”,需要
- “无效的模块格式”——询问 Ubuntu
- 驱动程序安装:为新内核编译源代码
- Modprobe:“无效的结节格式”,但在 insmod 之后可以工作
- “符号版本转储”“丢失” - Google 搜索
- https://stackoverflow.com/questions/9425523/should-i-care-that-the-symbol-version-dump-is-missing-how-do-i-get-one
- https://askubuntu.com/questions/369051/where-can-i-find-the-corresponding-module-symvers-and-config-files-for-ubutunu
- 尝试加载 usbhid.ko 时出现“module_layout 没有符号版本”
- Linux 头文件文件夹内的链接已损坏
- ‘make modules_install’——询问 Ubuntu
- ‘modules_install’——询问 Ubuntu
- 自定义编译内核中的空构建目录
- https://askubuntu.com/questions/444345/not-able-to-see-pr-info-output
- https://askubuntu.com/questions/472496/in-which-directory-are-the-kernel-source-files-and-how-can-i-recompile-it
- 我如何编译和安装修补的 libata-eh.c 文件?
- ‘modules_install +depmod’——询问 Ubuntu
- modules_install depmod - Google 搜索
- “make modules_install” - 谷歌搜索
- http://www.csee.umbc.edu/courses/undergraduate/CMSC421/fall02/burt/projects/howto_build_kernel.html
- https://unix.stackexchange.com/questions/20864/what-happens-in-each-step-of-the-linux-kernel-building-process
- https://wiki.ubuntu.com/KernelCustomBuild
- http://www.cyberciti.biz/tips/build-linux-kernel-module-against-installed-kernel-source-tree.html
- http://www.linuxforums.org/forum/kernel/170617-solved-make-modules_install-different-path.html
- “准备” - Google 搜索
- “make prepare” “scripts/kconfig/conf --silentoldconfig Kconfig” - Google 搜索
- http://ubuntuforums.org/showthread.php?t=1963515
- ubuntu“make prepare”版本 - Google 搜索
- https://stackoverflow.com/questions/8276245/how-to-compile-a-kernel-module-against-a-new-source
- https://help.ubuntu.com/community/Kernel/Compile
- 如何编译内核模块?
- 如何向我的内核添加自定义驱动程序?
- https://askubuntu.com/questions/426549/compile-and-loading-kernel-module-without-compiling-the-kernel
答案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
笔记
- 可能出现这样的情况:生成的
.ko
模块文件比 Ubuntu 分发的原始模块文件大很多(例如 20 倍);在这种情况下,该make prepare
步骤可能创建了一个 Linux 开发人员调试内核配置文件,而您正在从源目录进行构建。您的-C
参数可能无法按预期运行。 - 我曾看到过带有其他命令的指南,例如
make modules_prepare
和,make M=scripts/mod
但我不认为这些对于这种情况是必要的。 - 您可以使用 Linux 开发人员调试配置,方法是将其替换
-C /lib/modules/$(uname -r)/build
为-C /usr/src/linux-headers-$(uname -r)
- 在默认设置下,
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
. runsudo apt-get update
,然后命令将为您提供源。另请参阅这个问题其中也描述了实现此目的的 GUI 方法。