发布于2026-05-22 阅读(0)
扫一扫,手机访问
很多朋友在用lspci查看显卡或网卡时,可能会发现一个现象:不加sudo执行,看到的设备信息似乎“缺斤少两”,厂商名、驱动状态这些关键字段要么显示为[device],要么干脆留空。这背后其实涉及到Linux内核的权限管理机制。
简单来说,普通用户默认只能读取/sys/bus/pci/devices目录下的简化设备树信息。而像厂商ID、设备ID、内存地址范围(BAR)、中断号(IRQ)等核心硬件配置,都存储在内核的PCI配置空间里,这部分访问需要更高的权限。所以,当你执行sudo lspci时,工具才能获取到完整的底层硬件信息。另外,一些较新的发行版(例如Ubuntu 22.04及以后)默认禁用了旧的/proc/bus/pci接口,这有时会导致即使使用sudo,某些深度调试选项(如-x或-vv)也可能报错“Cannot read configuration space”。如果只是想在脚本中获取设备型号,可以试试lspci -mm命令,它以机器可读的格式输出,对权限的要求相对宽松一些。

lspci 为什么看不到显卡或网卡完整信息?核心原因在于权限。设备的厂商名、驱动状态、内存地址等关键字段受内核PCI配置空间的访问限制。普通用户默认只能读取/sys/bus/pci/devices路径下的基础设备树结构,得到的是简化数据。因此,不加sudo时,很多字段会显示不全。
sudo lspci 才能访问完整的 PCI 配置空间,获取设备 ID、BAR 地址、中断号等底层信息。sudo,-x 或 -vv 也可能报错 Cannot read configuration space。lspci -mm(机器可读格式)对权限要求较低,适合脚本调用。lspci -v 和 lspci -vv 的实际差异在哪?这两个选项的详细程度有本质区别。-v(verbose)输出的信息已经相当实用,包含了驱动模块名、IRQ中断号、内存/IO地址范围以及PCI Capabilities等运维和调试的常用字段。而-vv(very verbose)则更进一步,它会展开PCIe的扩展能力寄存器、ACS(访问控制服务)控制位、AER(高级错误报告)配置等深度调试内容,这些信息在日常问题排查中基本用不到。
lspci -v 能看到 Kernel driver in use: iwlwifi 这类关键信息,足够定位驱动是否加载。lspci -vv 可能暴露 Root Port ACS Capability: Src Valid, Trans Blind, End Blind, Rcvr Redir,仅在排查 PCIe 设备直通(如 KVM 虚拟机透传 GPU)时才需关注。-vv 输出异常简略。最直接的方法是组合使用-k和-nn选项。-k用于显示内核驱动信息,-nn则直接显示设备的厂商ID和设备ID,方便查阅官方文档或匹配驱动白名单。
sudo lspci -k -nn | grep -A 3 -i nvidia,输出中会同时出现类似 01:00.0 VGA compatible controller [0300]: NVIDIA Corporation GP104 [GeForce GTX 1080] [10de:1b80] (rev a1) 和 Kernel modules: nvidiafb, nouveau, nvidia 的行。Kernel driver in use: 显示的是当前真正工作的模块(例如nvidia),而 Kernel modules: 列出的是内核探测到的、所有可能支持该设备的模块。Kernel driver in use 为空,说明设备未被任何模块绑定。这时需要检查nvidia.ko是否已加载(使用lsmod | grep nvidia),或者是否存在驱动冲突(比如nouveau开源驱动未被加入黑名单)。lspci -s 指定槽位时,地址格式容易出错的点使用lspci -s按地址筛选设备时,一个常见的坑是地址格式。PCI地址遵循domain:bus:slot.function的格式,但很多人会忽略slot(插槽)和function(功能)的十六进制解析规则——它们不是简单的十进制数字,而是遵循PCI规范定义的5位slot + 3位function编码。
0000:01:00.0 中,0000是domain,01是十六进制的bus号,00是十六进制的slot号,.0是function号。如果只写lspci -s 01:00.0,在存在多个根复合体(root complex)的系统中(如某些服务器),可能会匹配到错误的PCI总线。lspci -s 0000:01:00.0。这样可以避免在双路服务器或使用了PCIe交换芯片的环境下发生误匹配。.0。有些多功能设备(比如某些NVMe SSD)可能有多个function(例如.0, .1)。如果漏掉.0后缀,命令可能会静默失败(没有任何输出)。最后,有一个非常重要的细节常被忽略:lspci的输出并非实时刷新。它读取的是内核在启动时枚举的PCI设备快照。这意味着,如果你热插拔了一个设备(比如通过Thunderbolt接口外接了一块GPU),那么直接运行lspci是看不到新设备的。你需要先通知内核重新扫描PCI总线:echo 1 > /sys/bus/pci/rescan,然后再执行lspci,新设备才会出现在列表中。
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
售后无忧
立即购买>office旗舰店
正版软件
正版软件
正版软件
正版软件
正版软件
1
2
3
4
5
6
7
8
9