Назад | Перейти на главную страницу

USB-устройство -> отображение блочного устройства на Ubuntu?

Приносим извинения, если это дубликат.

У меня есть 2 запоминающих устройства USB, и мне нужно определить, какое физическое устройство сопоставляется с блочным устройством.

Они не всегда присутствуют одновременно, поэтому я не могу полагаться только на фиксированный путь к блочному устройству.

Я пытался определить путь к устройству из 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.

Есть ли способ определить, какое физическое устройство сопоставлено с блочным устройством?

Я не могу смонтировать файловую систему, пока не знаю, что есть что.

Я подошел к этой проблеме неправильно?

Какие-либо предложения ?

Мне было интересно, что делать в случае, когда есть несколько устройств с одним и тем же поставщиком: идентификаторы продуктов.

Я пробовал бежать udevadm info -a /dev/sde, который «идет вверх по цепочке родительских устройств» (что бы это ни значило?). Путем сопоставления "ATTRS {devnum}" и "ATTRS {busnum}" с выходом Bus X Device Y lsusb, Я мог видеть, что список udevadm не только выдал номера шины и устройства для жесткого диска USB как «родительского» блочного устройства. /dev/sde, но также номера шины и устройств концентратора, к которому он был подключен, а также хост-контроллера! Это может быть полезно, если вы хотите идентифицировать устройство по порту, к которому оно подключено.

Я был немного сбит с толку, почему так сложно получить USB-устройство, соответствующее данному блочному устройству, и я думаю, это немного проясняет ситуацию: устройства не совпадают, между ними есть своего рода сыновние отношения. .

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 подключен как устройство USB 2.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)
...

Оба физических устройства одинакового размера? Они одного и того же бренда?

Если они разных размеров, fdisk -l должен показать вам размер всего диска в заголовке вместе с именем блочного устройства, что должно вам помочь.

Вы также можете проверить вывод dmesg. Когда подключено USB-устройство, dmesg отобразит процесс, через который он проходит, чтобы подключить его к сети, а также покажет вам назначенное ему блочное устройство. Вот пример вывода:

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-устройству. Надеюсь это поможет!

Вы можете запросить sysfs, чтобы сообщить о производителе и модели диска:

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

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

Если вы хотите пойти дальше, вы можете добавить правила udev (при условии, что в вашем дистрибутиве linux есть udev), чтобы сопоставить разные диски с разными именами устройств или предоставить другую символическую ссылку на основе модели диска.

НАПРИМЕР, Вот есть несколько примеров.

Я мог бы сделать что-то подобное, чтобы создать символическую ссылку / dev / transcend с добавленными номерами разделов, где это необходимо, для любого реального устройства, фактически созданного, когда я вставляю свой Transcend стик:

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

Конечно, если я поставлю несколько устройств одной модели, произойдет столкновение, но немного поработав, вы можете обойти это

После подключения устройства вы можете посетить / 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]$ 

Надеюсь это поможет.

Я не видел ответа, ориентированного на UUID, поэтому вот один:

Если у вас есть файловая система на этом устройстве, у этой файловой системы есть UUID. Вы можете использовать этот UUID для надежного монтирования файловой системы, независимо от того, какое основное / второстепенное блочное устройство используется в системе.

Вы можете легко отобразить, какое устройство использует UUID / файловую систему с помощью lsblk -f. Ниже приведен пример из моей системы, который показывает красивое описательное дерево моего единственного диска 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 под рукой, вы можете идентифицировать файловые системы с его помощью независимо от того, что они используют. Это также отлично подходит для переноса файловой системы с одного устройства на другое без необходимости обновления какой-либо конфигурации. Ниже приводится пример моего файла / etc / fstab, в котором вместо прямых имен ядра для блочных устройств используется комбинация меток устройств, UUID и постоянных имен LVM:

/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

Точно так же я могу использовать UUID в качестве аргумента устройства в этом mount команда для монтирования моей корневой файловой системы в каталог:

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