Приносим извинения, если это дубликат.
У меня есть 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