/proc/bus/pci/devices 各个域的意义

本文介绍如何从/proc/bus/pci/devices文件中解析PCI设备信息。该文件为每一台PCI设备提供了一行记录,包括总线号、设备号、供应商/设备ID、IRQ编号、内存基址寄存器(MEMBAR)及其长度等信息。

    /* 
     ** The way to parse the PCI bus info from the /proc/bus/pci/devices
     **
     ** That file contains one line for each device.
     **
     ** Each line contains the following fields delimited by white space:
     **
     ** 0201      -- [02] bus number, [01] devfn
     ** 8086105e  -- vendor/device
     ** 11        -- IRQ
     ** cfc00004  -- MEMBAR 0 including control IO vs. MEM info
     ** 00000000  -- MEMBAR 1
     ** 00000000  -- MEMBAR 2
     ** 00000000  -- MEMBAR 3
     ** 0000c001  -- MEMBAR 4
     ** 00000000  -- MEMBAR 5
     ** 00000000  -- MEMBAR 6
     ** 00020000  -- MEMBAR 0 length
     ** 00000000  -- MEMBAR 1 length
     ** 00000000  -- MEMBAR 2 length
     ** 00000000  -- MEMBAR 3 length
     ** 00000020  -- MEMBAR 4 length
     ** 00000000  -- MEMBAR 5 length
     ** 00000000  -- MEMBAR 6 length
     ** e1000     -- driver name, optional
     */ 

<think>嗯,用户这次的问题是:如何在sys/bus/pci目录下查看NVMe设备。用户引用了三段资料,但似乎有些偏离主题。用户真正需要的是在sys文件系统中定位NVMe设备的实用方法。 用户可能正在调试NVMe设备的热插拔问题,或者需要确认设备链接状态。从引用[1]提到的power控制来看,用户或许有热插拔需求。用户能提供具体引用说明ta已查阅过相关资料,但需要更精准的指导。 回看历史记录,之前讨论过通过/sys/bus/pci/slots操作热插拔,这次需要先定位设备位置。解决方案需满足: 1. 准确获取PCI路径 2. 区分不同NVMe设备 3. 提供人类可读的设备标识符 准备采用分步方案:先通过lspci过滤NVMe控制器,这是最权威的方法;再用设备路径反向匹配sysfs路径。用户可能不熟悉PCI设备命名规则,需要强调0000:xx:xx.x格式的含义。另外补充/proc/mounts检查可避免用户误操作已挂载设备。 考虑到用户要写shell脚本,专门增加脚本示例,把设备名称和槽位号关联起来。引用[3]恰好展示了设备符号链接的格式,可以借此说明路径结构。最后提醒用户注意root权限和热插拔风险——毕竟直接操作系统文件可能引发故障。 用户的问题质量不错,能聚焦到sysfs的具体路径,说明ta有Linux设备管理基础。不过引用资料里混用了不同方法,可能需要帮ta梳理优先级:lspci官方工具最可靠,sysfs遍历次之。 </think>在 Linux 的 `/sys/bus/pci/` 目录下查看 NVMe 设备,可通过以下步骤操作: ### 方法 1:通过 PCI 设备路径定位 1. **列出所有 PCI 设备路径** 终端执行: ```bash ls -l /sys/bus/pci/devices/ ``` 输出示例(含 NVMe 设备): ``` lrwxrwxrwx 1 root root 0 Jun 10 10:00 0000:01:00.0 -> ../../../devices/pci0000:00/0000:00:1c.0/0000:01:00.0 ``` 2. **筛选 NVMe 控制器** 设备路径中的 `0000:01:00.0` 是 PCI 地址格式(`:总线:设备.功能`)。NVMe 设备通常包含 `nvme` 标识: ```bash ls -l /sys/bus/pci/devices/*/nvme* ``` 或直接检查设备类(Class): ```bash lspci -d ::0108 # 0108 是 NVMe 控制器设备类代码 ``` --- ### 方法 2:从块设备反向追溯 1. **获取 NVMe 块设备名** ```bash ls /sys/class/block | grep nvme # 示例输出:nvme0n1 ``` 2. **追溯 PCI 地址** ```bash readlink -f /sys/class/block/nvme0n1/device/device # 关键步骤 ``` 输出将指向 PCI 设备路径(如 `.../0000:01:00.0`) --- ### 方法 3:使用 `lspci` 工具 ```bash lspci | grep -i nvme ``` 输出示例: ``` 01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller XXX ``` 其中 `01:00.0` 即为设备在 `/sys/bus/pci/devices/` 中的目录名。 --- ### 关键目录结构说明 定位到设备目录(如 `/sys/bus/pci/devices/0000:01:00.0`)后: - **设备信息**:`vendor`, `device`, `class` 文件 - **驱动绑定**:`driver` 符号链接指向所用驱动(如 `nvme`) - **热插拔控制**:`remove` 文件(写入 `1` 移除设备)[^1] - **槽位号**:通过 `physical_slot_index` 文件获取(需主板支持热插拔) > ️ **注意**:直接操作 `/sys` 文件需管理员权限,移除设备前务必卸载文件系统: > ```bash > umount /dev/nvme0n1p1 # 卸载分区 > echo 1 > /sys/bus/pci/devices/0000:01:00.0/remove # 移除设备 > ``` --- ### 自动化脚本示例 ```bash #!/bin/bash for nvme_dev in $(ls /sys/class/block | grep nvme); do pci_path=$(readlink -f /sys/class/block/$nvme_dev/device/device) pci_addr=$(basename "$pci_path") echo "NVMe设备 $nvme_dev → PCI地址: $pci_addr" echo "SysFS路径: /sys/bus/pci/devices/$pci_addr" done ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值