systemd 如何自动插入内核模块?

How are kernel modules automatically inserted by systemd?

我想知道内核模块是如何自动插入的。我正在使用 Arch Linux,所以基本上我正在使用 systemd.

经过一番研究,我知道至少有两种插入内核模块的方法:

  1. systemd 有一个名为 systemd-modules-load.service 的单元,它读取 /etc/modules-load.d/*.conf 中的内核模块名称(以及 /run/usr/lib) (systemd documentation).

  2. udev 可以在检测到设备(Arch Linux wiki page)时自动处理内核模块。

但是,我没看到它们是如何工作的:

  1. 我的系统上 /etc/modules-load.d/*.conf(或 /run/usr/lib 中没有配置文件)。因此它在 systemd-modules-load.service.

  2. 中没有要加载的内容
  3. /usr/lib/udev/rules.d中有一些modprobe命令,但不是我在lsmod中看到的所有内核模块。

比如我在lsmod的输出中有一个xfs内核模块,但是我找不到插入它的触发点。 None 我的文件系统挂载了 xfscat /proc/mounts | grep xfs 什么也没显示)。

是否有关于所有这些工作原理的介绍或教程?

我找到了关于这个主题的非常有用的介绍:https://wiki.archlinux.org/index.php/Modalias

简而言之,秘密就是udev中MODALIAS/lib/modules/$(uname -r)/modules.alias之间的映射。