2012-02-02 64 views
2

基本上我需要驗證USB驅動器是否連接到某個USB端口。我有以下幾點:BASH根據PCI ID找到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 = RED

我不知道如何匹配/檢查這種關係。任何幫助將不勝感激。

答案:感謝您的幫助。

#!/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" 

回答

3

這是我會怎麼做我的系統上:

第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從你的閃存驅動器的路徑回PCI橋和USB子系統。

步驟3:上述從鏈接目標隔離(在這種情況下00:1a.7)PCI總線ID和lspci檢查:

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

如有疑問,檢查lspci輸出視覺...

編輯:

這裏是自動進行的凝固酶原極爲原油和極其脆弱的方式SS之上:

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. 如果您有不同的設備佈局,它可能會中斷,但您應該可以爲此進行調整。

+0

我需要完全自動化該過程。你是否說過以上3個步驟可以自動化並且在沒有視覺檢查的情況下放在一起? – bing281 2012-02-02 23:46:55

+0

@ bing281:好吧,它們可以是自動的,但'/ sys'佈局偶爾會在新內核中發生變化。爲什麼你需要這樣做? – thkala 2012-02-02 23:48:31

+0

我需要驗證某些路徑是否在橋中正確編程,並且沒有任何故障。因此,我需要堅持使用3個USB棒,並使用代碼驗證它們是否位於插槽中,因爲我知道通過在內部對EEPROM芯片進行編程來分配給每個USB端口的PCI-ID – bing281 2012-02-02 23:54:20