我有一台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 别名加载的。GPU
cirrus
模块可能由 PCI ID 自动探测,然后需要drm_kms_helper
并drm
作为依赖项。drm_kms_helper
还指定了它自己对 的依赖drm
。psmouse
,pata_acpi
并且floppy
可能被 ACPI 固件信息自动探测i2c_piix4
可能是通过其 PCI 设备 ID 自动探测到的。virtio_blk
可能由 VirtIO 特定的检测机制进行自动探测,与virtio_net
. VirtIO 定义了一条“虚拟总线”,它本身可以通过 ACPI 信息或 PCI 设备 ID 进行检测,一旦加载了 virtio 总线驱动程序(或已经嵌入到主内核中),它将有自己的方法来查询虚拟机管理程序/可用 VirtIO 功能的主机操作系统。根据对查询的响应,内核已请求virtio_blk
并virtio_net
要加载。