Linux基础知识 ·

Linux内核与内核模块

[隐藏]

内核一般都是压缩文件,因此在使用内核之前,会自动解压缩之后,才会载入内存当中。

为了应付快速迭代的硬件设备,目前的内核都是具有『可读取模块化驱动程序』的功能,依既是所谓的『 modules (模块化)』的功能啦!所谓的模块化可以将其想成是一个『外挂程序』,该外挂程序可能由硬件开发商提供,也有可能是内核本来就支持的,不过,较新的硬件通常都需要硬件开发商提供驱动程序。

内核与内核模块存放位置:

  • 内核: /boot/vmlinuz 或 /boot/vmlinuz-version;
  • 内核解压缩所需 RAM Disk: /boot/initramfs (/boot/initramfs-version);
  • 内核模块: /lib/modules/version/kernel 或 /lib/modules/$(uname -r)/kernel;
  • 内核源代码: /usr/src/linux 或 /usr/src/kernels/ (要安裝才会有,默认不安裝)

如果该内核被顺利的载入到系统当中了,那么就会有几个信息记录下来:

  • 内核版本: /proc/version
  • 系统内核功能: /proc/sys/kernel/

如果有较新的硬件,而内核却不支持的话,就需要一下操作了:

  • 重新编译内核,并加入最新的硬件驱动程序代码(一般厂商会放出以编译好的模块)。
  • 将该硬件的驱动程序编译称为模块,在开机时加入此模块。

如果想要载入一个已经存在的模块时,需要如下操作:

内核模块与其依赖

内核模块的存放位置为 /lib/modules/$(uname -r)/kernel 当中,里面主要分成几个目录:

arch:与硬件平台有关的项目,例如 CPU 的等级等等。

crypto:内核所支持的加密技术,例如 MD5 或者是 de5等等。

drivers:一些硬件的驱动程序,例如显卡、网卡、PCI 相关硬件等等。

fs:内核所支持的文件系统(filesystems),例如 vfst、reiserfs、nfs 等等。

lib:一些函数库。

net:与网络有关的各项协议资料,还有防火墙模块(net/IPV4/netfilter/* )等等。

sound:与音效有关的各项模块。

而 /lib/modules/$(uname -r)/modules.dep 这个文件记录了内核支持的各项模块之间的依赖。

利用 depmod 这个命令可以建立这个文件。

depmod 选项

常用选项:

-A:不加任务选项时, depmod 会主动的去分析目前内核的模块,并且重新写入 /lib/modules/$(uname -r)/modules.dep 当中。若加入 -A 选项时,则 depmod 回去搜寻比 modules.dep 内记载的要新的模块,若是找到新模块才会更新。

-n:不写入 modules.dep ,而是将结果输出到屏幕。

-e:显示目前已加载的不可执行的模块名称。


内核模块文件名一定 .ko 结尾的,当使用 depmod 之后,该程序会跑到模块标准存放目录  /lib/modules/$(uname -r)/kernel ,并依据其相关目录的定义将全部的模块提出来分析,最终才将分析的结果写入 modules.dep 文件当中。

查看内核模块

lsmod 可以查看当前系统中的已加载的内核模块信息。

使用 lsmod 之后,系统会显示出目前已加载于内核当中的模块,显示的内容包括有:

  • 模块名称(Module)。
  • 模块的大小(size)。
  • 此模块是否被其他模块所使用(User by)。

模块与模块之间也是会有依赖性的,有的模块需要依赖于其他模块才能正常运行。

我们可以使用 modinfo 命令查看模块的详细信息。

modinfo 选项 模块名称

常用选项:

-a:列出该模块开发者。

-d:列出该模块(modules)的说明 (description)。

-n:列出该模块的详细路径。

-p:显示该模块所支持的有类型的参数

内核模块的载入与移除

如果需要自行手动载入模块,最简单的就是使用 modprobe 命令来载入模块,modprobe 会主动的去搜寻 modules.dep 的内容,先查询了模块之间的依赖之后,才决定需要载入的模块有哪些。

insmod 则完全有使用者自行载入一个模块,并不会主动分析模块之间的依赖关系。

示例:载入 cifs.ko 这个『文件系统』模块。

insmod 立刻就将该模块载入了,但是 insmod 后面接的模块必须要是完整的绝对路径与模块名称!

我们可以使用 rmmod 命令来移除已加载的模块。


rmmod 选项 模块名称

常用选项:

-v:显示过程。

-f:此选项可能非常危险:除非在编译内核时设置CONFIG_MODULE_FORCE_UNLOAD,否则它没有效果。此选项,可以删除正在使用的模块、不使用要删除的模块、已标记为不安全的模块。

-s:将错误发送到 syslog,而不是标准错误输出。

使用 insmod 与 rmmod 命令管理模块的话,就必须自行找到模块的完成名称,并且万一模块有依赖关系没有解决的话,将如法直接加载或移除该模块的。


所以建议使用 modprobe 命令来处理模块的加载,modprobe 可以不用写完整的模块名称,只要该模块完整的文件名在 /lib/modules/uname -r/modules.dep 中记录并定义有别名,那么我们可以直接使用其别名。其用法为:

modprobe 选项 模块名称

常用选项:

-c:列出目前系统所有的模块(别名定义表)!

-f:强制载入该模块。

-r:移除某模块。

-l:显示可用模块。

-t:指定模块类型。

-v:显示执行过程。

示例:载入 vfat 模块

如果需要定义模块的参数,就需要到 /etc/modprobe.d/ 建立一个以 .conf 结尾的配置文件了,具体说明请点这里:开机所用主要配置文件

参与评论