1原因
- insmod是临时加入系统的,重启后会被消除。
- rmmod是临时卸载的,重启后驱动还在
2 linux开机时驱动的加载流程
Linux系统开机后,首先加载initramfs文件中包含的驱动程序,如果相应的设备对应的驱动不在initramfs文件包含范围内,那么会去硬盘中存储的驱动库中去寻找匹配的驱动进行加载;硬盘中驱动库的位置即为:/lib/modules/“uname -r”/;所以相应的驱动只要在硬盘的驱动库或者initramfs中至少存在一个就可以正常加载,一旦在initramfs中加载成功,无论硬盘中的驱动库中存在的驱动版本是否相同都不会重新去加载。Initramfs中包含的驱动ko文件在目录lib/modules/下,具体包含的ko可依次查看。
3 升级驱动
3.1 modprobe vs insmod
modprobe不仅仅加载驱动,而且还会加载其依赖,当确定驱动模块不需要依赖的时候就用insmod xxx .不过这两种方法都只是临时的加载驱动,重启系统后就没有了,只作为临时调试用。
3.1.1 modprobe
注:在使用这个命令加载模块前先使用depmod -a命令生成modules.dep文件,该文件位于/lib/modules/$(uname -r)目录下;
modprobe命令智能地向内核中加载模块或者从内核中移除模块,可载入指定的个别模块,或是载入一组相依的模块。modprobe会根据depmod所产生的依赖关系,决定要载入哪些模块。若在载入过程中出错,modprobe会卸载整组的模块。
载入模块的命令:
(1) 载入指定的模块:modprobe drv.ko
(2) 载入全部模块:modprobe -a
卸载模块的命令:modprobe -r drv.ko
modprobe命令用于智能地向内核中加载模块或者从内核中移除模块。
3.2 dracut --force升级.ko 驱动模块
以i40e驱动为例,假如我们采用make&make install的方式在当前的环境上编译升级驱动时,i40e驱动的makefile文件自动会为我们执行dracut --force命令去同时更新initramfs文件使i40e驱动更新。
而当我们为其他的现场环境编译驱动时,这时无法直接在线程环境上make&make install命令去安装,而一般我们采用编好的i40e.ko驱动文件去替换掉原有的i40e.ko文件。
这时更新驱动的流程如下:
(1)将i40e驱动拷贝到/lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/i40e文件夹下,替换系统原有的i40e.ko.xz文件;(升级系统原有的驱动)
(2)执行depmod –a重新生成模块依赖关系;
(3)执行modinfo i40e查看相关信息是否与当前替换的版本信息一致;
(4)如果当前环境下可以成功执行rmmod i40e卸载当前环境下的驱动,则执行modprobe i40e加载驱动即可生效,无需重启;
(5)执行dracut --force命令重新生成initramfs文件(该文件中包含有老版本的i40e驱动,如果不进行更新则重启后依然后加载老版本的驱动);
(6)如果无法卸载当前环境下的i40e驱动,则重启后生效;
note:depmod –a 和dracut --forece命令的执行路径在/lib/modules/$(uname -r)/目录下执行才行
#升级驱动脚本例子
#!/bin/bash
#./driver.sh a (make all)
#./driver.sh (make module)
echo $1
if [ "$1" = "a" ];then
echo "make all"
make -j12
else
echo "make module"
make modules SUBDIRS=drivers/scsi/mpt3sas
fi
if [ $? -eq 0 ];then
rm /lib/modules/$(uname -r)/kernel/drivers/scsi/mpt3sas/mpt3sas.ko
cp ./drivers/scsi/mpt3sas/mpt3sas.ko /lib/modules/$(uname -r)/kernel/drivers/scsi/mpt3sas/
cd /lib/modules/4.15.10/
depmod -a
dracut --force
update-initramfs -u
#rmmod mpt3sas
dmesg -C
cd /lib/modules/4.15.10/kernel/drivers/scsi/mpt3sas
#modprobe mpt3sas.ko
#insmod mpt3sas.ko
else
echo "fail!"
fi
# Note: For certain distributions like (but not limited to) Red Hat Enterprise
# Linux 7 and Ubuntu, once the driver is installed, you may need to update the
# initrd/initramfs file to prevent the OS loading old versions of the
# driver. Use the dracut utility on Red Hat distributions:
# # dracut --force
# For Ubuntu:
# # update-initramfs -u