【问题标题】:BASH find which port a USB drive is attached to by the PCI IDBASH 通过 PCI ID 查找 USB 驱动器连接到哪个端口
【发布时间】:2012-02-10 08:05:06
【问题描述】:

基本上我需要验证 USB 驱动器是否连接到某个 USB 端口。我有以下内容:

USB 驱动器被虚拟标记:

  • 白、绿、红

我有 3 个带有物理标签的 USB 端口:

  • 白、绿、红

使用 BLKID 我可以接收来自驱动器的信息,例如

BLKID Example
/dec/sdb1: SEC_TYPE="msdos" LABEL="WHTIE" UUID="78FE-870D" TYPE="vfat"

因此,我只知道标签就对驱动器本身了解很多。现在我使用 LSPCI 我可以获取有关 USB 端口的信息,因为我知道每个网桥的 ID。例如:

LSPCI Example
0a.00.0 USB Controller: some info 4d88

所以最后一部分 4d88 是 PCI ID。

所以我知道每个端口的 PCI ID,需要将它们与 USB 驱动器本身匹配,例如:

  • 4d88 = 白色
  • 4dC0 = 绿色
  • 4d84 = 红色

我不知道如何匹配/检查这种关系。任何帮助将不胜感激。

回答:感谢所有帮助。

#!/bin/bash

#variables
error="ERROR : Incorrect Command use 'usb_pci.sh'"
pci="USB PCI Check Successful"

errorstatus_white_pci="ERROR : USB PCI FAILED : WHITE Drive"
errorstatus_green_pci="ERROR : USB PCI FAILED : GREEN Drive"
errorstatus_red_pci="ERROR : USB PCI FAILED : RED Drive"

pci_check_white=4dc9
pci_check_green=4d81
pci_check_red=4dc5

#Takes USB label and gets /sys/block/sd?
echo "checking path for USB Label" 
path_white=$(blkid | grep WHITE | cut -d : -f 1 | sed 's|[0-9]*$||; s|^/dev/|/sys/block/|')
echo "white: "$path_white
path_green=$(blkid | grep GREEN | cut -d : -f 1 | sed 's|[0-9]*$||; s|^/dev/|/sys/block/|')
echo "green: "$path_green
path_red=$(blkid | grep RED | cut -d : -f 1 | sed 's|[0-9]*$||; s|^/dev/|/sys/block/|')
echo "red: "$path_red

#Takes /sys/block/sd? and gets PCI Path xx:xx.x
echo "checking path to PCI path" 
pci_path_white=$(ls -l ${path_white} | xargs | cut -d / -f 8 | cut -b 6-13)
echo "white: "$pci_path_white
pci_path_green=$(ls -l ${path_green} | xargs | cut -d / -f 8 | cut -b 6-13)
echo "green: "$pci_path_green
pci_path_red=$(ls -l ${path_red} | xargs | cut -d / -f 8 | cut -b 6-13)
echo "red: "$pci_path_red

#Takes xx:xx.x and gets the PCI Device ID xxxx
echo "checking PCI path to PCI Device ID" 
pci_device_id_white=$(lspci -s ${pci_path_white} | tail -c -5)
echo "white: "$pci_device_id_white
pci_device_id_green=$(lspci -s ${pci_path_green} | tail -c -5)
echo "green: "$pci_device_id_green
pci_device_id_red=$(lspci -s ${pci_path_red} | tail -c -5)
echo "red: "$pci_device_id_red

#check if pci_device_id_xxxx = pci_check_xxxx
echo "checking PCI Device ID equals what it should" 
if [ $pci_device_id_white = $pci_check_white ] ; then
    echo "WHITE USB PCI Check Successful"
else
    echo $errorstatus_white_pci
    exit 1
fi
if [ $pci_device_id_green = $pci_check_green ] ; then
    echo "GREEN USB PCI Check Successful"
else
    echo $errorstatus_green_pci
    exit 1
fi
if [ $pci_device_id_red = $pci_check_red ] ; then
    echo "RED USB PCI Check Successful"
else
    echo $errorstatus_red_pci
    exit 1
fi
echo $pci
exit 0

编辑:

根据请求的 lspci、lsusb、blkid 转储。

lspci
00:00.0 Host bridge: Intel Corporation Unknown device 0104 (rev 09)
00:02.0 VGA compatible controller: Intel Corporation Unknown device 0126 (rev 09)
00:16.0 Communication controller: Intel Corporation Unknown device 1c3a (rev 04)
00:19.0 Ethernet controller: Intel Corporation 82579LM Gigabit Network Connection (rev 04)
00:1a.0 USB Controller: Intel Corporation Unknown device 1c2d (rev 04)
00:1b.0 Audio device: Intel Corporation Unknown device 1c20 (rev 04)
00:1c.0 PCI bridge: Intel Corporation Unknown device 1c10 (rev b4)
00:1c.2 PCI bridge: Intel Corporation Unknown device 1c14 (rev b4)
00:1c.3 PCI bridge: Intel Corporation Unknown device 1c16 (rev b4)
00:1c.5 PCI bridge: Intel Corporation Unknown device 1c1a (rev b4)
00:1d.0 USB Controller: Intel Corporation Unknown device 1c26 (rev 04)
00:1f.0 ISA bridge: Intel Corporation Unknown device 1c4f (rev 04)
00:1f.2 RAID bus controller: Intel Corporation Mobile 82801 SATA RAID Controller (rev 04)
00:1f.3 SMBus: Intel Corporation Unknown device 1c22 (rev 04)
08:00.0 PCI bridge: Integrated Device Technology, Inc. PES4T4 PCI Express Switch (rev 0e)
09:02.0 PCI bridge: Integrated Device Technology, Inc. PES4T4 PCI Express Switch (rev 0e)
09:03.0 PCI bridge: Integrated Device Technology, Inc. PES4T4 PCI Express Switch (rev 0e)
09:04.0 PCI bridge: Integrated Device Technology, Inc. PES4T4 PCI Express Switch (rev 0e)
0a:00.0 USB Controller:  Unknown device 4d88
0a:00.1 USB Controller:  Unknown device 4dc9
0a:00.2 System peripheral:  Unknown device 4dca
0a:00.3 Communication controller:  Unknown device 4d8b
0b:00.0 USB Controller:  Unknown device 4dc0
0b:00.1 USB Controller:  Unknown device 4d81
0b:00.2 System peripheral:  Unknown device 4d8e
0b:00.3 Serial controller:  Unknown device 4dcf
0c:00.0 USB Controller:  Unknown device 4d84
0c:00.1 USB Controller:  Unknown device 4dc5
0c:00.2 System peripheral:  Unknown device 4dc6
0c:00.3 Communication controller:  Unknown device 4d87
0d:00.0 SD Host controller: O2 Micro, Inc. Unknown device 8221 (rev 05)
0d:00.1 Mass storage controller: O2 Micro, Inc. Unknown device 8231 (rev 03)

lsusb
Bus 004 Device 001: ID 0000:0000  
Bus 006 Device 001: ID 0000:0000  
Bus 005 Device 001: ID 0000:0000  
Bus 001 Device 002: ID 8087:0024  
Bus 001 Device 001: ID 0000:0000  
Bus 007 Device 001: ID 0000:0000  
Bus 008 Device 001: ID 0000:0000  
Bus 003 Device 003: ID 0718:063d Imation Corp. 
Bus 003 Device 001: ID 0000:0000  
Bus 002 Device 002: ID 8087:0024  
Bus 002 Device 004: ID 0a5c:5800 Broadcom Corp. BCM5880 Secure Applications Processor
Bus 002 Device 001: ID 0000:0000  
Bus 002 Device 003: ID 413c:3012 Dell Computer Corp. Optical Wheel Mouse

blkid
/dev/mapper/VolGroup00-LogVol01: TYPE="swap" UUID="6b361baf-08ae-4f2c-933b-5028c15b6fb5" 
/dev/mapper/VolGroup00-LogVol00: UUID="d15840ac-0073-483d-b630-7d2a497eaac9" TYPE="ext3" 
/dev/sda1: LABEL="/boot" UUID="39331b93-a08d-45b5-b1ea-fcc6586be7bd" TYPE="ext3" 
/dev/VolGroup00/LogVol00: UUID="d15840ac-0073-483d-b630-7d2a497eaac9" TYPE="ext3" 
/dev/VolGroup00/LogVol01: TYPE="swap" UUID="6b361baf-08ae-4f2c-933b-5028c15b6fb5" 
/dev/sdb1: SEC_TYPE="msdos" LABEL="WHITE" UUID="78FE-870D" TYPE="vfat" 
/dev/sdc1: SEC_TYPE="msdos" LABEL="GREEN" UUID="61FE-B32E" TYPE="vfat" 
/dev/sdd1: SEC_TYPE="msdos" LABEL="RED" UUID="E5DB-4A1A" TYPE="vfat" 

【问题讨论】:

    标签: linux bash usb label pci


    【解决方案1】:

    这就是我在我的系统上的做法:

    第一步:找到设备节点:

    # blkid | grep MyDisk
    /dev/sdj1: LABEL="MyDisk-0" UUID="4876-5945" TYPE="vfat" 
    

    设备节点为/dev/sdj1

    第 2 步: /sys 是你的朋友:

    # ll /sys/block/sdj
    lrwxrwxrwx 1 root root 0 Feb  3 00:40 /sys/block/sdj -> ../devices/pci0000:00/0000:00:1a.7/usb1/1-2/1-2:1.0/host15/target15:0:0/15:0:0:0/block/sdj/
    

    上面的符号链接目标包含许多有用的信息,包括从闪存驱动器通过 SCSI 和 USB 子系统返回 PCI 桥的路径。

    第 3 步: 从上面的链接目标中分离出 PCI 总线 ID(在本例中为 00:1a.7)并检查 lspci

    # lspci | grep 00:1a.7
    00:1a.7 USB Controller: Intel Corporation 82801JI (ICH10 Family) USB2 EHCI Controller #2
    

    如有疑问,请目视检查lspci 输出...

    编辑:

    这是一种极其粗糙且极其脆弱的自动化上述过程的方法:

    blkid |
        grep Label |
        cut -d : -f 1 |
        sed 's|[0-9]*$||; s|^/dev/|/sys/block/|' |
        xargs readlink |
        cut -d / -f 4 |
        xargs -n 1 lspci -s
    

    注意:这适用于我的系统,但绝不安全(或推荐):

    1. 如果内核更新更改了 /sys 文件系统的布局,它将中断。

    2. 如果您有不同的设备布局,它可能会中断,但您应该能够对此进行调整。

    【讨论】:

    • 我需要完全自动化这个过程。你是说上面 3 个步骤可以自动化并放在一起而无需目视检查?
    • @bing281:嗯,它们可以自动化,但/sys 布局偶尔会在较新的内核中发生变化。为什么你需要这样做?
    • 我需要验证某些路径是否在桥中正确编程并且没有任何故障。因此,我需要插入 3 个 USB 记忆棒并验证它们在插槽中的代码,因为我知道通过内部编程 EEPROM 芯片为每个 USB 端口分配了什么 PCI-ID
    • 您能否使用lspcilsusb 的完整输出来编辑您的问题?我已经看到所有 USB 端口都通过一个集线器在同一个控制器上的嵌入式目标......
    • 奇怪的是,即使我使用上面的编辑代码以 root 身份运行,我也会被拒绝。
    猜你喜欢
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-19
    • 2020-03-19
    • 2013-08-06
    相关资源
    最近更新 更多