尝试编译当前内核时子级版本不匹配

尝试编译当前内核时子级版本不匹配

我正在尝试sound/usb针对正在运行的内核在 Ubuntu 18.10 上重新编译模块。我没有收到编译错误,但是当我尝试加载模块时,我收到此错误:

Invalid module format

我正在运行4.18.0-21-lowlatency内核。

我通过这种方式获取内核源代码

apt source linux

这将下载内核源代码并将其提取到文件夹4.18.0linux-4.18.0

我将.configModule.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

如果我将其更改SUBLEVEL0,然后进行编译,我就可以成功加载该模块。

因此,即使我正在运行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 选项

  1. 下载内核源代码(deb-src应该取消注释/etc/apt/sources.list

    $ apt-get install linux-source kernel-package
    
  2. 转到内核源文件夹并解压

    $ cd /usr/src/linux-source-x.x.x
    $ tar jxvf linux-source-x.x.x.tar.bz2
    
  3. 将内容移动到当前文件夹
    $ mv linux-source-x.x.x/* .
    $ rm -rf linux-source-x.x.x/
    
  4. 获取必要的包
    $ apt-get build-dep linux-source
    $ mkdir debian/stamps
    

然后我可以运行fakeroot debian/rules cleanfakeroot 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 获取源代码。

我相信还有其他方法可以代替makefakeroot debian/rules并且它可以帮助构建树内模块。

相关内容