Linux的kernel能够以动态的方式加载,卸载模块,以达到减小内核的大小,复杂度,以及增加内核的灵活性。目前,我知道的有lsmod,insmod,rmmod,modprobe四条命令,现在分别总结记录这四条命令,命令后的模块名称均不加后缀(如.ko或.o)。
1:lsmod 即list modules的简称
功能说明:显示已载入系统的所有模块。
语法:lsmod 模块名称
说明:执行lsmod指令,会列出所有已载入系统的模块。Linux操作系统的核心具有模块化的特性,因此在编译核心时,无需把全部的功能都放入核心。你可以将这些功能编译成一个个单独的模块,待需要时再分别载入
一般显示的格式如下:
nfs 170109 0 - Live 0x129b0000
lockd 51593 1 nfs, Live 0x128b0000
nls_utf8 1729 0 - Live 0x12830000
vfat 12097 0 - Live 0x12823000
fat 38881 1 vfat, Live 0x1287b000
第一列表示:模块的名字
第二列表示:用到的内存大小,单位为byte
第三列表示:列出当前引用了该模块的实例数,0表示这是没有实例引用该模块
第四列表示:列出它所依赖的模块如果有的话
第五列表示:模块加载的状态,取值只能是Live,Loading或Unloading中的一个
第六列表示:加载的模块在内核中内存地址偏移量,这个信息可用于调试的目的
2:insmod 即insert module的简称
功能说明:载入模块。
语法:insmod [-fkmpsvxX][-o <模块名称>][模块文件][符号名称 = 符号值]
说明:Linux有许多功能是通过模块的方式,在需要时才载入kernel。如此可使kernel较为精简,进而提高效率,以及保有较大的弹性。这类可载入的模块,通常是设备驱动程序。
参数-f 不检查目前kernel版本与模块编译时的kernel版本是否一致,强制将模块载入。
-k 将模块设置为自动卸除。
-m 输出模块的载入信息。
-o<模块名称> 指定模块的名称,可使用模块文件的文件名。
-p 测试模块是否能正确地载入kernel。
-s 将所有信息记录在系统记录文件中。
-v 执行时显示详细的信息。
-x 不要汇出模块的外部符号。
-X 汇出模块所有的外部符号,此为预设值。
3:rmmod 即remove module的简称
功能说明:删除模块。
语法:rmmod [-as][模块名称...]
说明:执行rmmod指令,可删除不需要的模块。Linux操作系统的核心具有模块化的特性,因此在编译核心时,不需把全部的功能都放入核心。你可以将这些功能编译成一个个单独的模块,待有需要时再分别载入它们。
参数:
-a 删除所有目前不需要的模块。
-s 把信息输出至syslog常驻服务,而非终端机界面。
4:modprobe 即module probe的简称
功能说明:自动处理可载入模块。
语法:modprobe [-acdlrtvV][--help][模块文件][符号名称 = 符号值]。
说明:modprobe可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系,决定要载入哪些模块。若在载入过程中发生错误,在modprobe会卸载整组的模块。
参数
-a或--all 载入全部的模块。
-c或--show-conf 显示所有模块的设置信息。
-d或--debug 使用排错模式。
-l或--list 显示可用的模块。
-r或--remove 模块闲置不用时,即自动卸载模块。
-t或--type 指定模块类型。
-v或--verbose 执行时显示详细的信息。
-V或--version 显示版本信息。
-help 显示帮助。
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 程式所建立。(PS:今天遇到想卸载一个module,用rmmod总是失败,后来用modprobe -r就成功卸载了,不知道是不是因为依耐性的问题)。