我刚刚查看了ubuntu的.config文件/usr/src/linux-headers-5.3.0-46-generic/.config,里面有CONFIG_KVM=m,但是我用lsmod输出的是kvm moudle,CONFIG_XX=m表示这个模块没有编译进内核,可以用modprobe xxx.ko来加载模块,lsmod可以显示当前加载了哪些可加载的内核模块。
但是我的 CONFIG_KVM=m 并且我没有使用 modprobe。为什么 lsmod 的输出中会出现 KVM?谢谢
答案1
根据描述这里在支持硬件虚拟化的 CPU 上,kvm 会在启动时自动加载。
如果你不需要虚拟化,你可以在 BIOS 中禁用 VT-d/AMD-V,以防止模块 kvm 在启动时加载
更新:
构建为模块可让您在启动时仅加载特定功能,从而加快启动速度。它不能保证模块不会被加载。如果资源需要此模块,它可以像二进制文件一样直接加载iptables
。
例子:
nf_conntrack
是一个 iptables 模块,它允许您跟踪通过防火墙的连接CONFIG_NF_CONNTRACK=m
。除非您使用 添加规则,否则不会加载此模块-m conntrack
。
其他例子:
我的电脑有一个使用驱动程序的以太网卡e1000
。
grep CONFIG_E1000 /boot/config-4.15.0-91-generic
CONFIG_E1000=m
CONFIG_E1000E=m
CONFIG_E1000E_HWTS=y
它向我展示了e1000
驱动程序是作为模块构建的。
使用modinfo e1000 | alias
will 给出所有将自动加载内核模块的别名
alias: pci:v00008086d00002E6Esv*sd*bc*sc*i*
alias: pci:v00008086d000010B5sv*sd*bc*sc*i*
alias: pci:v00008086d00001099sv*sd*bc*sc*i*
alias: pci:v00008086d0000108Asv*sd*bc*sc*i*
...
由于我的以太网卡是英特尔(VendorID 8086),因此它与别名匹配,因此模块的加载方式如下dmesg
[ 1.520584] e1000e: Intel(R) PRO/1000 Network Driver - 3.2.6-k
lsmod
全新启动后看到的所有模块均在启动过程中使用过。