如果 /etc/modules-load.d/ 和 /etc/modprobe.d 中没有给出条目,内核模块如何在引导时加载?

如果 /etc/modules-load.d/ 和 /etc/modprobe.d 中没有给出条目,内核模块如何在引导时加载?

我有一台Ubuntu机器显示

root@test:/etc# lsmod | tail
crypto_simd            16384  1 aesni_intel
net_failover           20480  1 virtio_net
cryptd                 24576  2 crypto_simd,ghash_clmulni_intel
drm                   622592  3 drm_kms_helper,cirrus
psmouse               176128  0
i2c_piix4              32768  0
virtio_blk             20480  1
failover               16384  1 net_failover
pata_acpi              16384  0
floppy                118784  0

/etc/modules-load.d但上述模块在或中都没有条目/etc/modprobe.d

我的问题是,如果这些模块在上述目录中没有条目,如何加载它们?

答案1

加载某些模块是因为其他模块依赖于它们。在您的示例中,failover被加载是因为net_failover需要它,并且net_failover因为virtio_net需要net_failover。列表的第四列lsmod表示类似这样的依赖关系。

如果硬件信息由固件提供(例如ACPI或DMI)或者硬件是可自动探测的(例如PCI/PCIe或USB总线或CPU类型),那么内核可以为它们自动加载模块。

运行并在该行后面sudo modprobe -c | less查找一长串行:alias

# End of configuration files. Dumping indexes now:

基本上,内核模块中嵌入了别名信息,以使用固件或特定于总线的自动探测机制可以提供的标识符来描述它们支持的硬件。模块工具会将此信息收集到索引中,并将其作为配置的一部分modprobe

一旦内核探测硬件,它将使用任何固件提供的信息或硬件自动探测结果,使用以特定于每个固件或总线类型的方式格式化的名称来生成模块加载请求。如果列出的别名之一与内核请求的别名相匹配,则会加载相应的模块。

还有 file /etc/initramfs-tools/modules,它可用于指定应包含在 initramfs 中并在尝试挂载根文件系统之前加载的模块列表。

在您的具体情况下:

  • crypto_simd被加载为 的依赖项aesni_intel,它可能是使用特定于 CPU 类型的自动探测别名加载的。

  • cryptd需要由两个模块crypto_simd(见上文)和来加载ghash_clmulni_intel,这可能是由特定于 CPU 类型的 autoprobe 别名加载的。

  • GPUcirrus模块可能由 PCI ID 自动探测,然后需要drm_kms_helperdrm作为依赖项。drm_kms_helper还指定了它自己对 的依赖drm

  • psmousepata_acpi并且floppy可能被 ACPI 固件信息自动探测

  • i2c_piix4可能是通过其 PCI 设备 ID 自动探测到的。

  • virtio_blk可能由 VirtIO 特定的检测机制进行自动探测,与virtio_net. VirtIO 定义了一条“虚拟总线”,它本身可以通过 ACPI 信息或 PCI 设备 ID 进行检测,一旦加载了 virtio 总线驱动程序(或已经嵌入到主内核中),它将有自己的方法来查询虚拟机管理程序/可用 VirtIO 功能的主机操作系统。根据对查询的响应,内核已请求virtio_blkvirtio_net要加载。

相关内容