当你在个人电脑或服务器上运行 linux 时,有时需要识别该系统中的硬件。lspci 命令用于显示连接到 pci 总线的所有设备,从而满足上述需求。
由于访问权限,普通用户运行 lspci 时显示的信息可能会受限,因此可以使用 sudo 运行命令,系统会给出完整的信息图。
直接运行 lspci 命令会列出 pci 总线及其连接的设备,下图是在我的媒体中心 pc 上的演示样例。图中是一个基于 amd phenom cpu 的系统,所以它有一个 amd 芯片组,以及 atheros 无线适配器和 nvidia 显卡。所有硬件设备都列出了详细信息,例如供应商、名称和型号等:
$ sudo lspci 00:00.0 host bridge: advanced micro devices, inc. [amd] rs880 host bridge 00:02.0 pci bridge: advanced micro devices, inc. [amd] rs780 pci to pci bridge (ext gfx port 0) 00:04.0 pci bridge: advanced micro devices, inc. [amd] rs780/rs880 pci to pci bridge (pcie port 0) 00:05.0 pci bridge: advanced micro devices, inc. [amd] rs780/rs880 pci to pci bridge (pcie port 1) 00:11.0 sata controller: advanced micro devices, inc. [amd/ati] sb7x0/sb8x0/sb9x0 sata controller [ahci mode] 00:12.0 usb controller: advanced micro devices, inc. [amd/ati] sb7x0/sb8x0/sb9x0 usb ohci0 controller 00:12.1 usb controller: advanced micro devices, inc. [amd/ati] sb7x0 usb ohci1 controller 00:12.2 usb controller: advanced micro devices, inc. [amd/ati] sb7x0/sb8x0/sb9x0 usb ehci controller 00:13.0 usb controller: advanced micro devices, inc. [amd/ati] sb7x0/sb8x0/sb9x0 usb ohci0 controller 00:13.1 usb controller: advanced micro devices, inc. [amd/ati] sb7x0 usb ohci1 controller 00:13.2 usb controller: advanced micro devices, inc. [amd/ati] sb7x0/sb8x0/sb9x0 usb ehci controller 00:14.0 **bus: advanced micro devices, inc. [amd/ati] sbx00 **bus controller (rev 3c) 00:14.1 ide interface: advanced micro devices, inc. [amd/ati] sb7x0/sb8x0/sb9x0 ide controller 00:14.3 isa bridge: advanced micro devices, inc. [amd/ati] sb7x0/sb8x0/sb9x0 lpc host controller 00:14.4 pci bridge: advanced micro devices, inc. [amd/ati] sbx00 pci to pci bridge 00:14.5 usb controller: advanced micro devices, inc. [amd/ati] sb7x0/sb8x0/sb9x0 usb ohci2 controller 00:18.0 host bridge: advanced micro devices, inc. [amd] family 10h processor hypertransport configuration 00:18.1 host bridge: advanced micro devices, inc. [amd] family 10h processor address map 00:18.2 host bridge: advanced micro devices, inc. [amd] family 10h processor dram controller 00:18.3 host bridge: advanced micro devices, inc. [amd] family 10h processor miscellaneous control 00:18.4 host bridge: advanced micro devices, inc. [amd] family 10h processor link control 01:00.0 vga compatible controller: nvidia corporation gk107 [geforce gtx 650] (rev a1) 01:00.1 audio device: nvidia corporation gk107 hdmi audio controller (rev a1) 02:00.0 network controller: qualcomm atheros ar9287 wireless network adapter (pci-express) (rev 01)
添加 -v 选项会显示每个设备的详细信息,你可以使用 -vv 或 -vvv 来获取更多的设备细节。在 -v 级别,lspci 会显示所有设备的各种子系统和内存地址、中断请求(irq)编号和一些其他功能信息。输出信息会非常长。在你的系统上试一试吧。
你可能会需要缩小搜索范围。例如,rpm fusion 网站有安装 nvidia 图形驱动程序的说明,里面就首先使用了 grep 命令来定位显卡信息。下面是我在笔记本电脑上得到的输出:
$ sudo lspci | grep -e vga 00:02.0 vga compatible controller: intel corporation uhd graphics 620 (rev 07) $ sudo lspci | grep -e 3d 01:00.0 3d controller: nvidia corporation gm108m [geforce mx130] (rev a2)
下面(lctt 译注:原文为 “above”,应为作者笔误)的 grep 命令在我的媒体中心 pc 上定位了一个 vga 设备,但没有显示 3d 设备。
$ sudo lspci | grep -e vga 01:00.0 vga compatible controller: nvidia corporation gk107 [geforce gtx 650] (rev a1) $ sudo lspci | grep -e 3d $
还有另一种无需 grep 的方法可以使用。假设我想确认一下此计算机是否有其他的 nvidia 设备,在此之前我们还需要一些额外信息,使用 -nn 选项显示的供应商和设备 id 号。在我的媒体中心 pc 上,此选项会给出我的 vga 卡、供应商 id 和设备 id:
$ sudo lspci -nn | grep -e vga 01:00.0 vga compatible controller [0300]: nvidia corporation gk107 [geforce gtx 650] [10de:0fc6] (rev a1)
设备名称后的方括号内有用冒号分隔的数字,即供应商和设备 id。输出表明 nvidia corporation 制造的设备的供应商 id 为 10de。
-d 选项用于指定供应商、设备或类 id 的所有设备。以下是我系统中的所有 nvidia 设备(保留 -nn 以解析供应商 id):
$ sudo lspci -nn -d 10de: 01:00.0 vga compatible controller [0300]: nvidia corporation gk107 [geforce gtx 650] [10de:0fc6] (rev a1) 01:00.1 audio device [0403]: nvidia corporation gk107 hdmi audio controller [10de:0e1b] (rev a1)
从输出中可以看到,除了显卡之外,我还有一个 nvidia 音频设备。实际上它们都属于同一张 nvidia geforce gtx 650 卡,但这仍然是一个很好的示例。
结合 pci 硬件设备,lspci 可以使用 -k 选项显示内核加载了哪些驱动程序模块。我将此选项添加到我的 lspci 命令来查看有关我的 nvidia 设备的信息。
$ sudo lspci -nn -k -d 10de: 01:00.0 vga compatible controller [0300]: nvidia corporation gk107 [geforce gtx 650] [10de:0fc6] (rev a1) subsystem: evga.com. corp. gk107 [geforce gtx 650] [3842:2650] kernel driver in use: nvidia kernel modules: nvidiafb, nouveau, nvidia_drm, nvidia 01:00.1 audio device [0403]: nvidia corporation gk107 hdmi audio controller [10de:0e1b] (rev a1) subsystem: evga.com. corp. gk107 hdmi audio controller [3842:2650] kernel driver in use: snd_hda_intel kernel modules: snd_hda_intel
可以看到额外显示了两行:正在使用的内核驱动程序kernel driver in use 和 内核模块kernel modules,其中后者列出了可用于支持该设备的模块。
新设备和供应商总是在不断迭代。如果看到显示为 unknown 的设备,说明你的 pci 设备 id 数据库可能已过时。有两种方法可以检查更新。-q 选项会使用 dns 查询中央数据库,当然,这需要联网。
$ sudo lspci -q
你还可以通过运行命令 update-pciids 来更新本地 pci id 数据库。
$ sudo update-pciids downloaded daily snapshot dated 2021-08-22 03:15:01
了解有关你的硬件的更多信息
当然,lspci 只是 linux 中用于查询系统硬件和软件的诸多命令之一。