如何在Linux系统中查看硬件驱动?这是一个经常被问到的问题,但答案取决于你的具体需求:是想了解“系统当前正在运行哪些驱动模块”,还是想定位“某个特定设备到底使用了哪个驱动”?这两种不同角度的查询,对应的Linux命令和排查方法截然不同。

如果想查看当前Linux系统正在运行哪些硬件驱动,最直接高效的方法就是执行 lsmod 命令。它会列出所有已加载的内核模块,而绝大多数硬件驱动都是以模块形式存在的,因此这基本上就是系统当前实际在使用的“驱动列表”。但需要注意——lsmod 只显示已加载的驱动,并不等于系统“支持”的全部驱动种类。许多驱动被静态编译进了内核(built-in),不会出现在输出结果中;还有一些驱动虽然存在,但因为没有相应设备触发加载,同样不会被列出。
当你的目标明确为“查询系统当前正在加载哪些硬件驱动”时,直接运行:
lsmod
输出结果的每行第一列就是驱动模块名称(例如 r8169、iwlwifi、nvidia),第二列是模块大小,第三列是使用计数(为0表示当前未被设备占用,但模块仍驻留在内存中)。
不过,使用 lsmod 时有几个常见误区需要留意,避免踩坑:
lsmod不会区分 PCI、USB 或平台设备,所有加载的模块混合在一起——如果要查找网卡驱动,需要自行grep -i net或grep -E "(r81|e100|mlx|igb)"进行过滤。- 模块名称不完全等同于驱动名称。例如
nvme模块驱动 NVMe SSD,但ahci模块在某些内核配置下也能管理部分 NVMe 设备,不能仅凭名称轻易下结论。 lsmod无法直接显示哪个设备使用了哪个模块——要建立硬件与驱动的关联,必须配合lspci -k或ls /sys/class/net/*/device/driver等命令。
如何精准定位某个设备使用了哪个驱动?
对于 PCI 设备(如显卡、网卡、SSD 控制器等),lspci -k 是核查驱动的黄金组合:
lspci -k | grep -A 3 -B 1 "Kernel driver in use"
该命令会将每个设备下面的 Kernel driver in use: 和紧随其后的 Kernel modules: 一起输出。这里需要特别区分两个概念:
Kernel driver in use:表示当前实际绑定到设备的驱动(例如amdgpu)。Kernel modules:列出的是内核支持的所有候选驱动(例如amdgpu nouveau),它们不一定都安装了,也不一定都可用。- 如果
Kernel driver in use:后面为空,说明设备尚未被任何驱动接管——可能的原因是未启用、firmware 缺失或设备 ID 不匹配。
如何查看 USB 设备绑定的驱动?
此时,lsusb -t 比 lsusb -v 能更快速地定位驱动信息:
lsusb -t
输出结果中,每条设备行末尾括号内的名称就是当前绑定的驱动(例如 driver=uvcvideo 或 driver=usbhid)。如果括号内显示 driver=none,则表示未绑定任何驱动。
还可以使用以下两种方法进行验证:
ls /sys/bus/usb/devices/*/driver—— 列出所有包含 driver 符号链接的 USB 设备路径。readlink /sys/bus/usb/devices/1-1.2/driver—— 直接查询特定设备绑定的驱动(路径可通过lsusb -t获取)。
为什么有些驱动不在 lsmod 中,却在 lspci 输出里出现?
原因在于,某些驱动被静态编译进了内核(built-in),而不是以模块形式存在。在这种情况下:
lsmod无法找到它(例如,旧版内核中的intel_agp常被编译为 built-in)。lspci -k仍然会显示Kernel driver in use:(因为它确实在内核中运行)。- 如果要确认,可以查看内核源码或执行
zcat /proc/config.gz | grep CONFIG_AGP_INTEL,通过结果判断是 =y(built-in)还是 =m(module)。
最后,有一点常被忽略:驱动(Driver)与固件(Firmware)是完全不同的两个概念。即使 lspci -k 显示驱动已成功绑定,但如果 /lib/firmware/ 目录下缺少对应的固件文件,设备依然无法正常工作——此时,dmesg | grep -i firmware 才是找到问题根源的关键线索。
