【问题标题】:Unable to load/insert kernel module无法加载/插入内核模块
【发布时间】:2016-08-18 18:16:37
【问题描述】:

我正在使用运行 linux 内核 4.4.0 系列的 Ubuntu 16.0.4 LTS。 我对 i2c-ocores 代码和 eeprom 驱动程序进行了一些更改,并重新构建了整个内核。然后我安装了新构建的内核。

我使用以下步骤构建内核:

1. sudo apt-get source linux-image-$(uname -r)
2. Applied my changes to i2c-ocores and eeprom driver
3. sudo chmod a+x debian/scripts/*
4. sudo chmod a+x debian/scripts/misc/*
5. sudo fakeroot debian/rules clean
6. sudo fakeroot debian/rules editconfigs
   a. Checked all the options for i2c driver
7. sudo fakeroot debian/rules binary-headers binary-generic skipabi=true skipmodule=true 
8. Installed all the .deb packages created by the build.

安装新内核后,我重新启动机器并插入i2c-ocoreseeprom 驱动程序,它们运行良好。但是在重新启动四五次之后,我插入这些驱动程序失败了。我正在使用modprobe 插入模块。

与 i2c-ocores 一样,我收到以下错误:

Aug 18 11:08:14 manik kernel: [  214.831678] i2c_ocores: disagrees about version of symbol i2c_new_device
Aug 18 11:08:14 manik kernel: [  214.831682] i2c_ocores: Unknown symbol i2c_new_device (err -22)
Aug 18 11:08:14 manik kernel: [  214.831700] i2c_ocores: disagrees about version of symbol i2c_del_adapter
Aug 18 11:08:14 manik kernel: [  214.831701] i2c_ocores: Unknown symbol i2c_del_adapter (err -22)
Aug 18 11:08:14 manik kernel: [  214.831708] i2c_ocores: disagrees about version of symbol i2c_add_adapter
Aug 18 11:08:14 manik kernel: [  214.831709] i2c_ocores: Unknown symbol i2c_add_adapter (err -22)

有人知道这里发生了什么吗?我是不是做错了什么?

【问题讨论】:

  • 你不需要重新编译整个内核。
  • @AndyShevchenko - 我如何在这个 ubuntu 设置中单独构建这些模块?
  • @AndyShevchenko 我认为问题不在于我构建模块的方式,因为我正在构建整个内核本身。
  • 不清楚你为什么这样做,为什么你经常重启机器。通常情况下不需要所有这些,尤其是。当你为正在运行的内核构建模块时。
  • 关于模块化构建有很多文章和示例。谷歌它或使用您的 Makefile、源模块目录布局等创建一个新问题。

标签: linux-device-driver kernel-module ubuntu-16.04


【解决方案1】:

问题中确实没有足够的信息来给出明确的答案,但我相信我可能知道问题所在。

您正在重建 Ubuntu 内核,但不更改版本号。结果,您有效地覆盖了系统附带的内核。在此过程中的某个地方,您正在使用的内核和您尝试加载的模块之间可能不匹配(即 - 您正在获取 vanilla 内核和您的自定义模块,反之亦然)。发生这种情况时,您看到的错误可能会出现。

我对您的最佳建议是在构建之前将附加的内核版本更改为包含您的名称的内容。至少,您只需运行uname -r 即可查看涉及哪些版本。

一些旁白:

  • 人们让您只构建模块。这行不通有两个原因。首先,您正在替换现有模块,这意味着您冒着我认为发生的事情会发生的风险。然而,更重要的是,您说您更改了内核的配置。当您仅从树中构建模块时,您无法做到这一点。
  • 您正在运行sudo fakerootsudo 是一个让你的命令以root 运行的工具。 fakeroot 是一个在真实环境不可用时伪造根环境的命令。两者都运行是没有意义的。据我所知,最好的办法是使用fakeroot 构建并使用sudo 安装。

【讨论】:

    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2020-03-27
    • 2012-08-20
    • 2016-01-05
    • 1970-01-01
    • 2013-10-15
    • 1970-01-01
    相关资源
    最近更新 更多