Chinaunix首页 | 论坛 | 博客
  • 博客访问: 834651
  • 博文数量: 143
  • 博客积分: 455
  • 博客等级: 一等列兵
  • 技术积分: 861
  • 用 户 组: 普通用户
  • 注册时间: 2012-08-03 00:11
文章分类

全部博文(143)

文章存档

2018年(10)

2017年(6)

2016年(28)

2015年(14)

2014年(67)

2013年(1)

2012年(17)

我的朋友

分类: LINUX

2014-03-12 13:45:42

insmod modprobe 都是载入 kernel module,不过一般差别于 modprobe 能够处理 module 载入的相依问题。不限目录路径.  insmod 这个工具,和modprobe 有点类似,但功能上没有modprobe 强,modprobe 在挂载模块是不用指定模块文件的路径,也不用带文件的后缀.o .ko ;而insmod 需要的是模块的所在目录的绝对路径,并且一定要带有模块文件名后缀的(modulefile.o modulesfile.ko );

       对于这个工具,我们只是介绍一下, 并不推荐使用。因为模块有依赖关系,对于新手来说,可能不知道这个模块依赖和哪个模块依赖;    

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

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

modprobe:

modprobe可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。 

 -a--all  载入全部的模块。   

 -c--show-conf  显示所有模块的设置信息。  

 -d--debug  使用排错模式。   

-l--list  显示可用的模块。   

 -r, --remove //若在命令指定模块,则删除指定模块,否则,指定"自动清除"模式   

 -t--type  指定模块类型。   

 -v--verbose  执行时显示详细的信息。   

-V--version  显示版本信息。   

-help  显示帮助。   

-C, --config configfile //指定配置文件.默认使用/etc/modules.conf文件为配置文件,传递参数给模块  

modprobe -r ip_vs  # 删除ip_vs模块 

modprobe -l | grep ip_vs  # 查看ip_vs模块是否编译进内核   

 lsmod 是列出目前系统中已加载的模块的名称及大小等;另外我们还可以查看 /proc/modules ,我们一样可以知道系统已经加载的模块;

 lsmod -l | grep ip_vs  # 查看ip_vs模块是否载入进内核      

核心模组的载入与移除: insmod, modprobe, rmmod 
好了,如果我想要自行手动载入模组,又该如何是好?有很多方法啦,最简单而且建议的,是使用 modprobe 这个指令来载入模组, 这是因为 modprobe 会主动的去搜寻 modules.dep 的内容,先克服了模组的相依性后, 才决定需要载入的模组有哪些,很方便。 

至于 insmod 则完全由使用者自行载入一个完整档名的模组, 并不会主动的分析模组相依性啊!

 [root@linux ~]# insmod [/full/path/module_name] [parameters] 

范例一:请尝试载入 /lib/modules/`uname -r`/kernel/fs/smbfs/smbfs.ko 

[root@linux ~]# insmod /lib/modules/`uname -r`/kernel/fs/smbfs/smbfs.ko
[root@linux ~]# lsmod | grep smbfs

smbfs                  67897  0 

对吧!他立刻就将该模组载入啰~这个需要加入完整档名啦!那如何移除这个模组呢?  

 [root@linux ~]# rmmod [-fw] module_name

参数:

 -f  :强制将该模组移除掉,不论是否正被使用;

 -w  :若该模组正被使用,则 rmmod 会等待该模组被使用完毕后,才移除他! 范例:  范例一:将刚刚载入的 smbfs 模组移除! 

[root@linux ~]# rmmod smbfs 

帅吧!移除掉了。不过,如前所述的, insmod 实在不怎么人性化,近年来, 我们都建议直接使用 modprobe 来处理模组载入的问题,这个指令的用法是: 

[root@linux ~]# modprobe [-lcf] module_name

参数: 
-c 
:列出目前系统所有的模组!(更详细的代号对应表) 

-l  :列出目前在 /lib/modules/`uname -r`/kernel 当中的所有模组完整档名;

-f  :强制载入该模组; 

-r  :类似 rmmod ,就是移除某个模组啰~

范例: 

范例一:载入 smbfs 模组 

[root@linux ~]# modprobe smbfs 

# 很方便吧!不需要知道完整的模组档名,这是因为该完整档名已经记录到

# /lib/modules/`uname -r`/modules.dep 当中的缘故啊!如果要移除的话: 
[root@linux ~]# modprobe -r smbfs 

使用 modprobe 真的是要比 insmod 方便很多!因为他是直接去搜寻 modules.dep 的纪录, 所以啰,当然可以克服模组的相依性问题,而且还不需要知道该模组的详细路径呢! 好方便! ^_^      

modinfo  xx_mod  显示kernel模块的信息 

注意: 模块名是不能带有后缀的,我们通过modprobe -l 所看到的模块,都是带有.ko .o后缀;   

depmod 创建模块依赖关系的列表  

功能:分析可加载模块的依赖性,生成modules.dep文件和映射文件。

用法:depmod [-b basedir] [-e] [-F System.map] [-n] [-v] [version] [-A] depmod [-e] [-F System.map] [-n] [-v] [version] [filename...]

描述:  Linux内核模块可以为其它模块提供提供服务(在代码中使用EXPORT_SYMBOL),这种服务被称作”symbols”。若第二个模块使用了这个symbol,则该模块很明显依赖于第一个模块。这些依赖关系是非常繁杂的。 

depmod读取在/lib/modules/version 目录下的所有模块,并检查每个模块导出的symbol和需要的symbol,然后创建一个依赖关系列表。默认地,该列表写入到/lib/moudules /version目录下的modules.dep文件中。若命令中的filename有指定的话,则仅检查这些指定的模块(不是很有用) 

若命令中提供了version参数,则会使用version所指定的目录生成依赖,而不是当前内核的版本(uname -r 返回的)

选项: 

-b basedir  basedir basedir  若你的模块并没有正确的在/lib/mdules/version下,可以指定目录生成依赖。 

-e  errsyms  -F选项一起使用,当一个模块需要的symbol在其它模块里面没有提供时,做出报告。正常情况下,模块没有提供的symbol都在内核中有提供。

-F  filesyms System.map 提供一个System.map文件(在内核编译时生成的)-e选项报告出unresolved symbol 

-n  dry_run  将结果modules.dep和各种映射文件输出到标准输出(stdout),而不是写到模块目录下。

-A quick  检查是否有模块比modues.dep中的模块新,若没有,则退出不重新生成文件。     

这个模块管理工具是创建模块依赖关系的列表,有几个参数我们注意一下就行了,目前的的Linux 发行版所用的内核是2.6x版本,是自动解决依赖关系,所以这个命令知道就行了;模块之前也有依赖关系,比如我们想驱动USB 移动硬盘,目前有两种驱动,一种是udev ,在内核中有,但目前不太稳定;另一种办法是用usb-storage驱动,而usb-storage 依赖的模块是scsi 模块,所以我们要用usb-storage 的模块,也得把scsi 编译安装;     

再举个例子:sata的硬盘,在Linux中的设备表示的是/dev/sd* ,比如 /dev/sda/dev/sdb ... 系统要驱动 sata硬盘,则需要把sata在内核中选中,或编译成模块,或内置于内核之中,在此同时,还需要在内核中选中ide scsi 的支持等;     

depmod 工具的洋文原意:depmod program to generate modules.dep and map files.(我译的:为modules.dep 文件或映射文件创建依赖关系)     

[root@localhost beinan]# depmod -a

注:为所有列在/etc/modprobe.conf /etc/modules.conf 中的所有模块创建依赖关系,并且写入到modules.dep文件;     

[root@localhost beinan]# depmod -e 注:列出已挂载但不可用的模块;     
[root@localhost beinan]# depmod -n
注:列出所有模块的依赖关系,但仅仅是输出出来 Write the dependency file on stdout only     

注:modules.dep 位于 /lib/modules/内核版本 目录    

比如 Fedora Core 4.0 中,系统默认的内核:     

[root@localhost beinan]# ls /lib/modules/2.6.11-1.1369_FC4/modules.dep     /lib/modules/2.6.11-1.1369_FC4/modules.dep

阅读(1169) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~