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)

 

 

 

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM