1. 程式人生 > 其它 >linux系統從pci.ids檔案獲取硬體裝置詳細廠商資訊

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廠商列表

 

 

  lspci -vvx

 lspci -nn

 

在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 < [email protected] > .

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