linux系统从pci.ids文件获取硬件设备详细厂商信息

机器采样:

[root@ht24 hwdata]# cat /etc/redhat-release ; uname -r
CentOS Linux release 7.9.2009 (Core)
3.10.0-1160.42.2.el7.x86_64

lspci 查询pci设备信息,这些PCI设备名字文件保存在哪里呢?

实际linux系统从
/usr/share/hwdata/pci.ids或/usr/share/misc/pci.ids
文件中可以获取硬件设备详细厂商信息

关于lspci

显示Linux系统的pci设备最简单的方法就是使用lspci命令

安装pciutils包(centos在最小化安装时不会自带该包,需要自己下载安装)
https://www.linuxfromscratch.org/blfs/view/svn/general/pciutils.html
pciutils包的源码github地址为: https://github.com/pciutils/pciutils
从该项目的README文件可以知道,其主要提供三个命令:lspci、setpci和update-pciids。

 update-pciids命令会从网上更新pci.ids文件,该文件包含着pci设备的vendor id和 device id 与厂商名称、型号名称的对应关系,
  一旦更改该文件那么lspcishow出来的东西就会发生变化。

 不同Linux发行版本的pci.ids文件的位置有所不同,比如centos一般在/usr/share/hwdata/pci.ids,而Debian一般在/usr/share/misc/pci.ids,

 lspci命令的安装路径一般在centos下的/usr/sbin/lspci,而在Debian下一般为/use/bin/lspci,

 update-pciids一般在/usr/sbin/update-pciids,这些路径如果是手动编译安装pciutils则可以自行定制,关于如何编译安装可参考pciutils-3.6.2。

 同样,不同发行版本的pciutils也有差异,比如centos的update-pciids和Debian的 update-pciids是有区别的,最重要的区别在于其pci.ids更新的源不同 

http://pci-ids.ucw.cz/

https://github.com/pciutils/pciids

同发行版本的pciutils也有差异,比如centos的update-pciids和Debian的 update-pciids是有区别的,最重要的区别在于其pci.ids更新的源不同
在Debian中:
#!/bin/sh
#URL="http://pci-ids.ucw.cz/pci.ids"
URL="http://pciids.sourceforge.net/v2.2/pci.ids"
FILE=/usr/share/misc/pci.ids
 
在centos中:
#!/bin/sh
[ "$1" = "-q" ] && quiet=true || quiet=false
set -e
SRC="http://pci-ids.ucw.cz/v2.2/pci.ids"
DEST=/usr/share/hwdata/pci.ids
 
我们可以直接访问 http://pci-ids.ucw.cz/pci.ids

如果想更新该文件可以查看
https://linux.101hacks.com/unix/update-pciids/

我们进入/usr/share/hwdata目录看下

[root@ht24 hwdata]# ll
total 7884
-rw-r--r-- 1 root root 1778721 Oct  1  2020 iab.txt
-rw-r--r-- 1 root root 4296346 Oct  1  2020 oui.txt  //OUI是组织唯一标识符的缩写。网卡的生产厂家列表
OUI/MA-L                                                    Organization
company_id                                                  Organization
                                                            Address

00-22-72   (hex)        American Micro-Fuel Device Corp.
002272     (base 16)        American Micro-Fuel Device Corp.
                2181 Buchanan Loop
                Ferndale  WA  98248
                US

00-D0-EF   (hex)        IGT
00D0EF     (base 16)        IGT
                9295 PROTOTYPE DRIVE
                RENO  NV  89511
                US

.........其他省略

-rw-r--r-- 1 root root 1220928 Oct  1  2020 pci.ids
#
#    List of PCI ID's
#
#    Version: 2020.06.24
#    Date:    2020-06-24 03:15:01
#
#    Maintained by Albert Pool, Martin Mares, and other volunteers from
#    the PCI ID Project at https://pci-ids.ucw.cz/.
#
#    New data are always welcome, especially if they are accurate. If you have
#    anything to contribute, please follow the instructions at the web site.
#
#    This file can be distributed under either the GNU General Public License
#    (version 2 or higher) or the 3-clause BSD License.
#
#    The database is a compilation of factual data, and as such the copyright
#    only covers the aggregation and formatting. The copyright is held by
#    Martin Mares and Albert Pool.
#

# Vendors, devices and subsystems. Please keep sorted.

# Syntax:
# vendor  vendor_name
#    device  device_name                <-- single tab
#        subvendor subdevice  subsystem_name    <-- two tabs

0001  SafeNet (wrong ID)
0010  Allied Telesis, Inc (Wrong ID)
# This is a relabelled RTL-8139
    8139  AT-2500TX V3 Ethernet
0014  Loongson Technology LLC
    7a00  Hyper Transport Bridge Controller
    7a02  APB (Advanced Peripheral Bus) Controller
    7a03  Gigabit Ethernet Controller
    7a04  OTG USB Controller
    7a05  Vivante GPU (Graphics Processing Unit)
    7a06  DC (Display Controller)
    7a07  HDA (High Definition Audio) Controller
    7a08  SATA AHCI Controller
    7a09  PCI-to-PCI Bridge
    7a0b  SPI Controller
    7a0c  LPC Controller
    7a0f  DMA (Direct Memory Access) Controller
    7a14  EHCI USB Controller
    7a15  Vivante GPU (Graphics Processing Unit)
    7a19  PCI-to-PCI Bridge
    7a24  OHCI USB Controller
    7a29  PCI-to-PCI Bridge

...................其他省略

-rw-r--r-- 1 root root   55055 Oct  1  2020 pnp.ids //即插即用设备列表
-rw-r--r-- 1 root root    2162 Oct  1  2020 sdio.ids //安全数字输入输出
-rw-r--r-- 1 root root  707614 Oct  1  2020 usb.ids  //全球usb厂商列表

 

在Linux的源码中也有一个名为include/linux/pci_ids.h的头文件,该文件的内容定义了各个pci设备vendor_id和device_id.

E:\linux内核\linux-2.6.38.5\linux-2.6.38.5\include\linux\pci_ids.h

 

man lspci

名称
lspci 列出所有 pci 设备

staging 模块
lspci[选项]

描述
lspci 工具显示有关系统中的 pci 总线和设备连接的.

缺省情况下,它会在设备列表中.

如果您正在 windows 中的 pci 设备报告错误或 lspci 本身,请包括输出"lspci vvx"甚至更好的"lspci vvxxx"(但是,查看下面可能的信 ?).

输出的某些部分.特别是在高度 verbose 模式,也许只对经验丰富的 pci 黑客 intelligibleexact 字段时,请查阅有关 pci 规范或 /usr/include/linux/pci.h 包含文件的定义.

pci 配置空间的某些部分的访问被限制到许多操作系统上的根,因此, lspci 可用的功能与普通用户是有限的.但是, lspci 次其最佳,以尽可能多地显示可用,并将所有其他信息文本.

选项
基本的显示模式

m
dump 的 pci 设备的向后兼容的机器可读取表单中的数据.查看下面的细节.
毫米
dump 的 pci 设备轻松分析脚本在一个机器可读取表单中的数据.查看下面的细节.
t
显示包含所有总线,它们之间的桥梁,设备和连接的树,如图.
显示选项

v
verbose 显示详细信息和所有的设备.
vv
非常的繁琐和显示有关细节.此级别包括适当的一切内容很有用.
vvv
甚至显示一切我们和更详细的分析.即使它看起来不感兴趣的(例如,内存的区域).
k
显示内核驱动处理每个设备和内核模块能够处理它.打开v在正常模式下时,默认的输出.(目前仅在 linux 上带有 2.6 内核或更新 .)
x
显示十六进制转储标准部件的配置空间(64个字节或 128 字节 cardbus 桥).
xxx
显示十六进制 dump 整个 pci 配置空间.它仅作为几根 pci 设备当您尝试读取配置空间的某些部分崩溃(该行为可能不违反 pci 标准,但它至少非常stupid).但是,这样的设备都极少,所以您应该深奥的担心.
xxxx
显示十六进制转储扩展(4096字节)pci配置空间 pci x 2.0 和 pci express 总线.
b
总线以人为本的视图.显示卡的所有看到的 irq 号码和地址在 pci 总线上的内核代码.
D
总显示 pci 域的数字.缺省情况下, lspci 消除机器上,只有域0.
选项来控制解决 id 的名称

n
代码为数字而非寻找的 pci id 列表中显示 pci 供应商和设备.
nn
显示 pci 供应商和设备代码充当编号和名称.
q
如果 dns 查询成功,结果被缓存到~/ .pciidscache 和它在后续运行,即使是可识别的q没有给出任何有关.只与小心,以避免重载数据库服务器内的自动化脚本,请使用此开关.
qq
同问,但本地缓存被复位.
Q
查询本地的条目被识别的中央数据库中.如果您怀疑所显示的条目是不对的.
选择设备选项之一:

s[[[[<域>]:]<总线>]:][<插槽>][.[]]
仅显示设备在指定的域(如果您的机器具有若干主机桥梁.他们可以共享一个公共总线编号或空间它们都使用 pci 地址域的自己的;域的编号从0到 ffff), 总线(0到 ff), 槽(0到1f)和函数(0到7).每个组件的设备地址可以省略或为"*",这意味着"任何值".所有数字都是十六进制的例如,"0 :0"表示在总线上的所有设备."0"表示任何总线上所有设备的函数0 ,"-"在所有总线和设备的选择第三函数0".4"第四条函数中的每个设备.
d[<供应商>]:[<设备>]
仅显示与指定的设备供应商和设备 id .既是十六进制,并给出可能省略或给定 id 的"*",这意味着"任何值".
其他选项

i<文件>
使用<文件>作为 list instead of /usr/share/hwdata/pci.ids. pci id .
p<文件>
使用<文件>作为 map 的 pci id 由内核模块处理.缺省情况下,使用 lspci /lib/modules/kernel_version/modules.pcimap. 仅以使用最新的 linux 系统有足够的模块工具.
M
所有 pci 设备的总线映射模式后者将执行彻底的扫描,然后调用包括配置桥后面的那些 ,etc .此选项会产生有意义的结果只有一个直接的硬件的访问模式,这通常需要 root 特权.请注意,仅扫描 pci 总线 mapper 的0. 版本
lspci :应使用此选项单独使用.
pci 访问选项

pci 公用事业的 pci / pci 设备(看到pcilib(7)有关细节).可以使用以下选项来配置其行为: A<方法>
这个库支持各种方法来访问 pci 硬件.缺省情况下,它的使用方法.但可以使用此选项将替代此决策.有关可用方法的列表及其说明.
O=<值>
库的行为是由若干命名的参数.此选项允许将任意长度的值.使用o帮助的列表参数及其默认值的列表.
h1
使用直接通过 intel 硬件访问配置机制2.(这是一个简写为 intel conf1 .)
h3
使用直接通过 intel 硬件访问配置机制2.(这是一个简写为 intel conf2 .) F<文件>
访问真实的硬件.读取列表中的设备和它们的配置寄存器的值从给定的文件先前产生的运行 lspci 的x为用户提供的 bug 报告的分析,这是非常有用的因为可以显示的硬件配置中的任何方式而 disturbing 用户请求有关储.
G
增大调试级别的库.
机器读取输出
(m , vm ,vmm)本节中所述的lspci的所有其它格式在版本之间可能更改.

所有数字都始终显示十六进制.如果您想要处理的名称,请添加n开关的数值 id .

简单格式(m)

在简单格式.每个设备在单独一行.它适合于传递给 shell 脚本的参数格式.即 ,whitespaces 分隔的值.如果有必要,引号和转义.其中一些参数传递:插槽,类,供应商名称、设备名称、子系统供应商名称和子系统名称(为空,如果设备没有最后两个子系统);其余参数是选项如下: rrev
修订版号. pprogif
编程接口.
的相对顺序传递参数和选项的.在以后的版本,则可添加新选项但它们将始终具有单个参数未由任何空格隔开的选项,如果无法识别,这样他们可以很容易地忽略.
详细的格式(vmm)

verbose 输出空白行分隔的记录序列."对的值.在标记和值之间通过单个 tab 字符.存的记录行中的一个记录是按任何特定的顺序.标记的大小写敏感.
定义了下列标记: 插槽
在设备所在的插槽([domain:]bus:device.function)此标记将始终首先在一个记录.
类
类的名称.
供应商
供应商的名称.
设备
设备的名称. svendor
该子系统供应商名称(optional).
sdevice
子系统的名称(optional).
physlot
在设备所在的物理插槽(optional, linux 只).
修订版
修订版号(optional).
progif
编程接口(optional).
driver
内核当前处理设备驱动程序(optional, linux 只).
模块
kernel module 报告它能够处理设备(optional, linux 只). 新的标记分组,也可以将在未来版本,因此您应该忽略任何标记您无法识别.
向后兼容模式(vm)

在此模式下, lspci 可以尝试完美兼容旧版本.它几乎相同的常规模式.但是设备标记是用于在插槽和设备名,因此,它在单个记录中发生两次请避免使用此格式的任何新代码.
文件
/usr/share/hwdata/pci.ids

所有的 pci id 的列表.(供应商、设备、类和子类的).维护一个  http://pciids.sourceforge.net/ ,使用 pciids 工具来下载最新版本的更新.
/usr/share/hwdata/pci.ids.gz
如果使用压缩的支持,这个文件编译的 lspci pci.ids. 之前
~/ .pciidscache
所有 id 在缓存 dns 查询模式在此文件中找到.
bugs
有时, lspci 无法对配置寄存器完全解码.此错误发生时没有足够的文档的作者可用的.在这种情况下,它至少打印 标记对信号有潜在的有关的东西说.如果您知道细节,补丁当然欢迎.

仅由 linux_sysfs 后端访问当前支持的扩展空间,

参见
setpci(8),更新 pciids(8), pcilib(7)

作者
The PCI Utilities are maintained by Martin Mares < mj@ucw.cz > .

引用
dstat (1), ctl 中引? (8), lshw (1), lsusb (8), 过程 (5), usbview (8)

 

 

 

 

 

 

posted @ 2022-03-25 23:28  jinzi  阅读(3393)  评论(0编辑  收藏  举报