最直接的方式是运行lsmod命令,它列出当前已加载的所有内核模块(含绝大多数硬件驱动),输出中module列为驱动模块名(如r8169、iwlwifi),size为内存占用字节数,used by表示引用计数;但lsmod不显示内置驱动、未触发加载的驱动,也不体现硬件绑定关系,需配合lspci -k、lsusb -t或dmesg进一步验证。

lsmod 是最直接的方式:它列出所有当前已加载的内核模块,绝大多数硬件驱动都以模块形式存在,所以这就是你实际在用的“驱动列表”。
但要注意——lsmod 只显示**已加载**的驱动,不等于系统“支持”的全部驱动。很多驱动编译进了内核(built-in),不会出现在 lsmod 输出里;还有一些驱动虽存在,但没设备触发加载,也就不会列出来。
如果你要的是“系统当前正在运行哪些驱动”,那就直接跑:
lsmod
输出每行第一列就是驱动模块名(比如 r8169、iwlwifi、nvidia),第二列是大小,第三列是使用计数(0 表示没被设备占用,但模块仍在内存中)。
常见误区:
-
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)
真正容易被忽略的点:驱动和 firmware 是两回事。即使 lspci -k 显示驱动已绑定,若 /lib/firmware/ 下缺对应固件文件,设备照样无法工作 —— 这时 dmesg | grep -i firmware 才是关键线索。











