Topics で読み物として読む
この HLD は実装詳細を含みます。機能の概念・設定・運用を読み物として読みたい場合は Topics 14 章: Platform / Port / Optics を参照。
裏取りステータス: code-verified
sonic-platform-common/sonic_platform_base/sonic_pcie/ に pcie_base.py(抽象 PcieBase)と pcie_common.py(共通実装)を確認。sonic-platform-daemons/sonic-pcied/ に PCIe 監視デーモン(pcied)も存在。本ページの設計(pcie.yaml をリファレンスとした PCIe デバイス検査と pcie_generate で yaml 自動生成)は実装に取り込み済み。HLD は改訂日付が無く Open Questions のまま終わっているが、実コードは安定している。
pcieutil / show platform pcieinfo(PCIe デバイス検査と pcie.yaml 比較)¶
概要¶
SONiC スイッチ上の PCIe デバイス(NIC / Bridge / Root Port 等)が 本来あるべきトポロジ から欠落していないかを検査するためのツール群を追加する HLD。プラットフォーム標準の PCIe デバイス一覧を pcie.yaml に焼いておき、起動時や運用中に実際の lspci 相当出力と比較してハードウェア異常を検知する1。
提供される CLI は 3 コマンド1:
| CLI | 用途 |
|---|---|
show platform pcieinfo |
現在の PCIe デバイス情報を表示 |
show platform pcieinfo -c (--check) |
期待構成 (pcie.yaml) と比較し pass/fail を出力 |
pcieutil pcie_generate |
現在の PCIe 情報から pcie.yaml を生成 |
pcie_generate は 誤上書きを避けるため show platform pcieinfo 経由では呼べず、pcieutil を直接使う1。
動作仕様¶
コンポーネント階層¶
flowchart LR
CLI1[show platform pcieinfo] --> SUB["show/main.py の platform サブコマンド"]
SUB --> PU[pcieutil CLI]
PU --> PC["sonic_platform_base/sonic_pice/pcie_common.py"]
PC --> YAML[("device/<platform>/plugins/pcie.yaml")]
PC --> KERNEL["/sys/bus/pci 等"]
show/main.py の platform メニューに pcieinfo 項目を追加し、内部的に pcieutil [pcie_show|pcie_check] を実行する1:
show 形 |
pcieutil 形 |
|---|---|
show platform pcieinfo |
pcieutil pcie_show |
show platform pcieinfo --check |
pcieutil pcie_check |
show platform pcieinfo -c |
pcieutil pcie_check |
pcie_generate は show 経由では呼ばない。これは pcie.yaml 上書き防止のための意図的な分離1。
pcieutil の実装¶
新ユーティリティ sonic-utilities/pcieutil/ がデバイスプラグイン pcie_common.py を import して使う。共通 API1:
| 関数 | 動作 |
|---|---|
get_pcie_device() |
現在の PCIe デバイス一覧を返す |
get_pcie_check() |
現在の一覧と pcie.yaml の比較結果を返す。pcie.yaml 不在ならシステムエラーで終了 |
dump_conf_yaml() |
現在の PCIe 情報から pcie.yaml を生成 |
実装パスは sonic_platform_base/sonic_pice/pcie_common.py(HLD 原文どおり、ディレクトリ名スペル sonic_pice のまま)1。
設定ファイル pcie.yaml¶
各プラットフォーム配下に置く1:
YAML の形式(list of mapping)1:
- bus: '00'
dev: '00'
fn: '0'
id: 1f0c
name: 'Host bridge: Intel Corporation Atom processor C2000 SoC Transaction Router'
- bus: '00'
dev: '01'
fn: '0'
id: 1f10
name: 'PCI bridge: Intel Corporation Atom processor C2000 PCIe Root Port 1'
各エントリは bus / dev / fn / id / name を保持する。get_pcie_check() は同じキー集合で実機側と突合する。
📋 検証エビデンス: sonic-net/SONiC/doc/pcie-mon/pcieinfo_design.md#L36-L78 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
出典:
sonic-net/SONiC/doc/pcie-mon/pcieinfo_design.md#L36-L78 (sha: 49bab5b5ff0e924f1ea52b3d9db0dfa4191a7c06)
抜粋:
Common API ... get_pcie_device(), get_pcie_check(), dump_conf_yaml()
Config file Location: device/Platform/plugins/pcie.yaml
判断根拠: API シグネチャと設定ファイル配置の根拠。
出力例¶
$ show platform pcieinfo
==============================Display PCIe Device===============================
bus:dev.fn 01:00.0 - dev_id=0xb960, Ethernet controller: Broadcom Limited Device b960
bus:dev.fn 01:00.1 - dev_id=0xb960, Ethernet controller: Broadcom Limited Device b960
$ show platform pcieinfo -c
===============================PCIe Device Check================================
Error: [Errno 2] No such file or directory:
'/usr/share/sonic/device/x86_64-cel_seastone-r0/plugins/pcie.yaml'
Not found config file, please add a config file manually,
or generate it by running [pcieutil pcie_generate]
$ pcieutil pcie_generate
Are you sure to overwrite config file pcie.yaml with current pcie device info? [y/N]: y
generate config file pcie.yaml under path /usr/share/sonic/device/x86_64-cel_seastone-r0/plugins
$ show platform pcieinfo -c
===============================PCIe Device Check================================
PCI Device: Ethernet controller: Broadcom Limited Device b960 ------------------ [Passed]
PCI Device: Ethernet controller: Broadcom Limited Device b960 ------------------ [Passed]
PCIe Device Checking All Test ----------->>> PASSED
設定¶
関連する CONFIG_DB / YANG¶
該当しない。pcie.yaml はプラットフォーム同梱ファイルであり CONFIG_DB / YANG 経路は持たない。
関連する CLI¶
| CLI | 詳細 |
|---|---|
show platform pcieinfo |
pcieutil pcie_show を実行 |
show platform pcieinfo -c |
pcieutil pcie_check を実行。pcie.yaml と比較 |
pcieutil pcie_generate |
現状の PCIe 情報から pcie.yaml を生成(show 経由では不可) |
設定例¶
新規プラットフォーム持ち込み時の標準手順1:
制限事項¶
pcie.yaml不在でpcie_checkが即エラー終了: 新プラットフォームでは事前にpcie_generateが必要1。pcie_generateは show 経由禁止: 誤上書き防止の設計選択。スクリプト化する場合はpcieutil pcie_generateを直接呼ぶ。- PCIe トポロジの変更対応: ハード交換やリビジョン違いがあると
pcie.yamlの再生成が必要。HLD はリビジョン管理を規定していない。 - HLD は Open Questions が空のまま で打ち切られており、設計の細部(並び順比較の厳密性、エラー詳細出力等)は実装側に委ねられている1。
干渉する機能¶
- プラットフォームプラグイン (
sonic_platform_base):pcie_common.pyを経由するため、ベンダ固有の PCIe 列挙ロジック差は無く統一動作する想定。 show platform系コマンド: 同じplatformサブコマンドの兄弟(summary、syseeprom等)と共存。コマンド系の整合(オプション規約)に注意。
トラブルシューティング¶
[Errno 2] No such file or directory: pcie.yaml: 該当プラットフォームのdevice/.../plugins/にpcie.yamlが無い。pcieutil pcie_generateで生成する1。- 一部デバイスが
[Failed]: PCIe トポロジ実状と yaml の bus/dev/fn/id が合っていない。ハード交換・差し替えや、yaml の更新漏れを疑う。 pcieutil自体が見つからない:sonic-utilitiesパッケージ版が古い可能性。
コマンド例¶
PCIe デバイス情報を確認する。