Linux加载内核模块的过程,记录一下,主要命令有modprobe、insmod及depmod等,命令由module-init-tools的软件包提供,请先确认系统安装了此软件包。本文方法已在CentOS 5 x86_64和CentOS6 x86_64系统上验证通过。
一,查看内核已加载的模块
[root@os ~]# lsmod
该命令通过读取/proc/modules文件中的内容列出已加载的模块。
系统中的所有模块位于/lib/modules/$(uname -r)/kernel/下的各种目录中。
二,手动加载模块
手动加载模块的方法有两个,下面分别介绍。
2.1 执行insmod命令加载模块
[root@os ~]# insmod mycdev.ko
2.2 执行modprobe命令加载模块
将模块拷入到相应目录下
[root@os ~]# cp mycdev.ko /lib/modules/$(uname -r)/kernel/drivers/char/
然后把模块的绝对地址写入到modules.dep文件中
手动写入(注意写入的行末尾有一个冒号)
[root@os ~]# echo /lib/modules/$(uname -r)/kernel/drivers/char/mycdev.ko: >> /lib/modules/$(uname -r)/modules.dep
或者执行如下命令自动写入
[root@os ~]# depmod -a
然后,就可以加载模块了
[root@os ~]# modprobe mycdev #加载模块
[root@os ~]# lsmod | grep mycdev #检验加载是否成功
mycdev 35840 0
三,卸载模块
[root@os ~]# rmmod sysdog
四,开机自动加载模块
鸟哥的linux私房菜一书中,介绍的Linux系统开机流程:
(1) 载入BIOS的硬件信息,并取得第一个开机装置的代号
(2) 读取第一个开机装置的MBR的boot Loader (grub)的开机信息
(3) 载入OS Kernel信息,解压Kernel,尝试驱动硬件
(4) Kernel执行init程序并获得run-lebel信息(如3或5)
(5) init执行/etc/rc.d/rc.sysinit
(6) 启动内核外挂模块(/etc/modprobe.conf)
(7) init执行run-level的各种Scripts,启动服务
(8) init执行/etc/rc.d/rc.local
(9) 执行/bin/login,等待用户Login
(10)Login后进入Shell
打开/etc/rc.sysinit(是一个软链接,指向/etc/rc.d/rc.sysinit),会发现有如下内容
……
# Load other user-defined modules
for file in /etc/sysconfig/modules/*.modules ; do
[ -x $file ] && $file
done
# Load modules (for backward compatibility with VARs)
if [ -f /etc/rc.modules ]; then
/etc/rc.modules
fi
……
由此可见,如果想让一个模块开机自动加载,只要把模块加到这两个文件之中即可。
[root@os ~]# echo 'modprobe mycdev' > /etc/sysconfig/modules/mycdev.modules
[root@os ~]# chmod +x /etc/sysconfig/modules/mycdev.modules #不能少,否则会加载失败
然后重启,执行lsmod命令,会发现模块已加载。