我的情况:
我已经安装并运行了一个运行 fedora 的预构建内核。现在,我想安装 mcp251x 和 mcp25xfd 驱动程序模块,该模块依赖于 can-dev 驱动程序模块,因此我也需要安装该模块。显然,这些模块的源代码存在于该版本的内核源代码中,但我的猜测是它们在内核编译期间没有通过 .config 文件“启用”。所以这是事后驱动程序模块安装尝试。
我从来没有这样做过,所以如果有更简单的方法,请指导我。
我尝试过的:
我首先进入 /lib/modules 目录,查看我的 3 个模块是否已经存在,可以安装。我找到了其中之一:can-dev.ko.xz
所以我安装它:
$ sudo insmod can-dev.ko.xz
这样就完成了,没有错误信息。对于其他 2 个模块,我看到了它们的源代码和 makefile,但调用“make”只是说“没有目标”并且无法构建。
然后我使用 uname -a 查看了版本:
Linux fedora 5.11.3-300.fc34.x86_64
所以我去下载 5.11.3 的源代码:https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/refs/tags
我检查当前的编译器版本:
$ gcc --version
$ gcc (GCC) 11.0.0 20210210 (Red Hat 11.0.0-0)
我验证了这是用于构建内核的相同 gcc 版本:
$ cat /proc/version
$ gcc (GCC) 11.0.0 20210210 (Red Hat 11.0.0-0)
所以显然我不能只进入驱动程序文件夹并调用“make”,即使它有一个 makefile。驱动程序makefile和内核makefile都纠缠在一起,所以我进入内核源代码根目录并修改Makefile:
EXTRAVERSION = -300.fc34.x86_64
这可确保模块中的“vermagic”字符串与当前安装的操作系统版本兼容。
然后,在内核源代码根目录中,我调用:
$ make oldconfig
这会生成一个 .config 文件。我手动编辑 .config 文件以添加以下行:
CONFIG_CAN_MCP251X=m
CONFIG_CAN_MCP251XFD=m
这告诉内核将 MCP251x 和 MCP251xfd 构建为模块(默认情况下根本不构建)。
然后我打电话
$ make prepare
然后,我 cd 进入我尝试构建的特定驱动程序目录(其中包含 c 代码和 Makefile),并调用:
$ make -C ~/linux-5.11.3 M=`pwd` modules
它使用一些特殊参数调用 kernel-source-root Makefile,指示仅在当前目录中构建内核模块。这有效,并生成文件 mcp251xfd.ko 和 mcp251x.ko。
我尝试安装这些模块:
$ sudo insmod mcp251x.ko
$ sudo insmod mcp251xfd.ko
但两者都返回以下错误消息:
insmod: ERROR: could not insert module mcp251xfd.ko: Invalid module format
并致电
$ dmesg
返回:
module: x86/modules: Skipping invalid relocation target, existing value is nonzero for type 1, loc 00000000abe7d4fb, val ffffffffc10b3a77
我知道唯一需要检查的是幻数是否与 uname -r number 匹配:
$ uname -r
5.11.3-300.fc34.x86_64
检查模块:
$ modinfo mcp251xfd.ko
vermagic: 5.11.3-300.fc34.x86_64
所以我不知道该怎么做或尝试安装这些驱动程序。
答案1
该内核linux-5.11.3
与您的发行版提供的内核不同,后者是5.11.3-300.fc34
.这-300.fc34
使得一切变得不同。添加了 RH 更新。
使用 yum 下载内核源代码,因为它似乎是 Fedora 34。
将目录更改为/usr/src/<source dir>
,然后运行make oldconfig && make menuconfig
或make oldconfig && make xconfig
并找到Networking Support->CAN bus subsystem support->CAN device drivers->CAN SPI Interfaces
,您将找到列出的设备并勾选它们。
一旦完成,您就可以运行make modules modules_install && depmod -a
并且内核模块将位于/lib/modules
.
但是,如果内核模块签名到位,这些可能仍然无法加载。
如果是这样,一种选择是完全重建内核并安装它。
另一种方法是要求 RH 在下一次内核更新时启用这些模块。
或者,您可以生成自己的 CA 证书和代码签名证书,签署新模块并将父证书加载到 UEFI DB 中。
您可以确保 UEFI 未配置为secure boot
你会弄脏你的手的......
我想我已经涵盖了一切...
顺便说一句,您的电脑真的需要这些模块吗?