Если я подключаю физическое устройство, как я могу узнать, какой файл устройства принадлежит ему?

13

Скажем, я подключаю несколько USB-накопителей, которые не подключаются автоматически. Как я могу узнать, какой файл устройства принадлежит какому физическому устройству, чтобы я мог, например, смонтировать его?

Я использую Mac OS X, но мне больше нравится ответ, который работает на всех (или, по крайней мере, самых популярных) системах Unix. У меня была эта проблема с Linux в прошлом.

rightfold
источник
В Linux ответ будет включать в себя udev. Итак, вы попытаетесь найти эквиваленты udev в OSX ; это приводит, в частности, к альтернативе функциональности udev в OSX и Руководстве по интерфейсу USB-устройства OSX .
Жиль "ТАК ... перестать быть злым"
В MacOSX самое простое - определить тома по их меткам. Но Жиль имеет право на идеальное решение.
Петер - Восстановить Монику

Ответы:

14

Используя 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\)"

и увидеть строку с соответствием $ID_VENDOR_ID:$ID_MODEL_IDв гораздо более коротком выводе lsusb.

Еще одна полезная опция udevadm monitor. Используйте его, если вы хотите знать, какой узел устройства создается в точке подключения устройства . Итак, первый запуск

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

А затем подключите устройство. Вы увидите имена устройств обнаруженных блочных устройств (дисков / разделов), напечатанные в конце каждой строки вывода.

Практический пример функции оболочки:

Вот функция, которую вы можете вставить в свой .bashrc(или .zshrc):

listusbdisks () 
{
    [["x $ 1" == "xv"]] && shift && local VERBOSE = -v
    для дск в $ {@ - / dev / sd?}
    делать
        / sbin / udevadm info --query = путь --name = "$ dsk" | grep --colour = auto -q usb || Продолжить
        echo "===== устройство $ 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 "----- УСТРОЙСТВО УСТАНОВЛЕНО ----"
        эхо
    сделано
}

Используйте это так:

  • listusbdisks- распознать все /dev/sdxустройства;
  • listusbdisks sdbили listusbdisks /dev/sdbили listusbdisks sdb sdc- чтобы получить информацию только об определенных устройствах;
  • listusbdisks -v [optional devices as above] - показать подробные выводы lsusb

[Редактировать]: добавлены некоторые функции, такие как запросы многих устройств, проверка монтирования и контроль многословия lsusb.

rozcietrzewiacz
источник
Достаточно верно, насколько это возможно, но не все системы используют udev.
Калеб
@Caleb True ... На самом деле, lsusbэто также дополнительная программа. Но оба чрезвычайно распространены.
rozcietrzewiacz
@rozcietrzewiacz Вопрос в основном о OSX, но udev изначально специфичен для Linux.
Жиль "ТАК - перестань быть злым"
@Gil Хорошо, правда. У меня нет опыта работы с OSX, поэтому я просто обновил свой ответ, чтобы не вводить в заблуждение.
rozcietrzewiacz
В таком случае я обычно подключаю устройство и сразу же запускаю dmesg. Но это не поможет, если устройство уже подключено и после первого подключено больше устройств. :)
Абхишек
3

Универсального ответа нет. В Linux самый простой способ - просто запустить утилиту gnome disk, и она покажет все обнаруженные диски, независимо от того, смонтированы они или нет. Из командной строки вы можете просмотреть вывод blkidили udevadm info --export-db.

psusi
источник
3

В Mac OS X вы можете попробовать использовать diskutil list.

x1a0
источник
1

Что касается всех Unix, я не думаю, что это возможно.

Обычные внешние шины сегодня не используют фиксированную схему нумерации для своих портов, как в IDE. Таким образом, единственными оставшимися источниками данных для сопоставления, которые вам нужны, являются имена производителей накопителей, их серийные номера или UID разделов.

Названия производителей не обязательно являются уникальными на данном компьютере (предположим, что вы подключаете два внешних диска из одной серии - они будут идентифицироваться одинаково). Серийные номера не «видны снаружи», как и идентификаторы разделов.

Итак, о единственном универсальном решении, которое я могу придумать, - пометить физические диски серийным номером и использовать команду udevadm, приведенную в ответе rozcietrzewiacz, если UDEV доступен.

jstarek
источник