商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 系统应用 > Linux怎么查看PCI设备信息 Linux下lspci硬件检测详解

Linux怎么查看PCI设备信息 Linux下lspci硬件检测详解

  发布于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命令,它以机器可读的格式输出,对权限的要求相对宽松一些。

Linux怎么查看PCI设备信息 Linux下lspci硬件检测详解

普通用户运行 lspci 为什么看不到显卡或网卡完整信息?

核心原因在于权限。设备的厂商名、驱动状态、内存地址等关键字段受内核PCI配置空间的访问限制。普通用户默认只能读取/sys/bus/pci/devices路径下的基础设备树结构,得到的是简化数据。因此,不加sudo时,很多字段会显示不全。

  • 执行 sudo lspci 才能访问完整的 PCI 配置空间,获取设备 ID、BAR 地址、中断号等底层信息。
  • 某些发行版(如 Ubuntu 22.04+)默认禁用 /proc/bus/pci 接口,此时即使加 sudo-x-vv 也可能报错 Cannot read configuration space
  • 若只需识别设备型号,lspci -mm(机器可读格式)对权限要求较低,适合脚本调用。

lspci -vlspci -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)时才需关注。
  • 两者都依赖内核开启 CONFIG_PCI_DEBUG,部分精简内核(如某些容器宿主机)可能编译时未启用,导致 -vv 输出异常简略。

如何快速定位某块 NVIDIA 显卡对应的内核模块和设备 ID?

最直接的方法是组合使用-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总线。
  • 稳妥的写法是带上domain部分:使用 lspci -s 0000:01:00.0。这样可以避免在双路服务器或使用了PCIe交换芯片的环境下发生误匹配。
  • 另外,function号不一定是.0。有些多功能设备(比如某些NVMe SSD)可能有多个function(例如.0, .1)。如果漏掉.0后缀,命令可能会静默失败(没有任何输出)。

最后,有一个非常重要的细节常被忽略:lspci的输出并非实时刷新。它读取的是内核在启动时枚举的PCI设备快照。这意味着,如果你热插拔了一个设备(比如通过Thunderbolt接口外接了一块GPU),那么直接运行lspci是看不到新设备的。你需要先通知内核重新扫描PCI总线:echo 1 > /sys/bus/pci/rescan,然后再执行lspci,新设备才会出现在列表中。

本文转载于:https://www.php.cn/faq/2388523.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注