温故而知新
今天回头复习下模块的命令使用:
1、模块手动加载命令:insmod、modprobe
手动加载模块要求用户具有root权限。在开发过程中,通常使用insmod来加载模块,并且应该给出所加载模块的路径,例如:
虽然这种方式比较低级,但它是其他模块加载方式的基础。在系统管理和生产系统中常用的模块加载形式则是modprobe,这种方式更加智能。它会在加载模块之前解析modules.dep文件,以便先确认依赖关系,然后自动处理依赖关系:
能否使用modprobe加载模块,取决于depmod工具是否知道模块的依赖关系。
2、depmod工具
在内核构建过程中运行depmod工具可以生成模块依赖文件,它读取/lib/modules/<kernel_release>/中的每个模块确定它应该导出哪些符号以及它需要什么符号,然后将处理的结果写入modules.dep以及二进制版本modules.dep.bin,它是一种模块索引。
除此之外,depmod工具还可以从模块文件中提取出该模块所支持的硬件设备和硬件设备所属厂商的ID(这些信息是驱动开发人员提供给模块的),并在lib/modules/<kern_release>/modules.alias中生成modules.alias文件(可以将其理解文驱动程序的索引表,表中标明了驱动程序所支持的设备有哪些),该文件将设备映射到其对应的驱动程序。
modules.alias文件将会在处理热拔插事件时被modprobe调用,以确定什么驱动模块应当被加载。
用户空间的热插拔代理程序udev用于接收到内核发布的通知(通常是设备描述符,pid、vid、类、设备类、设备子类、接口以及可标识设备的所有信息)。当热拔插守护进程接收到通知后,会调用modprobe,并传递设备描述信息,接下来,modprobe解析module.alias文件,匹配与之相关的驱动程序。在加载模块之前,modprobe会在module.dep中查找与之有依赖关系的模块,在所有的被依赖模块安装完成后,再加载指定模块。
3、配置模块开机自启动,/etc/modules-load.d/<filename>.conf
用于在启动时加载一些模块,人们通常使用:/etc/modules-load.d/modules.conf,当然也可以根据需要创建多个.conf文件。下面是一个/etc/modules-load.d/mymodules.conf
模块卸载命令:rmmod、modprobe -r
常用的模块卸载命令是rmmod,人们更喜欢使用这个命令来卸载使用insmod加载的模块,使用该命令时只需要传递模块名即可,例如:
需要说一下的时,模块卸载是内核的一项可配置的功能,该功能的启用或者禁止由CONFIG_MODULE_UNLOAD的值确定,没有这个选项或者这个选项配置为“n”就不能卸载任何模块,以下配置就启动模块卸载功能:
倘若用户需要卸载的模块还在被使用,则内核不会允许该卸载行为的发生。除非在内核配置中进行了如下配置:
modprobe -r是一种卸载模块的高级形式,能够自动卸载未使用的且与要卸载模块相关的被依赖模块。
若果要查看卸载或者加载模块,可以使用lsmod进行查看。