我正在尝试sound/usb
针对正在运行的内核在 Ubuntu 18.10 上重新编译模块。我没有收到编译错误,但是当我尝试加载模块时,我收到此错误:
Invalid module format
我正在运行4.18.0-21-lowlatency
内核。
我通过这种方式获取内核源代码
apt source linux
这将下载内核源代码并将其提取到文件夹4.18.0
中linux-4.18.0
。
我将.config
和Module.symvers
文件复制到/lib/modules/4.18.0-21-lowlatency/build
我的内核源目录的根目录。
我跑make EXTRAVERSION=-21-lowlatency modules_prepare
,然后make EXTRAVERSION=-21-lowlatency M=sound/usb
运行insmod
结果写入以下错误syslog
snd_usb_audio: version magic '4.18.20-21-lowlatency SMP preempt mod_unload ' should be '4.18.0-21-lowlatency SMP preempt mod_unload '
运行modinfo /lib/modules/
uname -r/kernel/sound/usb/snd-usb-audio.ko | grep vermagic
将返回此结果
vermagic: 4.18.0-21-lowlatency SMP preempt mod_unload
modinfo
在我新编译的模块上运行会返回此
vermagic: 4.18.20-21-lowlatency SMP preempt mod_unload
我把问题追溯到Makefile
VERSION = 4
PATCHLEVEL = 18
SUBLEVEL = 20
如果我将其更改SUBLEVEL
为0
,然后进行编译,我就可以成功加载该模块。
因此,即使我正在运行4.18.0
内核,并且apt source linux
似乎下载了4.18.0
内核,但下载的文件是有版本的4.18.20
。
这是正常的吗或者我忽略了什么?
答案1
我遇到过类似的问题。问题在于获取内核源代码的方法以及“构建”内核的方法。有一个链接指向官方方法。我从https://help.ubuntu.com/community/Kernel/Compile。从外观上看,它似乎已经过时并且读起来很长。
根据情况,我想使用官方发布的 Ubuntu 内核(而不是其他任何地方的内核)apt-get source xxxxx
。它是一个包含 Debian 文件夹和 tar 包的文件夹。然后我按照部分说明进行操作尝试在 18.04 上构建内核。没有 editconfigs 选项
下载内核源代码(
deb-src
应该取消注释/etc/apt/sources.list
)$ apt-get install linux-source kernel-package
转到内核源文件夹并解压
$ cd /usr/src/linux-source-x.x.x $ tar jxvf linux-source-x.x.x.tar.bz2
- 将内容移动到当前文件夹
$ mv linux-source-x.x.x/* . $ rm -rf linux-source-x.x.x/
- 获取必要的包
$ apt-get build-dep linux-source $ mkdir debian/stamps
然后我可以运行fakeroot debian/rules clean
和fakeroot debian/rules binary-headers binary-generic binary-perarch
。在此期间我必须手动将一个 amd gpu 头文件复制到缺失的位置,否则编译会失败。这样,就会fakeroot debian/rules
使用您正在运行的内核配置(uname -r
)。
如果我使用make menuconfigure
和 .config,我最终会遇到和你一样的问题。所以你可以使用我的示例来使用官方发布的 Ubuntu 内核并fakeroot debian/rules
进行编译。模块的版本可以匹配。
我的版本是 Ubuntu 18.04,我的uname -r
是 5.3.0-51。我在 2020-4-15 左右使用 apt-get 获取源代码。
我相信还有其他方法可以代替make
,fakeroot debian/rules
并且它可以帮助构建树内模块。