查PCI或USB设备必须加sudo和-v/-t等参数:普通用户执行lspci仅显示设备类型,sudo lspci -v才能看到驱动名、BAR地址等关键信息;lsusb -t和usb-devices才能确认驱动绑定、物理拓扑与协商速率。

查 PCI 或 USB 设备,别先翻手册——lspci 和 lsusb 本身足够用,但不加对的参数、不配合适的权限,90% 的信息都看不到。
查 PCI 设备型号和驱动必须加 sudo 和 -v
普通用户执行 lspci 只能看到设备类型(比如 “VGA compatible controller”),但厂商名、驱动名、BAR 地址全为空或显示为 [device]。这是因为内核限制了对 PCI 配置空间的读取权限。
-
sudo lspci -v -s 01:00.0是最稳的单设备查法,重点盯Kernel driver in use:这一行,它告诉你当前真正干活的模块(比如nvidia、iwlwifi) - 如果
Kernel driver in use:后面是空的,不代表没驱动,可能是设备未枚举成功、被vfio-pci占用,或内核没编译对应模块 -
sudo lspci -k -nn | grep -A 2 -i "vga\|network"适合快速扫一遍显卡/网卡:同时拿到设备名、[10de:2206]这类 ID、以及Kernel modules:列表 - 某些发行版(如 Ubuntu 22.04+)默认禁用
/proc/bus/pci,此时不加sudo连总线地址都可能解析失败
USB 设备查不到?先看 lsusb -t 和 usb-devices
lsusb 本身不需要 root 权限,但只列基础信息;真正要确认驱动绑定、供电状态、拓扑层级,得靠 lsusb -t 和 usb-devices。
-
lsusb -t显示物理连接树,缩进代表 Hub 级联深度,含5000M行说明跑在 USB 3.x,12M就是 USB 1.1 —— 用来判断是不是插错了口或被低速 Hub 拖慢 -
usb-devices输出按设备分段,每段以T:开头,关键字段是Driver=(当前绑定驱动)、Spd=(协商速率)、Lev=(层级深度) - 如果某设备
Driver=(none),说明内核识别了硬件但没加载驱动,这时要结合dmesg | tail -20看热插拔时有没有报错(比如 “device descriptor read/64, error -71”) -
lsusb -s 1:4中的1:4必须严格匹配lsusb输出里的Bus 001 Device 004,多一个空格或写成001:004都会报Cannot find device
设备显示为 “Device a0d3” 怎么办?用 -nn 提 ID 再查
当 lspci 或 lsusb 输出里出现模糊名称(如 “Base System Device”、“Communication controller” 或十六进制 ID),说明系统数据库里没注册该芯片,必须靠数字 ID 定位。
-
lspci -nn | grep -i network输出类似02:00.0 Network controller [0280]: Qualcomm Device [17cb:1101],其中[17cb:1101]就是唯一标识 - ID 必须完整复制(前后方括号也要),去 pcidatabase.com 或内核源码搜:
git grep "1101 17cb" drivers/net/ -
lsusb -d 046d:0825可反向筛选已知 ID 的设备,比从几十行里人工找快得多 - 注意大小写:
grep -i是必须的,因为输出中可能是Network也可能是network controller
lspci -t 看拓扑,但光看树形结构没法知道哪条是显卡
lspci -t 输出的是纯层级关系,没有设备名,所以不能单靠它定位硬件。它真正的价值在于揭示 PCIe 链路路径和潜在瓶颈。
- 输出中每级
-+-或|__代表一个桥(bridge),根节点[0000:00]是 Root Complex(通常集成在 CPU) - 如果显卡出现在
-+-01.0,而上一级是00:02.0(PCIe to PCI bridge),说明它经过桥接,带宽或延迟可能受限 - 要锚定具体设备,得组合使用:
lspci -t -v | grep -A 5 -B 5 "VGA\|Non-Volatile memory",靠关键词把树形结构和设备类型对上 -
lspci -vv -s 00:01.0 | grep "LnkSta:"能看到实际协商速率(如Speed 8GT/s, Width x16),这才是 PCIe 4.0 x16 是否真正启用的证据
真正容易被忽略的点是权限和 ID 匹配:不加 sudo 查驱动就是白忙,不带 -nn 查 ID 就永远卡在 “这是什么芯片” 上。设备名会变,但 [10ec:8168] 这种 ID 从出厂就固定不变。


















