modinfo 是Linux系统中用于查询内核模块信息的实用工具。它可以显示模块的各种元数据,包括模块文件路径、作者、描述、许可证类型、版本、参数、别名等。这对于驱动程序开发、系统故障排除和模块管理非常有用。
modinfo [选项] [模块名|模块文件]
| 选项 | 说明 |
|---|---|
-a, --author |
显示模块作者信息 |
-d, --description |
显示模块描述信息 |
-l, --license |
显示模块许可证信息 |
-p, --parameters |
显示模块支持的参数 |
-n, --filename |
显示模块文件路径 |
-F, --field 字段名 |
仅显示指定字段的信息 |
-k 内核版本 |
指定要查询的内核版本 |
-0, --null |
使用空字符分隔字段而不是换行符 |
--set-version 版本 |
使用指定版本的内核模块目录 |
-b, --basedir 目录 |
指定模块目录的基础路径 |
-V, --version |
显示modinfo版本信息 |
-h, --help |
显示帮助信息 |
显示指定模块的所有信息:
modinfo e1000
输出示例:
filename: /lib/modules/5.15.0-86-generic/kernel/drivers/net/ethernet/intel/e1000/e1000.ko
version: 7.3.21-k8-NAPI
license: GPL
description: Intel(R) PRO/1000 Network Driver
author: Intel Corporation, <linux.nics@intel.com>
srcversion: 123456789ABCDEF12345678
alias: pci:v00008086d00002E6Esv*sd*bc*sc*i*
depends:
retpoline: Y
intree: Y
name: e1000
vermagic: 5.15.0-86-generic SMP mod_unload modversions
parm: debug:Debug level (0=none,...,16=all) (int)
parm: copybreak:Maximum size of packet that is copied to a new buffer on receive (uint)
modinfo -a e1000
输出:Intel Corporation, <linux.nics@intel.com>
modinfo -p e1000
显示模块支持的所有参数及其描述。
modinfo -d e1000
modinfo -l e1000
modinfo -F version e1000
仅显示版本字段信息。
modinfo -n e1000
modinfo $(lsmod | grep e1000 | awk '{print $1}')
先通过lsmod找到已加载的模块名,再查看其信息。
modinfo /lib/modules/$(uname -r)/kernel/drivers/net/ethernet/intel/e1000/e1000.ko
直接使用模块文件路径而不是模块名。
| 字段名 | 描述 | 示例 |
|---|---|---|
filename |
模块文件在文件系统中的完整路径 | /lib/modules/.../e1000.ko |
version |
模块版本号 | 7.3.21-k8-NAPI |
license |
模块许可证类型 | GPL, MIT, Proprietary |
description |
模块功能描述 | Intel(R) PRO/1000 Network Driver |
author |
模块作者信息 | Intel Corporation |
srcversion |
源代码版本标识符 | 123456789ABCDEF |
depends |
依赖的其他模块(逗号分隔) | usbcore,cfg80211 |
retpoline |
是否支持Retpoline Spectre缓解 | Y/N |
intree |
是否在内核源代码树中 | Y/N |
vermagic |
模块与内核版本兼容性验证字符串 | 5.15.0-86-generic SMP... |
parm |
模块参数(名称:描述) | debug:Debug level |
alias |
模块别名(用于自动加载) | pci:v00008086d00002E6E... |
模块参数类型:
int:整数类型参数uint:无符号整数long:长整数ulong:无符号长整数charp:字符指针(字符串)bool:布尔值(true/false)invbool:反转布尔值short:短整数ushort:无符号短整数参数设置方式:
# 加载时指定参数
sudo modprobe e1000 debug=1
# 已加载模块可以通过sysfs设置(如果支持)
echo 1 | sudo tee /sys/module/e1000/parameters/debug
modinfo查找模块的顺序:
/lib/modules/$(uname -r)//etc/modprobe.d/配置的额外路径/lib/modules/目录下的其他内核版本常见模块目录结构:
/lib/modules/5.15.0-86-generic/
├── kernel/
│ ├── drivers/ # 驱动程序
│ ├── fs/ # 文件系统
│ ├── net/ # 网络协议
│ └── sound/ # 声音驱动
├── modules.alias # 模块别名
├── modules.dep # 模块依赖关系
├── modules.symbols # 模块符号
└── modules.order # 编译顺序
诊断模块加载问题:
# 检查模块依赖
modinfo -F depends problem_module
# 检查模块参数
modinfo -p problem_module
# 检查版本兼容性
modinfo -F vermagic problem_module
配置驱动程序参数:
# 查看可用参数
modinfo -p e1000
# 创建modprobe配置文件
echo "options e1000 debug=1" | \
sudo tee /etc/modprobe.d/e1000.conf
模块开发中的信息查看:
# 检查模块版本信息
modinfo -F version mymodule
# 查看符号和依赖
modinfo -F depends mymodule
# 验证许可证类型
modinfo -F license mymodule
审计系统模块安全性:
# 检查模块许可证
for mod in $(lsmod | awk 'NR>1 {print $1}')
do
license=$(modinfo -F license $mod 2>/dev/null)
echo "$mod: $license"
done | grep -v "GPL\|MIT\|BSD"
find /lib/modules/$(uname -r) -name "*.ko" | xargs modinfo -F filename | grep 模块名find /lib/modules/$(uname -r)/kernel/drivers/net -name "*.ko" -exec modinfo -F description {} \;lsmod | awk 'NR>1 {print $1}' | xargs -I {} sh -c 'echo -n "{}: " && modinfo -F license {} 2>/dev/null'find /lib/modules/$(uname -r) -name "*.ko" -exec modinfo {} \; > modules_info.txtmodinfo -F depends 模块名 | tr ',' '\n' | xargs -I {} modinfo -F description {}modinfo -F alias 模块名 | grep -i "pci\|usb"modinfo -F srcversion 模块名和modinfo -F intree 模块名modprobe --show-depends 模块名检查依赖| 相关命令 | 说明 |
|---|---|
lsmod |
列出已加载的内核模块 |
insmod |
加载内核模块到运行中的内核 |
rmmod |
从内核中卸载模块 |
modprobe |
智能加载/卸载模块,处理依赖关系 |
depmod |
生成模块依赖关系文件 |
dmesg |
查看内核日志,包含模块加载信息 |