Linux命令:modprobe

Linux命令:modprobeFrom https blog csdn net good5101 article details 39472291linu 内核模块相关命令 lsmod depmod modprobe modinfo insmod rmmod 使用说明 https www cnblogs com jacklikedogs p 4659249 htmlLinux 下加载 ko 驱动模块的两种方法 insm

From:https://blog.csdn.net/good5101/article/details/

来源

初期linux的驱动程序是必须编译在内核之中的(相应地驱动程序提供的是源程序以符合GNU规则,例如DFE530TX网卡的驱动就是ftp://www.scyld.com/pub/network/via-rhine.c),后来推广使用以后一则感觉不方便、二则普通用户也没有能力自己编译内核、三则当时内核不能太大,里面驱动程序太多超过1M的话会瘫掉,于是发明了模块(modules),就是事先将驱动程序编译成module,使用时再将他们装载到系统里以避免重新编译内核。再经过发展以后,几乎内核里的大多数功能都能以模块形式存在,例如读写NTFS、支持PPP协议等等,所以模块功能已经不局限于驱动程序了。

modprobe功能就是,对系统里的模块进行增、减、安装、删除等等操作。

简介

内容

modprobe 与 insmod 命令的区别:

linux设备驱动有两种加载方式insmod和modprobe,下面谈谈它们用法上的区别
1、insmod一次只能加载特定的一个设备驱动,且需要驱动的具体地址。写法为:
insmod drv.ko
2. modprobe则可以一次将有依赖关系的驱动全部加载到内核。不加驱动的具体地址,但需要在安装文件系统时是按照make modues_install的方式安装驱动模块的。驱动被安装在/lib/modules/$(uname -r)/…下。写法为:
modprob drv

想要卸载module。使用rmmod

用modprobe 加载模块时,提示模块找不到的问题

与内核模块操作相关的命令还有:lsmod modinfo depmod rmmod inmod modprobe

内核模块的开机自动挂载模块一般是位于一个配置文件,一般的Linux发行版本都有 /etc/modules.conf 或 /etc/modprobe.conf

加载内核驱动的通常流程:

1.先将.ko文件拷贝到/lib/module/uname -r(内核版本号)/kernel/driver/…目录下,

根据具体用途的区别分为net、ide、scsi、usb、video、parport、md、block、ata等等。 

2.运行depmod -a,更新模块依赖新,主要是更新modules.dep文件

3.运行modprobe加载内核模块

lsmod

其它:

(1)lsmod 显示当前加载的所有模块,相当于cat /proc/modules,

假设你没有设定开机加载某个模块,比如ntfs,那么开机后执行lsmod,列表里不会有ntfs这个模块的, 这时你再执行 mount -t ntfs xxx后,执行lsmod后列表里就会有ntfs这个模块了。 还要注意的是lsmod显示的是模块名,而不是别名(alias)。 

(2) modprobe与insmod

modprobe -l #显示当前可以加载的模块 modprobe xxx.ko #加载某个模块 modprobe -r xxx.ko #卸载某个模块 通过了解modprobe的manpage我们知道,我可以通过modprobe -l来显示可以当前可以加载的模块,所谓当前可以加载的模块, 实际上就是modules.dep文件中包含的那些模块,而不是manpage里说的modprobe会加载/lib/modules/`uname -r`下的所有模块(也许是我理解错误),下面我们将会证明这一点. insmod 与 modprobe 都是载入 kernel module,不过一般差别于 modprobe 能够处理 module 载入的相依问题。 

比方你要载入 a module,但是 a module 要求系统先载入 b module 时,直接用 insmod 挂入通常都会出现错误讯息,不过 modprobe 倒是能够知道先载入 b module 后才载入 a module,如此相依性就会满足。

不过 modprobe 并不是大神,不会厉害到知道 module 之间的相依性为何,该程式是读取 /lib/modules/2.6.xx/modules.dep 档案得知相依性的。而该档案是透过 depmod 程式所建立。

(3)上面(1)中提到modprobe加载某个模块是根据/lib/modules/uname -r目录下的modules.dep文件中的模块列表,这个文件中有的模块modprobe会正确加载,否则就会出错。
我们还拿ntfs这个模块来举例:
vi /lib/modules/uname -r/modules.dep
注释掉/lib/modules/2.6.18-4-k7/kernel/fs/ntfs/ntfs.ko这一行,就是加个#号.
这个修改是即使生效的。
modinfo ntfs
modinfo: could not find module ntfs
modprobe ntfs
FATAL: Module ntfs not found.
重启机器,执行同样的命令会得到同样的结果,说明开机不会自动执行depmod的,而
locate ntfs.ko
/lib/modules/2.6.18-4-k7/kernel/fs/ntfs/ntfs.ko
证明我们并没有转移ntfs模块。
注意如果重启机器之前进行mount还是可以的,重启之后就会报错了,而上边的都是即时生效的。
还有如果modules.dep里注释掉了ntfs,那么在/etc/modules里写上也是不起作用的,说明这个和mount一样都是依赖 modprobe来完成加载模块命令的。而insmod是可以的,因为insmod后面跟的是绝对路径,它和modules.dep没什么关系。 insmod比较重要的用途是用来测试模块的正确性,加载一般都是依靠modprobe。(这个可能也不起作用了,都用modprobe吧)
这一切只是因为我们注释掉了modules.dep中关于ntfs.ko的那一行,而模块并没有删除或转移。既然modules.dep文件如此重要,那么它是怎么生成的呢?这就和下一个命令有关了,depmod。






























(4)depmod

实例

  1. 加载RAID1阵列级别模块:
    [root@root]# modprobe raid1

  2. 显示已加载的RAID1阵列级别模块:
    [root@root]# lsmod |grep raid1

  3. 删除RAID1阵列级别模块:
    [root@root]# modprobe -r raid1

  4. 显示RAID1阵列级别模块:
    [root@root]# lsmod |grep raid1

insmod 和 modprobe使用方法

From:https://blog.csdn.net/hktkfly6/article/details//

insmod 和 modprobe 都是载入 kernel module,不过一般差别于 modprobe 能够处理 module 载入的相依问题。

1、2.6.29.4这个版本号是是uboot在做uimage的时候加上的,看arch/arm/boot/Makefile:

2、对比,可见2.6.29.4-FriendlyARM就是 = ( K E R N E L R E L E A S E ) , 因 此 我 们 需 要 找 到 (KERNELRELEASE),因此我们需要找到 (KERNELRELEASE)(KERNELRELEASE)怎么定义的。

3、搜索可以知道$(KERNELRELEASE)在include/config/kernel.release定义,但是改了以后重新make又还有FriendlyARM。

4、看内核顶层的makefile,约872行有说明:

Build the kernel release string

。。。

$(localver-auto) (only if CONFIG_LOCALVERSION_AUTO is set)

./scripts/setlocalversion (SCM tag, if one exists)

$(LOCALVERSION) (from make command line if provided)

仔细对比,原来这个FriendlyARM是$(LOCALVERSION)!,搜索下,发现autoconf.h有,哈哈,这就是内核图形配置出来的嘛

5、马上make menuconfig,搜索$(LOCALVERSION),乖乖,原来在Gernel Setup。。。,马上去掉,重新编译。这下没了!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215405.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午2:00
下一篇 2026年3月18日 下午2:00


相关推荐

  • RabbitMQ默认端口

    4369:epmd,RabbitMQ节点和CLI工具使用的对等发现服务5672、5671:由不带TLS和带TLS的AMQP0-9-1和1.0客户端使用25672:用于节点间和CLI工具通信(Erlang分发服务器端口),并从动态范围分配(默认情况下限制为单个端口,计算为AMQP端口+20000)。除非确实需要这些端口上的外部连接(例如,群集使用联合身份验证或在子网外部的计算机上使用CLI工具),否则这些端口不应公开。有关详细信息,请参见网络指南。35672-35682:由CLI工具..

    2022年4月5日
    163
  • Class类 和 class对象(运行时的类型信息)

    Class类 和 class对象(运行时的类型信息)什么是类?可以理解为。class文件某种意义上来说,java有两种对象:实例对象和Class对象。每个类的运行时的类型信息就是用Class对象表示的。它包含了与类有关的信息。其实我们的实例对象就通过Class对象来创建的。Java使用Class对象执行其RTTI(运行时类型识别,Run-TimeTypeIdentification),多态是基于RTTI实现的每一个类都有一个Class对…

    2022年5月11日
    46
  • 数据库原理——事务、视图、存储过程

    数据库原理——事务、视图、存储过程

    2021年5月20日
    150
  • 黑马程序员_Java语法基础1

    黑马程序员_Java语法基础1

    2021年8月25日
    74
  • 知识图谱入门 (七) 知识推理

    知识图谱入门 (七) 知识推理欢迎大家关注我的博客http://pelhans.com/,所有文章都会第一时间发布在那里哦~本节对本体任务推理做一个简单的介绍,并介绍本体推理任务的分类。而后对本体推理的方法和工具做一个介绍。知识推理简介知识推理任务分类所谓推理就是通过各种方法获取新的知识或者结论,这些知识和结论满足语义。其具体任务可分为可满足性(satisfiability)、分类(clas…

    2022年6月12日
    30
  • 谷歌学术搜索方法_取消谷歌浏览器打开pdf

    谷歌学术搜索方法_取消谷歌浏览器打开pdf保研完之后,该浪的也都浪够了,是时候重新开始认真学技术了。2015年12月20号,我被分配到一个浙大的项目中去,去了之后我发现什么都不会,而且这个项目中好多浙大的研究生,博士。我有点方,不过项目总负责人王老师倒来了个积极,在一一向这些学神们介绍了我之后,我不觉感到肩上的担子重了。不过我有信心,同样都是人,我努力也一定能和他们一样的(更何况我一直认为自己不一般,只是没到时候,嘿嘿)。——

    2022年10月10日
    6

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号