浅析Linux内核模块自加载机制

概述

模块自加载用于配置系统在启动时自动加载所需要的模块,这在添加新的设备和驱动很有用。Linux系统中可以实现模块自加载的机制通常有两种方式:

  • 方式1:基于systemd提供的modules-load服务,使用静态配置。
  • 方式2:基于udev的动态加载机制。

Linux内核模块管理

在进一步说明上述机制前,对于Linux内核模块的管理需要有个基本的了解,内核模块所暴露的信息,是这两种机制正确加载模块所必不可少的一部分。

内核模块存放目录

所有的内核模块默认都会安装到在/lib/modules/uname -r路径下,通常包含的内容如下:
在这里插入图片描述
先看该路径下包含的目录信息,这些目录按照类别存放了不同的内核模块:

  • kernel:用于存放Linux源码中包含的内核模块;
  • extra:存放外部的内核模块
  • weak-updates:存放与当前安装内核kABI兼容的内核模块;
  • updates:NA
  • vdso:NA
modules系列文件

除了存放内核模块的目录外,/lib/modules/uname -r路径下还包含了一系列以modules开头的文件,这些文件描述内核模块的一些关键信息,例如模块命名、依赖关系、导出符号等。

  • modules.alias:记录模块的命名;
  • modules.dep:记录模块间的依赖关系,在使用modprobe加载模块时,会根据该文件查找依赖的内核模块;
  • modules.order:记录模块的加载顺序;
  • modules.symbols:记录模块导出的外部符号。

其它modules.*文件则保存了某一子系统的内核模块列表,比如modules.block就保存了块设备相关的模块,modules.builtin保存了编译进内核的模块。

阻止模块启动时加载

如果想要阻止一个内核模块在系统启动时加载,在文件夹/etc/modprobe.d目录下创建一个.conf文件,通过blacklist来屏蔽模块的自动加载,如下:

blacklist module_name

systemd-module-load.service

目前,所有必要模块的加载均由udev自动完成,但是,有些情况下可能需要在系统启动时加载某个额外的模块,这时就可以使用systemd-module-load.service。systemd-modules-load.service是systemd提供的一个开机自启动服务,用于在系统启动时根据静态的配置文件或者内核启动参数加载内核模块。
在这里插入图片描述

配置文件

systemd-modules-load.service支持识别以下目录中的配置文件:

  • /etc/modules-load.d/*.conf
  • /run/modules-load.d/*.conf
  • /lib/modules-load.d/*.conf
  • /usr/lib/modules-load.d/*.conf
  • /usr/local/lib/modules-load.d/*.conf

systemd-modules-load.service从上述目录中读取 *.conf 文件,这些 *.conf 文件中静态的包含了需要在系统启动时无条件加载的内核模块列表。

内核启动参数

除了配置文件,systemd-modules-load.service还支持识别以下的内核引导选项:

modules_load=, rd.modules_load=

上述选项通过接受一个内核模块列表,表示在系统启动的早期,无条件的加载这些内核模块。以 “rd.” 作为前缀的选项仅作用于 initial RAM disk 环境。

udev动态加载机制

udev是使用uevent机制来处理设备热插拔事件的用户空间程序,并取代原来的devfs机制。动态管理设备和驱动的加卸载是udev的基础功能。

udev工作流程

udev使用netlink机制与内核进行通信,它在系统启动时运行了一个后台程序udevd,监听内核发送的uevent事件,并通过一套规则匹配可发现的设备事件和属性,来执行相应的热拔插动作,支持创建/删除设备节点、加载/卸载驱动模块等。

在这里插入图片描述

udev配置示例:网卡重命名

对于多网卡命名需要在/etc/udev/rules.d/70-persistent-net.rules文件中,定义多条定义规则。

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="24:6e:96:03:5c:8d", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="24:6e:96:03:5c:8a", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="24:6e:96:03:5c:8c", ATTR{type}=="1", KERNEL=="eth*", NAME="eth2"
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:58:0e:01", ATTR{type}=="1", KERNEL=="eth*", NAME="eth3"

相关参考

  • 19
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值