一、insmod命令详解

insmod命令用于将给定的模块加载到内核中。Linux有许多功能是通过模块的方式,在需要时才载入kernel。如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序。

注意:需要注意的是使用insmod在加载模块时,仅仅是临时加载,即重启后该模块会失效。

2、用法:

语法
insmod(选项)(参数)

选项
-f:不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入;
-k:将模块设置为自动卸除;
-m:输出模块的载入信息;
-o<模块名称>:指定模块的名称,可使用模块文件的文件名;
-p:测试模块是否能正确地载入kernel;
-s:将所有信息记录在系统记录文件中;
-v:执行时显示详细的信息;
-x:不要汇出模块的外部符号;
-X:汇出模块所有的外部符号,此为预设置。

参数
内核模块:指定要加载的内核模块文件。

实例
加载RAID1阵列级别模块,如下所示:

[root@localhost boot]# insmod /lib/modules/2.6.
18-8.el5/kernel/drivers/md/raid1.ko  
 
[root@localhost boot]# lsmod | grep raid1
raid1                  25153  0

从以上显示结果可知,RAID1模块已加载成功。只是在使用insmod命令加载模块时,需要使用绝对路径方能加载,且加载时无法自动解决依赖关系。

静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用。静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新编译和下载内核,效率较低。若采用静态加载的驱动较多,会导致内核容量很大,浪费存储空间。

动态加载利用了Linuxmodule特性,可以在系统启动后用insmod命令添加模块(.ko),在不需要的时候用rmmod命令卸载模块,采用这种动态加载的方式便于驱动程序的调试,同时可以针对产品的功能需求,进行内核的裁剪,将不需要的驱动去除,大大减小了内核的存储容量。

在这里插入图片描述
【insmod与modprobe命令】

在Linux中,modprobe和insmod都可以用来加载module,不过现在一般都推荐使用modprobe而不是insmod了。 modprobe和insmod的区别是什么呢?

  1. modprobe可以解决load module时的依赖关系,比如load moudleA就必须先load mouduleB之类的,它是通过/lib/modules//modules.dep文件来查找依赖关系的。而insmod不能解决依赖问题。

  2. modprobe默认会去/lib/modules/目录下面查找module,而insmod只在给它的参数中去找module(默认在当前目录找)。 这样,有时insmod也有它的有用之处,举个例子吧。

/root/my-mod.ko这个modulecd /root/,然后用insmod my-mod.ko(insmod /root/my-mod.ko)就可以insert这个module了,但是用modprobe my-mod.ko(modprobe /root/my-mod.ko)却提示"FATAL: Module my-mod.ko not found",这就是因为modprobe是到/lib/modules/uname -r/下去找module的,如果没找到就是这样了。

二、mknod命令详解

我们的linux操作系统跟外部设备(如磁盘、光盘等)的通信都是通过设备文件进行的,应用程序可以打开、关闭、读写这些设备文件,从而对设备进行读写,这种操作就像读写普通的文件一样easy。linux为不同种类的设备文件提供了相同的接口,比如read(),write(),open(),close()

所以在系统与设备通信之前,系统首先要建立一个设备文件,这个设备文件存放在/dev目录下。其实系统默认情况下就已经生成了很多设备文件,但有时候我们需要自己手动新建一些设备文件,这个时候就会用到像mkdir, mknod这样的命令。

   mknod 的标准形式为:       mknod DEVNAME {b | c}  MAJOR  MINOR

1,DEVNAME是要创建的设备文件名,如果想将设备文件放在一个特定的文件夹下,就需要先用mkdir在dev目录下新建一个目录;

2, b和c 分别表示块设备和字符设备:
b表示系统从块设备中读取数据的时候,直接从内存的buffer中读取数据,而不经过磁盘;
c表示字符设备文件与设备传送数据的时候是以字符的形式传送,一次传送一个字符,比如打印机、终端都是以字符的形式传送数据;

3,MAJORMINOR分别表示主设备号和次设备号:
为了管理设备,系统为每个设备分配一个编号,一个设备号由主设备号和次设备号组成。主设备号标示某一种类的设备,次设备号用来区分同一类型的设备。linux操作系统中为设备文件编号分配了32位无符号整数,其中前12位是主设备号,后20位为次设备号,所以在向系统申请设备文件时主设备号不好超过4095,次设备号不好超过2^20 -1。
.
下面,我们就可以用mknod命令来申请设备文件了。

  mkdir -p  /dev/cobing
   mknod /dev/cobing/mydev1 c 128 512

注意:不是所有的编译的模块是需要通过mknod进行按照后再insmod的,有的模块仅需要insmod即可。

三、模块进行加载后重启失效

为了是在命令行中执行insmod命令安装的驱动能在重启之后还有的解决方法大致有一下两种方法:

(1)直接编译内核,把想安装的驱动在编译内核的时候给编译进去,这种方法比较麻烦,花的时候也比较的多,一般不采用这种方法(这种方法网上有很多资料可以参考)。

(2)这种方法比较简单:就是在启动脚本中加载模块,这样每次开机启动都自动加载相应的驱动模块。具体的方式如下:

  在文件/etc/rc.local中加载你想要的模块程序即可

比如我想再系统启动的时候自动给我完成:卸载r8169驱动、然后安装r8168驱动、同时重启网络服务器的工作,那么我在该文件中的exit 0 之前写如下的语句:

rmmod r8169#(卸载相应的驱动)

insmod /usr/src/r8168.ko#(这个是r8168.ko文件放的绝对路径),这步是安装相应的驱动

ifconfig eth0 down

ifconfig eth0 up

然后保存,重新启动reboot之后,系统就将自动完成我们想要的那几步工作。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐