普通用户执行lspci看不到驱动和模块,因内核对PCI配置空间中Kernel driver in use等字段设访问保护,需sudo权限才能读取;不加参数仅显示基础设备列表,须用sudo lspci -v或-k才可确认激活驱动。

直接用 lspci 就能查,但不加权限或不带参数容易漏关键信息,比如驱动名、硬件ID、拓扑关系——这些恰恰是排查网卡不识别、显卡没加载驱动、多GPU绑定错误时最需要的。
普通用户执行 lspci 为什么经常看不到驱动和模块?
因为内核对 PCI 配置空间的部分字段(如 Kernel driver in use、Kernel modules)做了访问保护,普通用户只能读基础标识,驱动绑定状态等需 root 权限。现象是:运行 lspci 能看到设备列表,但 sudo lspci -v 才能在目标设备下看到 Kernel driver in use: iwlwifi 这类行。
- 必须用
sudo lspci -v或sudo lspci -k才能确认当前激活的驱动 -
lspci -k比-v更轻量,只显示驱动与模块,适合脚本调用 - 若系统禁用了 sudo 密码提示(如通过
NOPASSWD配置),可直接写成sudo lspci -k -s 00:1f.6精准查南桥 SATA 控制器
查网卡/显卡时,lspci | grep 和 lspci -nn 怎么配合用?
单纯 lspci | grep Network 只能定位设备行,但无法知道它到底是什么芯片;而 lspci -nn | grep -i network 输出里带 [10ec:8168] 这种格式,就是厂商 ID + 设备 ID,能直接去内核源码或厂商文档里查是否被支持。
-
lspci -nn -d 10ec:8168可反向筛选所有 Realtek RTL8168 网卡(-d支持 ID 匹配) - 注意大小写:
grep -i是必须的,因为输出中可能是network也可能是Network controller - 如果
lspci -nn输出里某设备的 ID 是[ffff:ffff],说明该设备未被内核正确识别或配置空间读取失败
lspci -t 看到的树形结构,怎么对应到实际物理插槽?
lspci -t 不显示设备名,只画层级缩进,所以单看它无法判断哪条线是显卡、哪条是 NVMe SSD。必须结合 lspci -t -v 或分页查 lspci -tv | less,再搜索关键词(如 VGA、Non-Volatile memory)来锚定位置。
- 树中每级
+-或-+-代表一个 PCIe 桥,根节点[0000:00]是 Root Complex(通常集成在 CPU 或芯片组) - 如果显卡出现在
-+-01.0且上一级是00:02.0(PCIe to PCI bridge),说明它经过了桥接,可能带宽受限或热插拔行为异常 -
lspci -t -vv会额外显示链路宽度(LnkCap)和速度(LnkSta),比如Speed 8GT/s, Width x16才算真正跑满 PCIe 4.0 x16
命令报 command not found: lspci 怎么办?
这不是权限问题,是 pciutils 包根本没装。不同发行版安装命令不同,且部分最小化镜像(如 Alpine、某些 CoreOS 变体)默认不带。
- Debian/Ubuntu:
sudo apt update && sudo apt install pciutils - RHEL/CentOS 8+:
sudo dnf install pciutils - Alpine Linux:
sudo apk add pciutils - 装完验证:
lspci -V应输出版本号,如lspci: pciutils-3.10.0
别指望 modprobe pci 或重启内核模块能解决——lspci 是用户态工具,和内核模块无关。只要 /sys/bus/pci/devices/ 下有内容(可 ls /sys/bus/pci/devices/ 确认),就说明内核已枚举成功,缺的只是这个命令行工具。











