内核与内核模块:depmod,lsmod,modinfo,insmod,rmmod,mdprobe

内核与内核模块:depmod,lsmod,modinfo,insmod,rmmod,mdprobe
  首先,我们得知道内核与内核模块放在哪里。
内核:/boot/vmlinuz或/boot/vmlinuz-version;
内核解压缩所需RAMDisk:/boot/initrd(/boot/initrd-version);
内核模块:/lib/modules/version/kernel或/lib/modules/$(uname -r)/kernel;
内核源码:/usr/src/linux 或 /usr/src/kernels;
  如果内核顺利被加载了,会有以下几个信息记录:
内核版本:/proc/version
系统内核功能:/proc/sys/kernel
  假如我有个新硬件,偏偏我的系统不支持,要这样做:
重新编译内核,并加入最新的硬件驱动程序源码;
将该硬件的驱动程序编译成为模块,在启动时加载该模块。

  下面我们着重讲一下内核模块
一、内核模块与依赖性
  基本上,内核模块放置处是在 /lib/modules/$(uname -r)/kernel当中,里面的几个目录主要为:
arch 与硬件平台有关的选项
crypto 内核所支持的加密的技术
drivers 一些硬件的驱动程序
fs 内核所支持的文件系统
lib 一些函数库
net 与网络有关的各项协议数据,还有防火墙模块等
sound 与音效有关的各项模块
  还有文件/lib/modules/$(uname -r)/modules.dep ,记录了内核支持的模块的依赖性。那么如何创建该文件呢?如下:
#depmod [-Ane]
  -A:不加任何参数时,depmod会主动去分析目前内核的模块,并且重新写入/lib/modules/$(uname -r)/
modules.dep当中。如果加-A参数,则会查找比modules.dep内还要新的模块,如果真找到,才会更新。
  -n:不写入modules.dep,而是将结果输出到屏幕上。
  -e:显示出目前已加载的不可执行的模块名称。

  例子:我做好一个网卡驱动程序a.ko(内核模块名以.ko结尾),该如何更新内核的依赖性?
#cp a.ko /lib/modules/$(uname -r)/kernel/drivers/net
#depmod


二、内核模块的查看
  查看目前模块加载了多少的模块。
#lsmod
模块名称     模块的大小  此模块是否被其他模块使用

查阅每个模块信息
#modinfo [-adln] [module_name|filename]
  -a:仅列出作者名
  -d:仅列出该modules的说明
  -l:仅列出授权
  -n:仅列出该模块的详细路径

  例子:#modinfo mii


三、内核模块的加载与删除
  最好使用modprobe这个命令加载模块,因为modprobe会主动查找modules.dep的内容,解决了依赖性后,才决定需要加载的模块有哪些。
  insmod则完全由用户自行加载一个完整文件名的模块,并不会主动分析模块依赖性。
#insmod [/full/path/module_name] [parameters]

  例子:尝试载入cifs.ko这个文件系统模块
#insmod /lib/modules/$(uname -r)/kernel/fs/cifs/cifs.ko
  记住,一定要是完整的文件名。

#rmmod [-fw] module_name
  -f:强制将该模块删除掉,不论是否正在被使用
  -w:若该模块正在被使用,则等待该模块被使用完毕后再删除

  insmod与rmmod的问题时,你必须自行找到模块的完整文件名才行。所以,我们一般使用modprobe.
#modprobe [-lcfr] module_name
  -c:列出目前系统上面所有的模块
  -l:列出目前在/lib/modules/`uname -r`/kernel当中的所有模块完整文件名
  -f:强制加载该模块
  -r:删除某个模块

  例子:加载cifs模块
   #modprobe cifs
  很方便,因为我们根本不用知道完整的模块文件名

内核模块的额外参数配置:/etc/modprobe.conf
  如果你想修改某些模块的额外参数设置,就在这个文件内。

  #vi /etc/modprobe.conf


例子:

用modprobe 加载模块时,提示模块找不到的问题,如在/home目录下有个编译好的模块:helloworld.ko,
当我们运行 sudo modprobe /home/helloworld.ko时,会提示“FATAL: Module helloworld not found.”
modprobe是在/lib/module/`uname -r`下寻找加载的模块的,并且modprobe需要一个最新的modules.dep文件,
这个modules.dep文件内容是些各个模块之间的依赖等信息,此文件是由depmod命令来更新的。

man modprobe:
modprobe  looks  in  the  module  directory  /lib/modules/`uname  -r`  for  all  the modules and other files, except for the
       optional  /etc/modprobe.conf  configuration  file  and  /etc/modprobe.d
       directory (see modprobe.conf(5)).

 modprobe expects an up-to-date modules.dep file, as generated by depmod
       (see depmod(8)). This file lists what other modules each  module  needs
       (if  any),  and  modprobe uses this to add or remove these dependencies
       automatically. See modules.dep(5)).

所以我们需要做的事情:
1.将编译好的模块放入/lib/module/`uname -r`下,
2. 用depmod更新modules.dep文件
3. modprobe helloworld.ko


常见错误:

编译驱动的时候碰到了  insmod: error inserting './igb.ko': -1 Unknown symbol in module 的问题,在网上看了下,说是查看 dmesg | tail 看输出信息中的Unknown symbol,加载上这些模块就好。我的输出信息是:

1
2
3
4
5
[ 3548.357465] igb: Unknown symbol dca_remove_requester
[ 3548.358569] igb: Unknown symbol dca_add_requester
[ 3548.358814] igb: Unknown symbol dca_unregister_notify
[ 3548.358817] igb: Unknown symbol dca_register_notify
[ 3548.358924] igb: Unknown symbol dca3_get_tag

但是我在系统中查看

dca_remove_requester

dca_add_requester

dca_unregister_notify

dca_register_notify

dca3_get_tag

5个模块是没有找到,细细一想,估计是由于模块依赖的其他模块没有加载导致的。

直接用: modinfo  ./igb.ko | grep depend   找模块的依赖,结果如下,

depends:        dca

然后再执行: 

localhost:/opt/igb/igb-4.0.17/src #  modprobe dca

localhost:/opt/igb/igb-4.0.17/src #  insmod ./igb.ko 


一切OK,嘿嘿,看来以后加载模块之前还是要先看看他的依赖是不是已经加载了阿。


附:《模块加载常见错误》

  1. insmod: error inserting './igb.ko': -1 Unknown symbol in module           --->    依赖的模块没有加载,需要先加载 depends 中列出的模块

  2. insmod: error inserting './igb.ko': -1 Operation not permitted                --->    这当然是你用普通用户执行才出现的错误咯

  3. insmod: error inserting './igb.ko': -1 Invalid module format                    --->    模块的vermagic(就是编译内核的环境的内核版本)和当前系统不相匹配

  4. insmod: error inserting './aacraid.ko': -1 No such device                       --->    模块是对的,只是没有相应的设备

呵呵,其他的还没收集,等想起来了再加上。


  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值