当前位置:首页 > Linux > 正文

如何在linux查看驱动

在 Linux 中,可通过 lspci | grep lsusb 查看硬件;用 modinfo dmesg | grep lsmod 查看

Linux 系统中查看和管理硬件驱动是一项核心技能,涉及对系统资源的监控、故障排查及性能优化,以下将从 基础命令工具驱动状态检测模块级分析设备树与 sysfs 交互第三方驱动管理 以及 日志诊断 六个维度展开详细说明,并提供可落地的操作指南。


基础命令:快速定位硬件与关联驱动

lspci / lsusb:枚举 PCI/USB 设备列表

这两个命令用于列出系统中连接的所有 PCI(包括显卡、网卡)和 USB 设备,并显示其拓扑结构。
关键用法

# 查看 PCI 设备(含厂商/设备ID)
lspci -vmm   # -v=详细模式, -m=映射内存地址, -m额外显示BAR空间
# 筛选特定设备(如显卡)
lspci | grep -i vga   # 匹配关键词"VGA"
# 查看 USB 设备
lsusb -t       # 树状结构展示USB设备层级

输出解读

  • [03:00.0]:PCI总线号(域:插槽:功能号)
  • Memory @ 0x...:设备占用的内存映射地址
  • Kernel driver in use::当前使用的内核驱动名称
  • Kernel modules::关联的内核模块列表
字段 说明 示例值
Bus ID PCI总线路径 03:00.0
Device Class 设备类别代码 030000 (Display controller)
Vendor/Device ID 硬件唯一标识符 80ee:beef (模拟值)
Driver 当前加载的驱动名称 i915
Kernel modules 相关联的内核模块 snd_hda_intel

udevadm info:通过设备节点反向查询属性

当已知设备路径(如 /dev/dri/card0)时,可用此命令获取完整设备信息:

udevadm info --attribute-walk --path=/dev/dri/renderD128

此命令会输出设备的所有 udev 属性,包括厂商ID、产品ID、电源状态等。


驱动加载状态检测

lsmod:查看已加载的内核模块

该命令直接显示当前内核中加载的所有模块及其依赖关系:

lsmod | grep drm      # 过滤图形相关驱动

重要参数

  • columns:控制列数,适合宽屏显示
  • verbose:显示模块完整路径

modinfo:深度解析单个模块信息

针对特定模块(如 nvidia)执行以下命令可获得详尽元数据:

modinfo nvidia     # 查看NVIDIA驱动信息
modinfo | head     # 仅显示前几行关键信息

核心字段解析
| 字段 | 说明 | 示例值 |
|—————|————————————–|——————————–|
| filename | 模块文件路径 | /lib/modules/5.4.0-91-generic/nvidia.ko |
| license | 许可证类型 | NVIDIA |
| alias | 别名映射 | char-major- |
| srcversion | 源代码版本号 | ACPI:Linux Verification Suite v1.2 |
| depends | 依赖的其他模块 | libcrc32c, drm |
| retpoline | 是否启用RETPOLINE防护机制 | Y |

find + grep:全局搜索驱动文件

若需定位未加载的驱动文件:

find /lib/modules/$(uname -r) -name ".ko" | grep -E "nouveau|radeon"

此命令会在当前运行内核版本的模块目录中搜索指定驱动文件。


设备树与 sysfs 文件系统交互

/sys/bus/pci/devices/:实时查看 PCI 设备状态

进入对应设备的目录可读取动态参数:

cd /sys/bus/pci/devices/0000:03:00.0
cat config_space          # 读取配置寄存器原始数据
cat power/control         # 查看供电状态(auto/on/off)
cat dma_mask_bits         # DMA掩码设置

注意:修改此类文件需谨慎,错误操作可能导致系统崩溃。

/proc/driver/:旧版驱动接口残留目录

部分老旧驱动仍在 /proc/driver 下保留统计信息:

cat /proc/driver/rtl8169/stats  # RTL8169网卡驱动统计信息

第三方驱动专项管理

英伟达显卡驱动验证

安装专有驱动后,可通过以下方式确认生效:

nvidia-smi          # 显示GPU状态(需安装nvidia-utils包)
glxinfo | grep OpenGL   # 检查OpenGL渲染器是否为NVIDIA

若返回空值,则可能未正确加载驱动或权限不足。

Intel核显驱动调试

对于集成显卡,可强制加载新模式测试:

sudo modprobe i915 modeset=1      # 启用KMS模式
xrandr --prop                     # 查看显示器属性变化

日志分析:dmesg 的关键作用

系统启动时的驱动加载过程会被记录在内核环缓冲区,通过 dmesg 可追溯历史事件:

dmesg | grep -i 'eth0|error'     # 筛选网卡相关错误日志
dmesg | tail -n 50                # 查看最近50条日志

典型错误案例

  • ehci_hcd: usb usb1: Direct firmware download failed → USB主控芯片固件缺失
  • i2c_designware INTEL-HEX: version mismatch → I²C控制器驱动版本冲突

高级技巧:动态插拔与热替换

rmmod + insmod:手动卸载/重载模块

适用于测试新版驱动或临时禁用故障模块:

sudo rmmod btusb                  # 卸载蓝牙USB驱动
sudo insmod ./new_driver.ko       # 插入自定义编译的驱动

风险提示:强制卸载正在使用的模块会导致服务中断!

modprobe 参数调优

通过配置文件 /etc/modprobe.d/blacklist.conf 可实现永久禁用某些驱动:

blacklist nouveau               # 禁用Nouveau驱动(优先使用专有驱动)
options snd-hda-intel index=1   # 设置HD Audio索引号

相关问答FAQs

Q1: 为什么我的设备在 lspci 中能看到,但没有对应的驱动?

A: 可能原因包括:① 内核未内置该设备的驱动;② 需要手动加载外部模块;③ 硬件较新导致现有驱动不兼容,解决方法:

  1. 尝试 modprobe <驱动名> 手动加载
  2. 检查 dmesg 日志是否有错误提示
  3. 访问厂商官网下载适配的 Linux 驱动包
  4. 对于无线网卡等设备,可尝试 rfkill unblock wifi 解除软屏蔽

Q2: 如何确定某个设备使用的是哪个内核模块?

A: 推荐两种方法组合使用:
正向查找lspci -k 命令会在每行末尾标注使用的驱动名称
反向映射:使用 find /lib/modules/$(uname -r) -name '.ko' | xargs grep -l <设备ID> 搜索包含设备ID的驱动文件
例如查找瑞昱网卡驱动:`find /lib/modules/5.4.0-91-generic -name ‘.ko’ | xargs grep -l rtl8

0