5

Ubuntu Linux コンピューター (Ubuntu 10.04.1、カーネル 2.6.32-25-386) に複数の USB 大容量ストレージ フラッシュ ドライブを接続しており、それらをプログラムで (可能であれば bash から) 区別する必要があります。 - どのブロックデバイスがどの物理デバイスに対応するかを見つける必要があります (例/dev/sdb1-> USB ポート 1 のデバイス; 私の場合、1 つのデバイス ~ 1 つのボリューム)。

つまり、3 つのハードウェア デバイスが USB ポートに接続されていることがわかっています。それらのそれぞれは、システム内で USB 大容量ストレージ デバイス (lsusb で見られるように) として表示され、ブロック デバイスとして作成され ( /dev/sdb1)、UUID によって自動マウントされます ( /media/1234-5678)。

USB device               block device    mountpoint
USB device in port 2.2 <-> /dev/sdb1   <-> /media/1234-5678

ブロック デバイスとマウントポイントの関係を見つけようとしているわけではありません。ブロックデバイスと USB デバイスの関係を見つけようとしていますが、方法はありますか?

なんで?ディスクにはいくつかの書き込みがあり、完了するまでの時間は予測できません。オペレーターに「ポート 2 (左から 2 番目) のディスクを取り外せるようになりました」などの指示を出す必要があります。その特定のマシンのどのポート番号にどの物理ポートが対応しているかがわかったので、マウントポイントからブロック デバイスを見つけるのは簡単です。今、論理USBポートをブロックデバイスにマッピングするのに行き詰まっています。

lsusb でディスクを確認できます:

Bus 001 Device 058: ID 067b:2517 Prolific Technology, Inc. Mass Storage Device
Bus 001 Device 060: ID 067b:2517 Prolific Technology, Inc. Mass Storage Device
Bus 001 Device 061: ID 067b:2517 Prolific Technology, Inc. Mass Storage Device

そして、それらが(UUIDで)マウントされているのを見ることができます:

/dev/sdb1 on /media/BC88-15C4 type vfat
/dev/sdc1 on /media/AE54-65AA type vfat
/dev/sdd1 on /media/58D2-FED1 type vfat

現在、すべてのドライブは同じメーカーの同じモデルであるため、それらを区別することはできません。また、特定の順序で接続されることを保証することもできません。

(USB デバイスのリスト)を見つけまし/sys/bus/usb/devicesたが、lsusb から取得したデータと同じようです。そこにディスクへのマッピングが表示されません。

/sys/block/sdband /sys/block/sdb/sdb1(ブロックデバイスとその最初のパーティション; 同様にsdcand )もありますsddが、ここでもデバイスへのマッピングは見られません。

4

4 に答える 4

9

これが実装されたカーネルバージョンはわかりませんが、/sys/block/*エントリはデバイスへのシンボリックリンクです。

つまり、/sys/block/sdb別のディレクトリへのシンボリックリンクであり、その名前にはUSBデバイスIDが含まれています。

$ file /sys/block/sdb
/sys/block/sdb: symbolic link to `../devices/pci0000:00/0000:00:02.1/usb1/1-1/1-1.1/1-1.1:1.0/host31/target31:0:0/31:0:0:0/block/sdb'
                                                  USB version and port here---^^^^^

これ1-1.1は興味深い部分であり、を示してusb1-port 1.device 1います。ハブに接続すると、別のレベルが追加されます:1-2.3.1、を示しusb1-port 2.port 3.device 1ます。

擬似コード:

get partition name # e.g. /dev/sdb1
get disk name # that would be /dev/sdb
get your basename # sdb
see where /sys/block/$your_basename points to # e.g. ../devices/blah/blah/1-2.1/blah
get the longest substring matching "\d-\d+(.\d+)*"  # e.g. 1-2.1
that is the device id you want
/sys/bus/usb/devices/$device_id/ has all kinds of information about it
the ID corresponds to hardware USB ports

bashで動作するサンプルスクリプト

于 2010-10-07T12:54:59.833 に答える
1

私はパスを使用します:

/sys/bus/usb/drivers/usb-storage/4-1:1.0/host4/target4:0:0/4:0:0:0/block/sda

USB バス 4、ポート 1 が USB ストレージ /dev/sda に接続されていることがわかります。

于 2014-04-09T09:05:19.253 に答える
-1

これが私のやり方です。

lsusb -vは、すべてのデバイスのディスクがiserial番号を取得していることを示しています。

 ls -l /dev/disk | grep [iserial] 

のすべて/dev/diskがシンボリックリンクであるため、シンボリックリンクをたどってデバイスを確認してください。

于 2012-10-22T21:44:31.340 に答える
-1

ディスクラベルは使えないのですか? http://ubuntuforums.org/showthread.php?t=322973

于 2010-10-07T12:23:45.947 に答える