第1节 内核的组成
1.1 内核镜象文件
内核通常会以镜象文件(Image File)的类型存储在Linux系统中。当你启动装有Linux系统的计算机时,启动加载器(Boot Loader)程序会将内核镜象文件直接加载到内存,以启动内核与整个操作系统。
[flagonxia@dreamworks boot]$ pwd
/boot
[flagonxia@dreamworks boot]$ ls -l vmlinuz-2.6.9-55.0.2.EL
-rw-r--r-- 1 root root 1511833 Jun 27 2007 vmlinuz-2.6.9-55.0.2.EL
通常,内核镜象文件保存在/boot/下面。
1.2 内核模块 (kernel Modul)
那些没有编译到内核镜象文件中的功能都被单独编译成内核模块,存放在/lib/modules/KERNEL_VERSION/目录下。
[flagonxia@dreamworks 2.6.9-55.0.2.EL]$ pwd
/lib/modules/2.6.9-55.0.2.EL
[flagonxia@dreamworks 2.6.9-55.0.2.EL]$ ls -l
total 692
drwxr-xr-x 9 root root 4096 Aug 30 2007 kernel-rw-r--r-- 1 root root 125273 Aug 30 2007 modules.alias
-rw-r--r-- 1 root root 69 Aug 30 2007 modules.ccwmap
-rw-r--r-- 1 root root 137583 Aug 30 2007 modules.dep
-rw-r--r-- 1 root root 73 Aug 30 2007 modules.ieee1394map
-rw-r--r-- 1 root root 357 Aug 30 2007 modules.inputmap
-rw-r--r-- 1 root root 235 Aug 30 2007 modules.isapnpmap
-rw-r--r-- 1 root root 123586 Aug 30 2007 modules.pcimap
-rw-r--r-- 1 root root 69929 Aug 30 2007 modules.symbols
-rw-r--r-- 1 root root 158926 Aug 30 2007 modules.usbmap
其中的子目录kernel是内存模块真正存储的地方。
1.3 initrd镜像文件 (Initial RAM Disk, Initrd)
R.H. 系统允许把部分的内核模块做成初始化内存磁盘(Initrd)镜像文件。启动内核时,再把initrd镜像文件加载到内存,内核便可以从initrd镜像文件加载外置设备的模块,再去驱动这些外置设备。
第2节 管理内核模块初探
2.1 查看某个模块的信息
modinfo [-a:d:l:f:n:p -F FIELD, --field FIELD] MODULES
-a:只显示模块作者的信息
-d:只显示模块的说明文字
-l:只显示模块的版权宣告
-f:只显示模块的文件名
-n:只显示模块的名称信息
-p:只显示模块的参数
-F FIELD, --field FIELD:指定要查看模块的FIELD信息
例子:
#modinfo -F filename softdog
2.2 查看已加载的模块
lsmod
2.3 手动加载模块
insmod MODULE_FILE [PARAMETER=VALUE...]
MODULE_FILE: 要加载的模块的文件名,必须是绝对路径。
PARAMETER=VALUE:加载模块时的参数
例子:
# insmod /lib/modules/$(uname -r)/kernel/drivers/char/watchdog/softdog.ko
2.4 手动卸载模块
rmmod [-s, --syslog] MODULE...
-s:将卸载模块的信息记录到系统日志服务器。
3 模块的依存性
3.1 模块依存性的体现
图1 模块依存性的图例
如上图所示,模块lp、partport_pc和partport存在依赖关系。
在卸载它们时,要遵循怎样的顺序?答案是:自上而下的顺序。也就是,先卸载掉lp,然后是partport_pc,最后是partport。
在安装它们时,要遵循的是自下而上的顺序,也就是先安装partport,然后装partport_pc,最后才是lp。
3.2 modprobe命令
modprobe命令会根据“模块依存关系配置文件(Modules Dependencies Configure Files)"中的定义加载所需的模块,而无须在安装某个模块时,手动地将其依赖的模块一个一个安装起来。
这些配置文件存放在/lib/modules/KERNEL_VERSION/下。和模块依存性定义直接有关的是modules.dep。
命令格式:
modprobe [-C CONFIG_FILE] [MODULE] [PARAMETER=VALUE...]
modprobe [-r] [MODULE]
modprobe -l [-C CONFIG_FILE] [-a] [MODULE]
modprobe -c
-C CONFIG_FILE: 指出内核模块配置文件的位置,默认为:/etc/modprobe.conf
-r:卸载指定的模块
-l:显示符合条件的模块文件路径名称
-a:显示所有符合的模块文件路径名称
-c:依照目前模块的状态,产生符合内核模块设置格式的设置值
例子:
# modprobe lp
[实验] 用命令modprobe -c来生成modprobe.conf文件。
4 产生模块相依性数据
modprobe命令之所以能了解模块的相依性,它借助的是模块相依关系配置文件。这些文件在/lib/modules/KERNEL-VERSION/目录中。
[root@airhouse 2.6.25-14.fc9.i686]# pwd
/lib/modules/2.6.25-14.fc9.i686
[root@airhouse 2.6.25-14.fc9.i686]# ls -l modules*
-rw-r--r-- 1 root root 369114 2009-06-21 00:54 modules.alias
-rw-r--r-- 1 root root 1616 2008-05-01 18:35 modules.block
-rw-r--r-- 1 root root 69 2009-06-21 00:54 modules.ccwmap
-rw-r--r-- 1 root root 332267 2009-06-21 00:54 modules.dep
-rw-r--r-- 1 root root 147 2009-06-21 00:54 modules.ieee1394map
-rw-r--r-- 1 root root 375 2009-06-21 00:54 modules.inputmap
-rw-r--r-- 1 root root 12467 2009-06-21 00:54 modules.isapnpmap
-rw-r--r-- 1 root root 1673 2008-05-01 18:35 modules.networking
-rw-r--r-- 1 root root 74 2009-06-21 00:54 modules.ofmap
-rw-r--r-- 1 root root 62584 2008-05-01 18:34 modules.order
-rw-r--r-- 1 root root 265091 2009-06-21 00:54 modules.pcimap
-rw-r--r-- 1 root root 1009 2009-06-21 00:54 modules.seriomap
-rw-r--r-- 1 root root 150822 2009-06-21 00:54 modules.symbols
-rw-r--r-- 1 root root 496310 2009-06-21 00:54 modules.usbmap
如果需要重建这些配置文件,可以使用命令depmod [-b BASEDIR]。
5 内核模块配置文件
RH系统的内核模块配置文件/etc/modprobe.conf,具备如下功能。
* 设置模块默认的参数
* 指定加载或卸载模块时执行什么操作,在调用modprobe、insmod或rmmod时,需要执行的命令
* 设置模块的别名