linux lspci命令

提示:lspci命令用于显示系统中所有PCI和PCIe设备的信息,包括显卡、网卡、存储控制器等硬件设备的详细信息。

命令简介

lspci 是Linux系统中用于显示PCI(Peripheral Component Interconnect)和PCIe(PCI Express)设备信息的命令。它从内核的PCI设备数据库中读取信息,并以可读的格式显示所有PCI设备的详细信息。对于硬件故障排查、驱动安装和系统配置来说,lspci是非常重要的诊断工具。

命令语法

lspci [选项]

常用选项

选项 说明
-m 以机器可读的格式显示(用于脚本处理)
-mm 以机器可读的键值对格式显示
-t 以树状图显示设备层次结构
-v 显示详细信息(冗长模式)
-vv 显示非常详细的信息
-vvv 显示最详细的信息(包括PCI配置空间)
-k 显示每个设备使用的内核驱动和模块
-nn 同时显示设备的数字ID和名称
-x 以十六进制显示PCI配置空间的前64字节
-xxx 以十六进制显示完整的PCI配置空间
-xxxx 显示扩展PCI配置空间
-s [[domain]:][bus]:[slot].[func] 只显示指定设备的信息
-d [vendor]:[device] 只显示指定厂商和设备ID的设备
-i 文件 使用指定的ID数据库文件
-D 始终显示PCI域号
-b 以总线为中心查看(显示总线上的所有地址)
-P 通过/proc/bus/pci接口访问
-H 模式 使用指定的访问模式(1、2、sysfs)
-M 启用总线映射模式(用于故障排查)
-h, --help 显示帮助信息
--version 显示版本信息

设备地址格式

PCI设备地址由以下部分组成:

[domain]:[bus]:[slot].[function]

例如:0000:00:1f.2 表示:
- 域 (domain): 0000
- 总线 (bus): 00
- 插槽 (slot): 1f
- 功能 (function): 2

输出字段解析

字段 说明 示例
设备地址 PCI设备的物理地址 00:00.0
Class 设备类别(十六进制+描述) 0300 - VGA兼容控制器
Vendor 厂商ID(十六进制+名称) 8086 - Intel Corporation
Device 设备ID(十六进制+名称) 9bca - Comet Lake-U GT2 [UHD Graphics]
SVendor 子系统厂商ID 17aa - Lenovo
SDevice 子系统设备ID 3801 - ThinkPad T14 Gen 1
Rev 修订版本号 04
ProgIf 编程接口 00
Interrupt 中断号 16
Region 内存/IO区域 Memory at 602c000000 (64-bit, non-prefetchable)

使用示例

示例1:基本使用

显示系统中所有PCI设备的基本信息:

# 显示所有PCI设备
lspci

# 示例输出:
# 00:00.0 Host bridge: Intel Corporation 8th Gen Core Processor Host Bridge/DRAM Registers (rev 07)
# 00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 630 (Mobile)
# 00:14.0 USB controller: Intel Corporation Cannon Lake PCH USB 3.1 xHCI Host Controller (rev 10)
# 00:16.0 Communication controller: Intel Corporation Cannon Lake PCH HECI Controller (rev 10)
# 00:17.0 SATA controller: Intel Corporation Cannon Lake PCH SATA AHCI Controller (rev 10)
# 00:1c.0 PCI bridge: Intel Corporation Cannon Lake PCH PCI Express Root Port #1 (rev f0)
# 00:1f.0 ISA bridge: Intel Corporation Cannon Lake PCH LPC Controller (rev 10)
# 00:1f.3 Audio device: Intel Corporation Cannon Lake PCH cAVS (rev 10)
# 00:1f.4 SMBus: Intel Corporation Cannon Lake PCH SMBus Controller (rev 10)
# 00:1f.5 Serial bus controller: Intel Corporation Cannon Lake PCH SPI Controller (rev 10)
# 01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
# 02:00.0 Network controller: Intel Corporation Wireless-AC 9560 [Jefferson Peak] (rev 10)

示例2:显示详细信息

显示PCI设备的详细信息:

# 显示详细信息
lspci -v

# 显示非常详细的信息
lspci -vv

# 显示最详细信息(包括配置空间)
lspci -vvv

# 显示特定设备的详细信息
lspci -s 00:02.0 -v

# 示例输出(部分):
# 00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 630 (Mobile) (prog-if 00 [VGA controller])
#     Subsystem: Dell UHD Graphics 630 (Mobile)
#     Flags: bus master, fast devsel, latency 0, IRQ 139
#     Memory at 602c000000 (64-bit, non-prefetchable) [size=16M]
#     Memory at 4000000000 (64-bit, prefetchable) [size=256M]
#     I/O ports at 3000 [size=64]
#     [virtual] Expansion ROM at 000c0000 [disabled] [size=128K]
#     Capabilities: [40] Vendor Specific Information: Len=0c
#     Capabilities: [70] Express Root Complex Integrated Endpoint, MSI 00
#     Capabilities: [ac] MSI: Enable+ Count=1/1 Maskable- 64bit-
#     Capabilities: [d0] Power Management version 2
#     Capabilities: [100] Process Address Space ID (PASID)
#     Capabilities: [200] Address Translation Service (ATS)
#     Kernel driver in use: i915
#     Kernel modules: i915

示例3:显示驱动和内核模块信息

显示每个PCI设备使用的内核驱动和模块:

# 显示设备使用的驱动和模块
                                lspci -k

# 显示详细信息+驱动信息
                                                             lspci -vk

# 示例输出:
# 00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 630 (Mobile)
#     Subsystem: Dell UHD Graphics 630 (Mobile)
#     Kernel driver in use: i915
#     Kernel modules: i915
#
# 00:14.0 USB controller: Intel Corporation Cannon Lake PCH USB 3.1 xHCI Host Controller (rev 10)
#     Subsystem: Dell Cannon Lake PCH USB 3.1 xHCI Host Controller
#     Kernel driver in use: xhci_hcd
#     Kernel modules: xhci_pci
#
# 01:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 15)
#     Subsystem: Dell RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
#     Kernel driver in use: r8169
#     Kernel modules: r8169

示例4:显示数字ID和树状结构

显示设备的数字ID和设备层次结构:

# 显示数字ID(厂商ID和设备ID)
                                lspci -nn

# 显示树状结构
                                                             lspci -t

# 显示树状结构+详细信息
                                                             lspci -tvv

# 示例树状输出:
# -[0000:00]-+-00.0
#            +-02.0
#            +-14.0
#            +-16.0
#            +-17.0
#            +-1c.0-[01]----00.0
#            +-1f.0
#            +-1f.3
#            +-1f.4
#            \-1f.5

# 数字ID输出示例:
# 00:02.0 VGA compatible controller [0300]: Intel Corporation UHD Graphics 630 (Mobile) [8086:9bca] (rev 07)
# 01:00.0 Ethernet controller [0200]: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller [10ec:8168] (rev 15)

示例5:按类别筛选设备

按设备类别筛选显示:

# 只显示网络控制器
                                lspci | grep -i network
lspci | grep -i ethernet

# 只显示显示控制器(显卡)
                                                             lspci | grep -i vga
lspci | grep -i display

# 只显示USB控制器
                                                             lspci | grep -i usb

# 只显示存储控制器
                                                             lspci | grep -i sata
lspci | grep -i scsi
lspci | grep -i raid

# 只显示音频设备
                                                             lspci | grep -i audio

# 使用数字ID筛选
                                                             lspci -d 10ec:    # 显示所有Realtek设备
                                                             lspci -d 8086:    # 显示所有Intel设备
                                                             lspci -d 1002:    # 显示所有AMD设备
                                                             lspci -d 10de:    # 显示所有NVIDIA设备

示例6:显示PCI配置空间

以十六进制显示PCI设备的配置空间:

# 显示PCI配置空间前64字节
                                lspci -x

# 显示完整PCI配置空间(256字节)
                                                             lspci -xxx

# 显示特定设备的配置空间
                                                             lspci -s 00:02.0 -xxx

# 示例输出:
# 00:02.0 VGA compatible controller: Intel Corporation UHD Graphics 630 (Mobile) (rev 07)
# 00: 86 80 ca 9b 07 00 10 00 07 00 00 03 00 00 00 00
# 10: 04 00 00 0c 60 02 00 00 00 00 00 40 01 00 00 00
# 20: 01 30 00 00 00 00 00 00 00 00 00 00 86 80 18 40
# 30: 00 00 00 00 40 00 00 00 00 00 00 00 0b 01 00 00

示例7:机器可读格式和脚本处理

以机器可读格式输出,便于脚本处理:

# 机器可读格式(旧格式)
                                lspci -m

# 键值对格式(推荐用于脚本)
                                                             lspci -mm

# JSON格式(如果支持)
                                                             lspci -mm | python3 -c "import sys, json; print(json.dumps([dict(zip(['slot','cls','vendor','device','svendor','sdevice','rev','progif','driver'], line.split('\" \"'))) for line in sys.stdin.read().split('\n') if line], indent=2))"

# 提取特定信息到变量
                                                             VENDOR_ID=$(lspci -s 00:02.0 -n | awk '{print $3}' | cut -d: -f1)
                                                             DEVICE_ID=$(lspci -s 00:02.0 -n | awk '{print $3}' | cut -d: -f2)
                                                             echo "Vendor ID: $VENDOR_ID, Device ID: $DEVICE_ID"

示例8:高级用法和组合选项

# 显示设备及其驱动,按总线排序
                                lspci -Dk

# 以总线为中心的视图
                                                             lspci -b

# 显示所有Intel设备的详细信息
                                                             lspci -d 8086: -vv

# 显示树状结构,包括设备名称
                                                             lspci -t -nn

# 显示特定类别的所有设备
                                                             lspci -d ::0300    # 所有显示控制器
                                                             lspci -d ::0200    # 所有网络控制器
                                                             lspci -d ::0106    # 所有SATA控制器

# 检查PCIe链路速度和宽度
                                                             lspci -vv | grep -A 5 -B 5 "LnkSta"

# 检查设备是否支持SR-IOV
                                                             lspci -vv | grep -i sriov

常见设备类别代码

类别代码 类别名称 说明
00 Unclassified 未分类设备
01 Mass storage controller 大容量存储控制器(SCSI、SATA、RAID等)
02 Network controller 网络控制器(以太网、无线网卡等)
03 Display controller 显示控制器(显卡、集成显卡等)
04 Multimedia controller 多媒体控制器(音频、视频采集卡等)
05 Memory controller 内存控制器
06 Bridge 桥接设备(PCI桥、PCIe桥等)
07 Communication controller 通信控制器(串口、并口、蓝牙等)
08 System peripheral 系统外设(DMA控制器、定时器等)
09 Input device controller 输入设备控制器(键盘、鼠标控制器等)
0a Docking station 扩展坞
0b Processor 处理器(协处理器等)
0c Serial bus controller 串行总线控制器(USB、FireWire、SMBus等)
0d Wireless controller 无线控制器(Wi-Fi、蓝牙等)
0e Intelligent controller 智能控制器
0f Satellite communications controller 卫星通信控制器
10 Encryption controller 加密控制器(TPM、加密加速器等)
11 Signal processing controller 信号处理控制器
12 Processing accelerators 处理加速器(GPU、FPGA等)
13 Non-Essential Instrumentation 非必要仪器设备

在脚本中使用lspci

#!/bin/bash

# 脚本1:检测硬件信息
                                                             echo "=== 系统硬件检测报告 ==="
echo "生成时间: $(date)"
echo ""

# 检测显卡信息
                                                             echo "1. 显卡信息:"
lspci | grep -i "vga\|3d\|display" | while read line; do
                                    echo "   $line"
done

# 检测网卡信息
                                                             echo ""
echo "2. 网络控制器:"
lspci | grep -i "network\|ethernet" | while read line; do
                                    DEVICE=$(echo $line | awk '{print $1}')
                                                             echo "   $line"
    echo "   驱动信息: $(lspci -s $DEVICE -k | grep "Kernel driver" | cut -d: -f2)"
done

# 检测存储控制器
                                                             echo ""
echo "3. 存储控制器:"
lspci | grep -i "sata\|scsi\|raid" | while read line; do
                                    echo "   $line"
done

# 脚本2:检查特定设备是否存在
                                                             check_device() {
                                                             local vendor=$1
    local device=$2

    if lspci -d ${vendor}:${device} > /dev/null 2>&1; then
        echo "设备 ${vendor}:${device} 存在"
        return 0
    else
                                                             echo "设备 ${vendor}:${device} 不存在"
        return 1
    fi
}

# 检查NVIDIA显卡是否存在
                                                             check_device "10de" "1c03"

# 脚本3:生成硬件ID报告
                                                             generate_hardware_report() {
                                                             OUTPUT_FILE="/tmp/hardware_report_$(date +%Y%m%d_%H%M%S).txt"

    echo "硬件ID报告" > $OUTPUT_FILE
    echo "==========" >> $OUTPUT_FILE
    echo "" >> $OUTPUT_FILE

    lspci -nn | while read line; do
                                    if [[ $line =~ \[([0-9a-f]{4}):([0-9a-f]{4})\] ]]; then
            vendor_id=${BASH_REMATCH[1]}
            device_id=${BASH_REMATCH[2]}
            echo "$line" >> $OUTPUT_FILE
            echo "Vendor ID: $vendor_id, Device ID: $device_id" >> $OUTPUT_FILE
            echo "" >> $OUTPUT_FILE
        fi
    done

    echo "报告已保存到: $OUTPUT_FILE"
}

# 脚本4:检查PCIe链路状态
                                                             check_pcie_link_status() {
    echo "PCIe链路状态检查:"
    echo "================="

    lspci -vv 2>/dev/null | grep -A 5 -B 5 "LnkSta:" | while read line; do
                                    if [[ $line =~ ^([0-9a-f]{2}:[0-9a-f]{2}\.[0-9a-f]) ]]; then
            device=$BASH_REMATCH
            echo "设备: $device"
        elif [[ $line =~ LnkSta: ]]; then
            echo "   $line"
        fi
    done
}

常见厂商ID

厂商ID 厂商名称 常见产品
8086 Intel Corporation CPU、芯片组、网卡、集成显卡
10de NVIDIA Corporation 独立显卡、专业显卡
1002 Advanced Micro Devices (AMD) CPU、显卡、芯片组
10ec Realtek Semiconductor 声卡、网卡、读卡器
14e4 Broadcom Inc. 网卡、存储控制器
1969 Atheros Communications 无线网卡
1217 O2 Micro, Inc. 读卡器
1b73 FLIR Systems 视频采集卡
15ad VMware 虚拟设备
1234 Technical Corp. 测试设备

注意事项

  1. lspci命令需要root权限才能访问完整的PCI配置空间信息
  2. 某些虚拟化环境(如VMware、VirtualBox)中的PCI设备可能与物理设备不同
  3. lspci显示的是当前内核识别的设备,可能不包括未加载驱动的设备
  4. 对于PCIe设备,链路速度和宽度信息在-vv输出中查看
  5. 不同Linux发行版的lspci版本可能支持不同的选项
  6. lspci使用/usr/share/misc/pci.ids数据库文件来解析厂商和设备名称
  7. 可以手动更新PCI ID数据库:sudo update-pciids
  8. 在容器环境中,lspci可能无法工作或只能显示有限信息
  9. 对于热插拔PCIe设备,可能需要重新运行lspci才能看到新设备

故障排查

# 1. lspci命令不存在
# 检查是否安装
                                which lspci
# 安装(如果需要)
# Ubuntu/Debian: sudo apt-get install pciutils
# RHEL/CentOS: sudo yum install pciutils

# 2. 设备信息不完整
# 更新PCI ID数据库
                                                             sudo update-pciids

# 3. 无法查看配置空间
# 使用root权限运行
                                                             sudo lspci -xxx

# 4. 检查设备是否被内核识别
                                                             dmesg | grep -i pci
dmesg | grep -i "pci.*enable"

# 5. 查看原始PCI信息
                                                             cat /proc/bus/pci/devices
ls -la /sys/bus/pci/devices/

# 6. 重置PCI设备(危险!仅在必要时使用)
# 查找设备地址
lspci -n -s 00:02.0
# 卸载驱动
                                                             sudo modprobe -r i915
# 重新扫描PCI总线
                                                             sudo echo 1 > /sys/bus/pci/devices/0000:00:02.0/remove
sudo echo 1 > /sys/bus/pci/rescan

# 7. 检查PCIe链路状态
                                                             lspci -vv | grep -A 3 "LnkSta\|LnkCap"

# 8. 查看PCI设备资源
                                                             cat /proc/iomem | grep -i pci
cat /proc/ioports | grep -i pci

PCI配置空间详解

# PCI配置空间布局(前64字节):
# 偏移 长度  字段
# 0x00   2   厂商ID (Vendor ID)
# 0x02   2   设备ID (Device ID)
# 0x04   2   命令寄存器 (Command)
# 0x06   2   状态寄存器 (Status)
# 0x08   1   修订ID (Revision ID)
# 0x09   3   类代码 (Class Code)
# 0x0C   1   缓存行大小 (Cache Line Size)
# 0x0D   1   主延迟定时器 (Master Latency Timer)
# 0x0E   1   头类型 (Header Type)
# 0x0F   1   BIST (Built-In Self Test)
# 0x10   4   基地址寄存器0 (Base Address Register 0)
# 0x14   4   基地址寄存器1 (Base Address Register 1)
# ...    更多基地址寄存器
# 0x3C   1   中断线 (Interrupt Line)
# 0x3D   1   中断引脚 (Interrupt Pin)
# 0x3E   1   最小授权 (Min Grant)
# 0x3F   1   最大延迟 (Max Latency)

# 查看特定偏移的值
                                sudo lspci -s 00:02.0 -xxx | head -20

相关命令

  • lsusb - 显示USB设备信息
  • lsblk - 显示块设备信息
  • lscpu - 显示CPU架构信息
  • lshw - 显示完整的硬件信息
  • dmidecode 获取DMI/BIOS信息
  • setpci - 配置PCI设备(需要root权限)
  • hwinfo - 硬件检测工具
  • inxi - 全功能系统信息工具
  • udevadm - udev设备管理工具