USBストレージデバイスの一意のIDを取得する方法を考えていました。この投稿からSCSIシリアルIDを取得する方法はすでに知っています。LinuxC++でのUSBドライブのシリアル番号 この投稿では、デバイス記述子を使用してIDを取得する方法について説明しています。Linuxでデバイス記述子情報を決定するために誰かがコードを投稿できますか?
6 に答える
ls -l /dev/disk/by-id
USB では、デバイスが接続された順序によって、デバイスの「デバイス名」が変わることがあります。驚くべきことに、実際のシリアル番号を持つデバイスはほとんどありません。デバイス自体から一意の ID を取得できない場合、唯一の解決策は、接続の物理アドレスに依存することです。これの欠点は、デバイスを別の USB コネクタに接続すると、アドレスが変更されることです。
プログラムで sysfs を使用して、デバイスに関するカーネルの情報を取得できます。sysfs は、カーネルが認識するデバイスのファイル システムのような表現です。(ディスク上の実際のファイルではありません)
これを使用すると、次のことができます。 - 製品とベンダー ID でデバイス タイプを識別します。 - デバイスのシリアル番号を読み取ります (ある場合)。- USB ハブの物理接続番号を読み取る
/sys/class でデバイスのタイプを見つけることから始めることができます。この例では、USB→LPT ポートを使用しています。しかし、原則は同じです。
$ ls -l /sys/class/usbmisc
lp1 -> ../../devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5/4-1.5:1.0/usbmisc/lp1
lp2 -> ../../devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.6/4-1.6:1.0/usbmisc/lp2
uevent ファイルからデバイス名を取得します。
cat /sys/class/usbmisc/lp1/uevent
MAJOR=180
MINOR=1
DEVNAME=__usb/lp1__
/dev を追加して、開くデバイス名を取得します: /dev/usb/lp1
実際のパスを使用します: $ cd -P /sys/class/usbmisc/lp1
3 つのブランチに戻ります。
$ cd ../../../
/sys/devices/pci0000:00/0000:00:1d.0/usb4/4-1/4-1.5
このディレクトリには、デバイスに関する多くの情報が含まれています。
idProductとidVendorを使用して、デバイスの種類を一意に識別できます。
シリアルファイルがあり、一意のシリアル番号が含まれている場合は、完了です。
それ以外の場合は、物理接続を識別として使用するオプションがあります。これは、このディレクトリ名「<strong>4-1.5」です。これは物理接続に固有であり、デバイスを別のポートに接続すると、既に述べたように変更されます。
実行するsudo blkid
と、ファイルシステムを持つすべてのマウントされたデバイスの ID が一覧表示されます