普通网友 2026-03-05 12:00 采纳率: 98.7%
浏览 1
已采纳

如何在Linux中列出所有PCIe设备及其详细信息?

如何在Linux中列出所有PCIe设备及其详细信息? 在Linux系统中,常需识别主板上所有PCIe插槽、显卡、NVMe SSD、网卡等设备的型号、厂商、链路宽度(Lane)、协商速率(Gen1/2/3/4/5)、设备ID、驱动绑定状态及拓扑关系。但`lspci`默认输出简略,不显示链路能力、当前工作速率或AER(高级错误报告)信息;`lshw -class bus`缺乏PCIe专属字段;而`setpci`需手动解析配置空间,门槛高。此外,多层级PCIe Switch、SR-IOV虚拟功能(VF)、ACS(访问控制服务)启用状态等关键特性也难以直观获取。用户常困惑:为何`lspci -vv`中“LnkCap”与“LnkSta”数值不一致?如何区分物理插槽与逻辑设备?怎样确认某NVMe盘是否运行在PCIe 4.0 x4全速模式?是否有命令可一键导出含热插拔支持、电源管理(ASPM)及ECAM地址的完整拓扑图?这些问题直接影响硬件兼容性排查、性能调优与故障诊断效率。
  • 写回答

1条回答 默认 最新

  • 秋葵葵 2026-03-05 12:01
    关注
    ```html

    一、基础识别:使用 lspci 获取设备枚举与厂商型号

    最常用且轻量的命令是 lspci,它读取 PCI 配置空间(ECAM 或 MMCONFIG),无需 root 权限即可列出所有已发现的 PCIe 设备:

    lspci -mm  # 机器可解析格式,含 Vendor/Device ID、Class、Subsystem 等
    lspci -nnk  # 显示设备ID(十六进制)及绑定驱动(Kernel driver in use)
    lspci -D    # 输出完整 domain:bus:slot.func 地址(关键用于多根复合体MR-IOV场景)

    例如:lspci -nnk | grep -A2 "NVMe" 可快速定位 NVMe SSD 及其驱动(如 nvmevfio-pci)。

    二、深度解析:lspci -vv 揭示链路能力与协商状态

    lspci -vv 是 PCIe 调优的核心工具。关键字段解读如下:

    字段含义典型值示例
    LnkCapLink Capabilities(链路能力寄存器)Speed 8GT/s, Width x16
    LnkStaLink Status(当前协商状态)Speed 8GT/s, Width x8
    ASPMActive State Power Management 支持/启用状态ASPM L1 Enabled
    HotPlug热插拔能力(Slot Capabilities 中)HotPlug+ SlotPowerLimit 75W

    为何 LnkCap ≠ LnkSta? 因物理限制(如插槽机械宽度、主板布线、BIOS 设置、PCIe Switch 转发能力或上游设备降速)导致协商降级 —— 这正是性能瓶颈诊断起点。

    三、拓扑建模:可视化 PCIe 层级结构与 Switch 分布

    Linux 内核通过 /sys/bus/pci/devices/ 提供设备层级关系。结合 lspci -t 与自定义脚本可生成完整拓扑图:

    # 一键生成 Mermaid 拓扑(需安装 graphviz & mermaid-cli)
    lspci -t -v | awk '/^[[:space:]]*[0-9a-f]+\.[0-9a-f]+/ {print $1}' | \
      sed 's/[^0-9a-f\.]//g' | \
      awk -F. '{print "PCIe_" $1 "[label=\"Bus "$1"\"];"}' | \
      sort -u > topo.mmd
    graph TD Root[Root Complex] --> Switch1["PCIe Switch
    Gen4 x16"] Switch1 --> GPU["NVIDIA A100
    LnkSta: Gen4 x16"] Switch1 --> NVMe1["Samsung 980 Pro
    LnkSta: Gen4 x4"] Root --> NIC["Mellanox ConnectX-6
    SR-IOV: 8 VFs enabled"] NIC --> VF1["VF 0000:03:00.1"] NIC --> VF2["VF 0000:03:00.2"]

    四、高级特性探测:ACS、SR-IOV、AER 与 ASPM 状态

    需深入 sysfs 手动验证关键企业级特性:

    • ACS 启用状态cat /sys/bus/pci/devices/0000:01:00.0/acs(若存在且为 1 表示启用)
    • SR-IOV VF 数量ls /sys/bus/pci/devices/0000:02:00.0/virtfn* 或检查 sriov_numvfs 文件
    • AER 错误计数cat /sys/bus/pci/devices/0000:04:00.0/aer_*_err(如 aer_uncorr_err
    • ASPM 当前策略cat /sys/module/pcie_aspm/parameters/policy[default] performance powersave

    五、终极诊断:整合脚本一键输出全维度 PCIe 报告

    以下 Bash 脚本(保存为 pcie-audit.sh)自动采集全部关键字段并导出 CSV:

    #!/bin/bash
    echo "Domain,Bus,Slot,Func,Vendor,Device,Class,Driver,LnkCap_Speed,LnkCap_Width,LnkSta_Speed,LnkSta_Width,ASPM,HotPlug,ECAM_Addr,AER_Supported" > pcie_audit.csv
    for d in /sys/bus/pci/devices/*; do
      [ ! -d "$d" ] && continue
      dev=$(basename $d)
      printf "%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\n" \
        $(echo $dev | cut -d: -f1) \
        $(echo $dev | cut -d: -f2) \
        $(echo $dev | cut -d: -f3 | cut -d. -f1) \
        $(echo $dev | cut -d: -f3 | cut -d. -f2) \
        "$(lspci -nns $dev | awk -F': ' '/Vendor:/ {print $2}')" \
        "$(lspci -nns $dev | awk -F': ' '/Device:/ {print $2}')" \
        "$(lspci -nns $dev | awk -F': ' '/Class:/ {print $2}')" \
        "$(lspci -nns $dev | awk -F': ' '/Kernel driver in use:/ {print $2}')" \
        "$(lspci -vv -s $dev 2>/dev/null | awk '/LnkCap.*Speed/{print $NF}')" \
        "$(lspci -vv -s $dev 2>/dev/null | awk '/LnkCap.*Width/{print $NF}')" \
        "$(lspci -vv -s $dev 2>/dev/null | awk '/LnkSta.*Speed/{print $NF}')" \
        "$(lspci -vv -s $dev 2>/dev/null | awk '/LnkSta.*Width/{print $NF}')" \
        "$(lspci -vv -s $dev 2>/dev/null | awk '/ASPM.*Enabled/{print \"Enabled\"; exit} /ASPM.*Disabled/{print \"Disabled\"; exit}')" \
        "$(lspci -vv -s $dev 2>/dev/null | awk '/HotPlug\+/ {print \"Yes\"; exit} /HotPlug\-/ {print \"No\"; exit}')" \
        "$(cat $d/resource 2>/dev/null | head -1 | awk '{print $1}')" \
        "$(lspci -vv -s $dev 2>/dev/null | grep -q 'Advanced Error Reporting' && echo Yes || echo No)"
    done

    执行后生成 pcie_audit.csv,支持 Excel 分析、速率匹配度统计(如 LnkSta.Width < LnkCap.Width 即存在降宽)、驱动绑定异常告警等。

    六、专家级延伸:ECAM 地址映射与 PCIe 配置空间直读

    对于固件/UEFI 工程师,需绕过内核抽象层直接访问配置空间:

    • 获取 ECAM 基地址:sudo dmesg | grep -i "ecam\|mmconfig"
    • 读取设备 Capability List:sudo setpci -s 0000:05:00.0 CAP_EXP+10.w(读取 PCIe Cap Offset)
    • 解析 Link Control 2 Register(Offset 0x2C)判断 ASPM L0s/L1 是否使能
    • 使用 pcieport 驱动日志:dmesg | grep -i "pcie.*error\|aer" 定位链路训练失败原因

    该层级操作要求对 PCIe Base Spec Rev 5.0+ 的配置空间布局(如 Type 0 vs Type 1 Header)、Capability ID(0x10=PCIe, 0x18=AER, 0x19=ACS)有精准掌握。

    ```
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 3月6日
  • 创建了问题 3月5日