1. modprobe命令详解
modprobe工具可以智能的添加和删除一个模块,之所以说它智能,是因为它能够通过配置的一些预定义的规则解析出模块之间的依赖关系,并且自动加载依赖的模块。
modprobe会从 /lib/modules/uname -r目录中查找要加载的模块以及对应的依赖规则,除了这个目录以外,modprobe还有一个配置目录/etc/modprobe.d,这个配置目录中是用户可以自定义的一些modprobe行为。
1.1 依赖关系配置
modprobe是从/lib/modules/uname -r/modules.dep文件来查找依赖关系的,默认modprobe也是在/lib/modules/uname -r/目录中查找模块进行加载的。
如下图以我的机器为例,截取部分的依赖文件/lib/modules/4.19.125/modules.dep;
extra/host/xhci-plat-hcd.ko: extra/host/xhci-hcd.ko
extra/gadget/function/usb_f_ss_lb.ko: extra/gadget/libcomposite.ko
extra/gadget/function/usb_f_uvc.ko: extra/gadget/libcomposite.ko
extra/gadget/function/u_ether.ko:
extra/serial/usbserial.ko:
extra/serial/ch341.ko: extra/serial/usbserial.ko
extra/gadget/libcomposite.ko:
extra/gadget/function/usb_f_acm.ko: extra/gadget/function/u_serial.ko extra/gadget/libcomposite.ko
extra/gadget/function/usb_f_mass_storage.ko: extra/gadget/libcomposite.ko
extra/gadget/function/usb_f_rndis.ko: extra/gadget/function/u_ether.ko extra/gadget/libcomposite.ko
extra/gadget/function/usb_f_serial.ko: extra/gadget/function/u_serial.ko extra/gadget/libcomposite.ko
extra/gadget/function/u_serial.ko:
extra/serial/pl2303.ko: extra/serial/usbserial.ko
extra/cdns3/cdns3.ko:
extra/typec/axera_sgm7220.ko:
extra/storage/uas.ko: extra/storage/usb-storage.ko
extra/uio/uio_pdrv_genirq.ko:
extra/host/xhci-hcd.ko:
extra/typec/tcpci.ko: extra/typec/tcpm.ko
extra/spi/spidev.ko:
extra/misc/usbtest.ko:
extra/class/cdc-acm.ko:
extra/storage/usb-storage.ko:
extra/typec/tcpm.ko:
1.2 modprobe.d配置
/etc/modprobe.d中定义的关键功能如下:
modprobe 和 insmod在linux下都用来加载模块,两者用法区别如下:
(1)insmod需指定所需加载模块的路径,且只加载所指定的模块,如果所指定的模块依赖于其他模块,insmod不会自动添加,insmod使用方法如下:insmod 某路径/xxx.ko
(2)modprobe相比较于insmod更加智能,使用modprob加载模块时只需指定模块名称而不是模块的路径,使用modprobe加载内核模块时,如果加载的模块依赖于其他模块,modprobe会自动加载被依赖的模块,比如我们需要加载模块A,但是模块A依赖于模块B,那么我们在使用modprobe加载内核模块A时,modprobe会先加载内核模块B,然后再加载内核模块A。使用方法如下:modprobe xxx
Q1:modprobe加载内核模块时只需指定模块名称而不需要路径,那modprobe是如何知道要加载的内核模块的路径的?
Q2:modprobe是如何判断加载模块时所加载的模块是否依赖其他模块的?
问题1: modprobe加载内核的文件必须位于/lib/modules/(shell uname -r)目录下,也就是modprobe加载内核模块之所以不需要指定路径是因为modprobe命令有默认的加载路径。
问题2: modeprobe加载内核模块时依赖于/lib/modules/(shell uname -r)/modules.dep文件,modules.dep文件中列举了modproe可加载的内核文件以及内核文件所依赖的文件。假如一个内核模块位于/lib/modules/(shell uname -r)目录下,但是该模块未添加到modules.dep文件中,也无法通过modeprobe命令加载。那么问题来了,modules.dep文件是如何生成的?modules.dep文件通过depmode生成,如果往/lib/modules/(shell uname -r)目录下放置一个新的内核模块XXX并且希望通过modprobe命令进行加载模块XXX,那么将内核模块XXX放到/lib/modules/(shell uname -r) 目录下后需运行depmode命令,然后再运行modeprobe XXX才能将内核模块加载成功,否则会报错: modeprobe XXX not found。
depmod作用:
上面已经说过了,用于生成modprobe依赖的modules.dep。