ubuntu如何查看一个内核模块被什么模块依赖(内核模块信息常用命令)?
在 Ubuntu 中,可以通过以下方法查看一个内核模块被哪些其他模块依赖:
方法 1:使用 modinfo
和 lsmod
结合
-
查看模块的依赖关系:
modinfo <模块名> | grep depends
- 示例:查看
kvm_intel
的依赖modinfo kvm_intel | grep depends
- 输出示例:
depends: kvm, intel_iommu
- 这表示
kvm_intel
依赖kvm
和intel_iommu
模块。
- 示例:查看
-
反向检查依赖它的模块(需手动分析):
- 使用
lsmod
列出所有已加载模块,并检查哪些模块的used by
字段包含目标模块:lsmod | grep <模块名>
- 例如,检查哪些模块依赖
kvm
:lsmod | grep kvm
- 输出示例:
kvm_intel 319488 0 kvm 987136 1 kvm_intel
- 这里
kvm_intel
依赖kvm
(kvm_intel
的1
表示被 1 个模块依赖,即kvm
)。
- 输出示例:
- 使用
方法 2:使用 modprobe --show-depends
- 查看加载模块时需要的所有依赖项(包括间接依赖):
modprobe --show-depends <模块名>
- 示例:
modprobe --show-depends kvm_intel
- 输出示例:
install /bin/true /lib/modules/6.2.0-26-generic/kernel/arch/x86/kvm/kvm.ko /lib/modules/6.2.0-26-generic/kernel/drivers/iommu/intel-iommu.ko /lib/modules/6.2.0-26-generic/kernel/arch/x86/kvm/kvm-intel.ko
- 这表示
kvm_intel
依赖kvm
和intel-iommu
。
- 示例:
方法 3:使用 depmod
生成依赖关系图(高级)
-
生成模块依赖文件:
sudo depmod -a
- 这会生成
/lib/modules/$(uname -r)/modules.dep
文件,记录所有模块的依赖关系。
- 这会生成
-
查询特定模块的依赖:
grep "^<模块名>:" /lib/modules/$(uname -r)/modules.dep
- 示例:
grep "^kvm_intel:" /lib/modules/$(uname -r)/modules.dep
- 输出示例:
kernel/arch/x86/kvm/kvm-intel.ko: kernel/arch/x86/kvm/kvm.ko kernel/drivers/iommu/intel-iommu.ko
- 示例:
方法 4:使用 lsmod
+ 脚本分析(反向依赖)
如果需要找出哪些模块依赖目标模块(即反向依赖),可以编写一个简单脚本:
#!/bin/bash
target_module="$1"
lsmod | awk 'NR>1 {print $1}' | while read mod; dodeps=$(modinfo "$mod" | grep depends | cut -d: -f2 | tr -d ' ,')if [[ "$deps" == *"$target_module"* ]]; thenecho "$mod 依赖 $target_module"fi
done
- 使用方法:
chmod +x find_dependents.sh ./find_dependents.sh kvm
- 输出示例:
kvm_intel 依赖 kvm
总结
需求 | 推荐命令 |
---|---|
查看模块的直接依赖 | modinfo <模块名> | grep depends |
查看加载模块时的完整依赖链 | modprobe --show-depends <模块名> |
生成所有模块的依赖关系文件 | sudo depmod -a |
反向查找依赖目标模块的其他模块 | 自定义脚本(如上) |
实际应用示例
假设你想确认 kvm_intel
是否被其他模块依赖:
-
直接依赖:
modinfo kvm_intel | grep depends
- 输出:
depends: kvm, intel_iommu
- 输出:
-
反向依赖(使用脚本):
./find_dependents.sh kvm_intel
- 输出:无(因为
kvm_intel
通常是叶子模块,不被其他模块依赖)。
- 输出:无(因为
-
验证
kvm
的依赖者:./find_dependents.sh kvm
- 输出:
kvm_intel 依赖 kvm
- 输出:
通过以上方法,你可以清晰掌握模块间的依赖关系,避免强制卸载导致系统崩溃。