Linux modinfo命令详解

modinfo命令用于显示Linux内核模块的详细信息,包括模块描述、作者、许可证、参数、依赖关系等,是内核模块管理的重要工具。

命令简介

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 显示帮助信息

常用操作示例

示例1:显示模块完整信息

显示指定模块的所有信息:

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)

示例2:仅显示模块作者信息

modinfo -a e1000

输出:Intel Corporation, <linux.nics@intel.com>

示例3:显示模块参数

modinfo -p e1000

显示模块支持的所有参数及其描述。

示例4:仅显示模块描述

modinfo -d e1000

示例5:显示模块许可证信息

modinfo -l e1000

示例6:使用字段过滤

modinfo -F version e1000

仅显示版本字段信息。

示例7:显示模块文件路径

modinfo -n e1000

示例8:查看已加载模块的信息

modinfo $(lsmod | grep e1000 | awk '{print $1}')

先通过lsmod找到已加载的模块名,再查看其信息。

示例9:使用模块文件路径查询

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查找模块的顺序:

  1. 当前运行内核的模块目录:/lib/modules/$(uname -r)/
  2. 通过/etc/modprobe.d/配置的额外路径
  3. /lib/modules/目录下的其他内核版本
  4. 指定的模块文件路径(如果使用完整路径)

常见模块目录结构:

/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"

注意事项

重要提示:
  1. 内核版本匹配:模块必须与当前运行的内核版本兼容(检查vermagic字段)
  2. 模块未签名:某些安全启用的系统可能拒绝加载未签名的模块
  3. 参数类型:设置模块参数时,确保类型与modinfo显示的类型匹配
  4. 依赖关系:加载模块前,确保所有依赖模块已加载
  5. 调试符号:生产环境的模块通常不包含调试符号
  6. 自定义模块:第三方或自定义模块可能没有完整的信息字段
  7. 权限:查看模块信息通常不需要特殊权限,但加载模块需要root权限
实用技巧
  • 快速查找模块文件: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.txt
  • 检查模块依赖图:modinfo -F depends 模块名 | tr ',' '\n' | xargs -I {} modinfo -F description {}
  • 查找特定设备驱动:modinfo -F alias 模块名 | grep -i "pci\|usb"
  • 查看模块编译信息:modinfo -F srcversion 模块名modinfo -F intree 模块名

故障排除

常见问题及解决方法:
  1. "modinfo: ERROR: Module XXX not found":检查模块名是否正确,或使用完整路径
  2. 版本不匹配:确保模块是为当前内核版本编译的,检查vermagic字段
  3. 依赖缺失:加载模块前使用modprobe --show-depends 模块名检查依赖
  4. 模块签名问题:在UEFI安全启动系统中,可能需要禁用安全启动或使用签名模块
  5. 参数设置无效:检查参数名称和类型是否正确,参考modinfo -p输出
  6. 模块冲突:两个模块可能提供相同功能,需要黑名单其中一个
  7. 信息字段缺失:某些自定义模块可能缺少标准信息字段,这是正常现象

相关命令

相关命令 说明
lsmod 列出已加载的内核模块
insmod 加载内核模块到运行中的内核
rmmod 从内核中卸载模块
modprobe 智能加载/卸载模块,处理依赖关系
depmod 生成模块依赖关系文件
dmesg 查看内核日志,包含模块加载信息