web-dev-qa-db-ja.com

USBデバイス-> Ubuntuでデバイスマッピングをブロックしますか?

ただし、これが重複している場合はお詫び申し上げます。

USB大容量記憶装置が2つあり、どの物理デバイスがブロックデバイスにマップされているかを把握できる必要があります。

両方が常に存在するわけではないので、固定ブロックのデバイスパスだけに頼ることはできません。

lsusbからデバイスパスを決定しようとしましたが、それはデバイス情報を提供するだけです。

 Bus 001 Device 016:ID 0781:​​5406 SanDisk Corp. Cruzer Micro 1/2/4GB Flash Drive 
 Bus 001 Device 015:ID 4971:ce23 SimpleTech 

Sudo fdisk -lは、truecryptで暗号化されたボリュームとしてパーティションを読み取ることができません。

どの物理デバイスがブロックデバイスにマップされているかを検出する方法はありますか?

どれがどれかがわかるまで、ファイルシステムをマウントできません。

私はこの問題に間違った方法でアプローチしましたか?

助言がありますか ?

2
Bovril

物理デバイスは両方とも同じサイズですか?それらもまったく同じブランドですか?

サイズが異なる場合は、fdisk -lは、ヘッダーにディスク全体のサイズとブロックデバイス名を表示する必要があります。これは役に立ちます。

dmesgの出力を確認することもできます。 USBデバイスが接続されると、dmesgは、USBデバイスをオンラインにするために実行するプロセスと、割り当てられたブロックデバイスを表示します。出力例は次のとおりです。

Aug 14 16:35:02 xen kernel: [2526561.710931] usb 5-5: new high speed USB device using ehci_hcd and address 4
Aug 14 16:35:02 xen kernel: [2526561.859909] usb 5-5: configuration #1 chosen from 1 choice
Aug 14 16:35:02 xen kernel: [2526562.138808] usbcore: registered new interface driver libusual
Aug 14 16:35:02 xen kernel: [2526562.162072] Initializing USB Mass Storage driver...
Aug 14 16:35:02 xen kernel: [2526562.163248] scsi4 : SCSI emulation for USB Mass Storage devices
Aug 14 16:35:02 xen kernel: [2526562.163452] usbcore: registered new interface driver usb-storage
Aug 14 16:35:02 xen kernel: [2526562.163455] USB Mass Storage support registered.
Aug 14 16:35:07 xen kernel: [2526567.161157] scsi 4:0:0:0: Direct-Access     WDC WD50 00AAKS-00A7B0         PQ: 0 ANSI: 2 CCS
Aug 14 16:35:07 xen kernel: [2526567.171712] sd 4:0:0:0: [sdb] 976773168 512-byte hardware sectors (500108 MB)
Aug 14 16:35:07 xen kernel: [2526567.172736] sd 4:0:0:0: [sdb] Write Protect is off
Aug 14 16:35:07 xen kernel: [2526567.173733] sd 4:0:0:0: [sdb] 976773168 512-byte hardware sectors (500108 MB)
Aug 14 16:35:07 xen kernel: [2526567.174606] sd 4:0:0:0: [sdb] Write Protect is off
Aug 14 16:35:13 xen kernel: [2526567.174616]  sdb: sdb1
Aug 14 16:35:13 xen kernel: [2526572.854493] sd 4:0:0:0: [sdb] Attached SCSI disk
Aug 14 16:35:13 xen kernel: [2526572.854544] sd 4:0:0:0: Attached scsi generic sg2 type 0

ご覧のとおり、カーネルは/ dev/sdbをUSBデバイスに割り当てました。お役に立てれば!

1
vmfarms

同じベンダーのデバイスが複数ある場合はどうすればよいのでしょうか:製品ID。

udevadm info -a /dev/sdeを実行してみました。これは、「親デバイスのチェーンをたどる」(それが何を意味するのか)。 「ATTRS {devnum}」と「ATTRS {busnum}」をバスXデバイスYの出力lsusbと照合することで、udevadmリストがUSBハードのバス番号とデバイス番号を生成しただけでなく、ブロックデバイス/dev/sdeの「親」としてドライブするだけでなく、接続されているハブのバス番号とデバイス番号、およびホストコントローラー!これは、接続先のポートでデバイスを識別したい場合に役立ちます。

特定のブロックデバイスに対応するUSB​​デバイスを取得するのが非常に難しいように思われる理由について少し混乱しました。これにより、デバイスが同じではなく、2つの間に一種の親孝行関係があることが明らかになると思います。 。

Udevadmは各親のパスを提供するので、子パスをトリミングして正しい親を見つける方法がわかります。

$ udevadm info --path=$(udevadm info -q path /dev/sde | cut -d / -f 1-7)
P: /devices/pci0000:00/0000:00:1d.7/usb2/2-2/2-2.4
N: bus/usb/002/024
E: BUSNUM=002
E: DEVNAME=/dev/bus/usb/002/024
E: DEVNUM=024
E: DEVPATH=/devices/pci0000:00/0000:00:1d.7/usb2/2-2/2-2.4
E: DEVTYPE=usb_device
E: DRIVER=usb
E: ID_BUS=usb
E: ID_MODEL=External_HDD
....

DEVNAMEをlsusbに渡すことができます。

$ lsusb -D $(udevadm info --path=$(udevadm info -q path /dev/sde
    | cut -d / -f 1-7) | grep DEVNAME | cut -d = -f 2)
Device: ID 1058:0705 Western Digital Technologies, Inc. My Passport Elite (WDML)
Couldn't open device, some information will be missing
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
...

したがって、これを使用して、たとえば、/ dev/sdeがUSB2.0デバイスとして接続されていることを知ることができます(上記のbcdUSBラインから)。

これがあなたの質問に答えるかどうかはわかりませんが、ブロックデバイスからUSBデバイスを識別する方法を提供します。また、コントローラーとデバイスの間にハブがない場合は、「カット」に別の引数を指定する必要があると思うため、完全ではありません。おそらく、デバイスパスの最初ではなく最後から数える必要がありますが、数値引数をdirnameに渡す方法が見つかりませんでした。

更新:これは、zshを使用してデバイスパスの最後からコンポーネントをトリミングするソリューションです。それが機能するかどうかをお知らせください。

$ cat usb-device-from-block-device
#!/bin/zsh                         
udevadm info --path ${${$(udevadm info -q path $1)}%/*/*/*/*/*/*} | grep DEVNAME | cut -d = -f 2

# Example:
$ usb-device-from-block-device /dev/sdc
/dev/bus/usb/001/017
$ lsusb -D $(usb-device-from-block-device /dev/sdc)
...
1
Metamorphic

Sysfsにクエリを実行して、ドライブのベンダーとモデルを報告できます。

$ cat /sys/block/sdd/device/{vendor,model}
DSE     
MicroDrive 1GB  

$ cat /sys/block/sdc/device/{vendor,model}
JetFlash
Transcend 4GB   

それ以上のことをしたい場合は、udevルールを追加して(Linuxディストリビューションにudevがあると仮定して)、さまざまなドライブをさまざまなデバイス名にマップしたり、ドライブモデルに基づいてさまざまなシンボリックリンクを提供したりできます。

EG、 ここ いくつかの例があります。

トランセンドスティックを挿入したときに実際に作成される実際のデバイスに、必要に応じてパーティション番号を追加して、/ dev/transcendシンボリックリンクを作成するために次のようなことを行うことができます。

KERNEL=="sd*", SUBSYSTEMS=="scsi", ATTRS{model}==\ 
 "Transcend 4GB", SYMLINK+="transcend%n"

もちろん、同じモデルの複数のデバイスを入れると衝突が発生しますが、少しの作業でそれを回避できます

0
Daniel Lawson

UUID中心の答えを見たことがないので、ここに1つあります。

そのデバイスにファイルシステムがある場合、そのファイルシステムにはUUIDがあります。このUUIDを使用すると、フラッシュドライブがシステム上にあるデバイスのメジャー/マイナーブロックデバイスに関係なく、ファイルシステムを確実にマウントできます。

lsblk -fを使用すると、どのデバイスがどのUUID /ファイルシステムに接続されているかを簡単に表示できます。以下は私のシステムの例で、私の単一のNVMeドライブからの素敵な記述ツリーを示しています。この質問のフラッシュドライブは、おそらくはるかに単純な出力を提供します。

[dhay@GLaDOS ~]$ lsblk -f
NAME              FSTYPE      LABEL       UUID                                   MOUNTPOINT
nvme0n1                                                                          
├─nvme0n1p1       vfat        ESP         F2F6-9BC7                              /boot/efi
├─nvme0n1p2                                                                      
├─nvme0n1p3       crypto_LUKS             abde2123-0ee9-46b5-8d05-2b0b91b21054   
│ └─syspvluks     LVM2_member             ZsBxHH-tvRz-xE3k-e2dJ-I0O0-Gv4e-Ckap71 
│   ├─system-root xfs         root        a3acf72b-3309-408e-b6a4-0c3f28b86a53   /
│   └─system-swap swap        swap        5006f803-af24-4179-a5fa-7c5720b383d2   [SWAP]
├─nvme0n1p4       ntfs        WINRETOOLS  A0B0BED5B0BEB0E0                       
├─nvme0n1p5       ntfs        Image       D6E6BF67E6BF4711                       
├─nvme0n1p6       ntfs        DELLSUPPORT 00CED73ECED72AA4                       
└─nvme0n1p7       xfs         boot        b3e3a722-e37a-4c15-8d6c-4085c00b778a   /boot

そのUUIDが手元にあれば、何を使用しているかに関係なく、UUIDを使用してファイルシステムを識別できます。これは、構成を更新せずに、あるデバイスから別のデバイスにファイルシステムを移行する場合にも最適です。以下は、ブロックデバイスの直接カーネル名ではなく、デバイスラベル、UUID、およびLVM永続名の組み合わせを使用している/ etc/fstabファイルの例です。

/dev/mapper/system-root /                       xfs     defaults,discard       0 0
UUID=F2F6-9BC7          /boot/efi               vfat    umask=0077,shortname=winnt 0 2
/dev/mapper/system-swap swap                    swap    defaults        0 0
LABEL=boot              /boot                   xfs     defaults,discard     0 0

同様に、このmountコマンドのデバイス引数としてUUIDを使用して、ルートファイルシステムをディレクトリにマウントできます。

[dhay@GLaDOS ~]$ mount UUID=a3acf72b-3309-408e-b6a4-0c3f28b86a53 /mnt/root

0
Spooler

デバイスを接続したら、/ dev/diskにアクセスして、そこからシンボリックリンクが動的に作成されることを確認します。

[user@Host disk]$ pwd
/dev/disk
[user@Host disk]$ ll -R
.:
total 0
drwxr-xr-x 2 root root  80 Jul 30 09:54 by-id
drwxr-xr-x 2 root root  80 Jul 30 09:54 by-label
drwxr-xr-x 2 root root 160 Jul 30 09:54 by-path
drwxr-xr-x 2 root root  80 Jul 30 09:54 by-uuid

./by-id:
total 0
lrwxrwxrwx 1 root root  9 Jul 30 09:54 usb-WD_10EAVS_External_57442D574341553436313337373137 -> ../../sdb
lrwxrwxrwx 1 root root 10 Jul 30 09:54 usb-WD_10EAVS_External_57442D574341553436313337373137-part1 -> ../../sdb1

./by-label:
total 0
lrwxrwxrwx 1 root root 10 Jul 30 09:54 backup -> ../../sdb1
lrwxrwxrwx 1 root root 10 Mar  3 18:51 boot -> ../../sda1

./by-path:
total 0
lrwxrwxrwx 1 root root  9 Jul 30 09:54 pci-0000:00:1d.7-usb-0:6:1.0-scsi-0:0:0:0 -> ../../sdb
lrwxrwxrwx 1 root root 10 Jul 30 09:54 pci-0000:00:1d.7-usb-0:6:1.0-scsi-0:0:0:0-part1 -> ../../sdb1
lrwxrwxrwx 1 root root  9 Mar  3 18:51 pci-0000:00:1f.1-ide-0:0 -> ../../hda
lrwxrwxrwx 1 root root  9 Mar  3 18:51 pci-0000:02:0e.0-scsi-0:2:0:0 -> ../../sda
lrwxrwxrwx 1 root root 10 Mar  3 18:51 pci-0000:02:0e.0-scsi-0:2:0:0-part1 -> ../../sda1
lrwxrwxrwx 1 root root 10 Mar  3 18:51 pci-0000:02:0e.0-scsi-0:2:0:0-part2 -> ../../sda2

./by-uuid:
total 0
lrwxrwxrwx 1 root root 10 Mar  3 18:51 72734cea-d59d-443b-8fdd-3e7a0e2c7731 -> ../../sda1
lrwxrwxrwx 1 root root 10 Jul 30 09:54 efcb8d1e-3f46-4021-bc55-22a85846429b -> ../../sdb1
[user@Host disk]$ 

お役に立てれば。

0
ztron