web-dev-qa-db-ja.com

物理デバイスを接続した場合、どのデバイスファイルがそれに属しているかをどうやって知ることができますか?

自動的にマウントされないいくつかのUSBドライブを接続するとします。どのデバイスファイルがどの物理デバイスに属しているかを確認して、たとえばマウントする方法を教えてください。

私はMacOS Xを実行していますが、すべての(または少なくとも最も人気のある)Unixシステムで機能する答えが好きです。私は過去にLinuxでこの問題を抱えていました。

13
rightfold

Udevの使用:

udevをクエリすることで有用な情報を入手できます(それを使用するシステムでは-ほとんどすべてのデスクトップタイプのLinuxは確実です)。たとえば、接続されているどのドライブが/dev/sdbに関連付けられているかを知りたい場合は、次を使用できます。

udevadm info --query=property --name=sdb

シリアル(ID_SERIAL_SHORT)を含む、そのデバイスのプロパティのリストが表示されます。その情報があれば、lsusb -vの出力を見て、製造元や製品名などを見つけることができます。

これを行うためのより短いパスは

udevadm info --query=property --name=sdb | grep "\(MODEL_ID\|VENDOR_ID\)"

lsusbのはるかに短い出力で$ID_VENDOR_ID:$ID_MODEL_IDと一致する行を参照してください。

もう1つの便利なオプションはudevadm monitorです。作成されたデバイスノードを知りたい場合に使用しますデバイスを接続する時点で。だから最初の実行

 udevadm monitor --udev --subsystem-match=block

そして、デバイスを接続します。検出されたブロックデバイス(ディスク/パーティション)のデバイス名が各出力行の最後に印刷されます。

シェル関数の実用例:

.bashrc(または.zshrc)に挿入できる関数は次のとおりです。

 listusbdisks()
 {
 [["x $ 1" == "xv"]] && shift && local VERBOSE = -v 
 for dsk in $ { @-/ dev/sd?} 
 do 
/sbin/udevadm info --query = path --name = "$ dsk" | grep --colour = auto -q usb || continue 
 echo "===== device $ dsk is:" 
(eval $(/ sbin/udevadm info --query = property --name = "$ dsk" | grep "\ (MODEL\| VENDOR \)_ ID ")
 [" $ ID_VENDOR_ID:$ ID_MODEL_ID "==": "] && echo"不明 "||\
 lsusb $ VERBOSE -d" $ ID_VENDOR_ID :$ ID_MODEL_ID "
)
 grep -q" $ dsk "/ proc/mounts && echo" ----- DEVICE IS MOUNTED ---- "
 echo 
 done 
} 

このように使用してください:

  • listusbdisks-すべての/dev/sdxデバイスを認識します。
  • listusbdisks sdbまたはlistusbdisks /dev/sdbまたはlistusbdisks sdb sdc-特定のデバイスに関する情報のみを取得します。
  • listusbdisks -v [optional devices as above]-lsusbの詳細な出力を表示します

[編集]:多くのデバイスのクエリ、マウントのチェック、lsusbの冗長性の制御などの機能を追加しました。

14
rozcietrzewiacz

普遍的な答えはありません。 Linuxで最も簡単な方法は、おそらくgnome diskユーティリティを起動することです。マウントされているかどうかに関係なく、検出されたすべてのディスクが表示されます。コマンドラインから、blkidまたはudevadm info --export-dbの出力を確認できます。

3
psusi

Mac OS Xではdiskutil list

3
x1a0

すべてのUnixに関して、これは実現可能ではないと思います。

今日の通常の外部バスは、IDEのように、ポートに固定の番号付けスキームを使用していません。したがって、必要なマッピングの残りのデータソースは、ドライブの製造元名、シリアル番号のみです。番号またはパーティションのUID。

製造元の名前は、特定のマシンで必ずしも一意である必要はありません(同じシリーズの2つの外部ドライブを接続するとします-それらは同じように識別されます)。シリアル番号は、パーティションUIDのように、「外部からは見えません」。

したがって、私が考えることができる唯一の普遍的な解決策については、物理ドライブにシリアル番号のラベルを付け、UDEVが利用可能な場合はrozcietrzewiaczの回答にあるudevadmコマンドを使用することです。

1
jstarek