致命错误: 使用modprobe时出现模块未找到的错误

25

我有一个关于 modprobe 命令的问题... 我编译了一个简单的内核模块并使用 insmod 加载它,加载成功了,当我运行lsmod命令时,可以在输出列表中看到它。但是当我使用 modprobe 命令插入这个模块时,我遇到了一个致命错误:

root@okapi:/home/ravi# modprobe ./hello.ko 
FATAL: Module ./hello.ko not found.
root@okapi:/home/ravi#

以下是模块代码:

#include <linux/init.h>
#include <linux/module.h>

MODULE_LICENSE("Dual BSD/GPL");

static int hello_init(void)
{
        printk(KERN_ALERT "Hello, world\n");
        return 0;
}
static void hello_exit(void)
{
        printk(KERN_ALERT "Goodbye, cruel world\n");
}

module_init(hello_init);
module_exit(hello_exit);

和 Makefile

obj-m += hello.o

all:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules

clean:
        make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
6个回答

29

原因是 modprobe 查找模块时会到 /lib/modules/$(uname -r) 目录下查找,因此无法使用本地文件路径。这就是 modprobeinsmod 之间的区别之一。


如果我把我的模块放在/lib/modules/$(uname -r)目录中,那么它能正常运行吗? - Ravi Gupta
@Ravi Gupta:那应该是我最好的猜测。 - che
尝试将其放置在/lib/modules/$(uname -r)/misc/目录下。 - Elf King
@RaviGupta,你用来构建模块的内核Makefile还有其他目标,例如modules_install,你可以使用它来安装你的模块。 - Shahbaz
1
首先执行 sudo depmod 命令重新生成模块依赖,然后执行 modprobe your_module 命令。 - Danijel

7

最好的方法是使用内核的Makefile来安装模块:

以下是要添加到您的Makefile中的代码片段:

在顶部附近添加以下内容:

PWD=$(shell pwd)
VER=$(shell uname -r)
KERNEL_BUILD=/lib/modules/$(VER)/build
# Later if you want to package the module binary you can provide an INSTALL_ROOT
# INSTALL_ROOT=/tmp/install-root

在结尾处添加:
install:
        $(MAKE) -C $(KERNEL_BUILD) M=$(PWD) \
           INSTALL_MOD_PATH=$(INSTALL_ROOT) modules_install

然后您可以发出。
    sudo make install

这将把它放在 /lib/modules/$(uname -r)/extra/ 或 /lib/modules/$(uname -r)/misc/ 中,并适当运行 depmod。

3

我认为,要让"modprobe your_module"命令起作用,你的your_module.ko应该在/lib/modules/uname -r/modules.dep和/lib/modules/uname -r/modules.dep.bin中有条目。


3
换言之,运行“sudo depmod -a”命令。 - ash
@Ash 很好的提示。 - igntec

2

尝试使用insmod而不是modprobe。Modprobe会在模块目录/lib/modules/uname -r中查找所有的模块和其他文件。


是的,但选项不同...那么怎么执行 modprobe -r -q <module> 呢? - personal_cloud

0

-1
Insert this in your Makefile

 $(MAKE) -C $(KDIR) M=$(PWD) modules_install                      

 it will install the module in the directory /lib/modules/<var>/extra/
 After make , insert module with modprobe module_name (without .ko extension)

或者

After your normal make, you copy module module_name.ko into   directory  /lib/modules/<var>/extra/

然后执行 modprobe 模块名(不带 .ko 后缀)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接