Как определить, какой / dev является USB-накопителем?


160

Я хочу смонтировать USB-накопитель, два из них, и мне нужны две разные точки монтирования. К сожалению, ядро ​​Linux претерпело изменение имени, и я не могу понять, какое /devрасположение является правильным. Есть ли способ просмотреть dmesgили /procили где-то еще узнать, какое устройство узла является USB-накопителем.

(Я использую ArchLinux, если это поможет ... /dev/sdaэто первый жесткий диск, /dev/sr0DVD-привод и т. Д.)

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


1
Не можете увидеть это? Может быть, немного подождать. Или попробуйте другой порт USB. Посмотрите, какие различия есть в «lsusb»
— Ник Деверо

Возможно, стоит перефразировать вопрос - ведь не все USB-устройства являются дисками.
— Арафангион

3
Команда dfпоказывает вам, где он был установлен
— Уилл Шеппард

Ответы:


83

Самый простой способ: посмотреть на выход dmesgпосле подключения USB-устройства. Он должен показать вам, какой /devузел был ему назначен.


2
dmesgпрекрасно работает, но у меня есть случай, когда dmesgне показывает /devузел: [421963.864281] usb 3-6: new high-speed USB device number 32 using xhci_hcdчто это значит? Как я могу установить это устройство? Устройство появляется на lsusb...
— modulitos

1
На самом деле, я понял это. Со времени моей последней перезагрузки произошло обновление ядра, которое вызывало эту проблему. После перезагрузки мой usb монтируется просто отлично. Надеюсь, это кому-нибудь поможет!
— модуль

54

Пока вы используете udev , вы можете легко сделать это, сославшись на / dev / disk / by-id / usb- имя- производителя _ serialnumber . Они отображаются в виде символических ссылок, на которые вы можете либо напрямую ссылаться в вашем fstab, либо на которые вы можете разыменовать, используя readlink -e, чтобы определить соответствующее блочное устройство.

Вот пример из реального мира. На моей машине подключено 3 жестких диска USB. Каждый из них отображается в / dev / disk / by-id с уникальными серийными номерами (хотя они имеют общую строку производителя). Я создал символические ссылки на каждую из этих трех уникальных записей и теперь могу быстро определить, какой диск есть (и какое устройство связано с каждым диском), запустив readlink -e linkname . Например, при запуске readlink -e / root / disk2 на моем компьютере в настоящий момент отображается « / dev / sde », в то время как readlink -e / root / disk3 ничего не выводит.


15
Коротко и просто:for devlink in /dev/disk/by-id/usb*; do readlink -f ${devlink}; done
— Фелипе Алькасибар

54

Все это хорошие предложения, но самый быстрый и наименее подробный метод - просто набрать в терминале следующее:

mount

который выдаст список всех подключенных устройств (предполагается, что подключен USB-накопитель, что обычно имеет место в современных дистрибутивах Linux).


5
Нет, это не волшебным образом монтирует ваше устройство. Вы должны указать это с mount /dev/id /mount/point, так что это не работает.
— полим

9
Мой ответ направлен на вопрос пользователя: «Есть ли способ просмотреть dmesg или / proc или где-то еще, чтобы узнать, какой узел устройства является USB-накопителем?», И не предназначен для предоставления рекомендаций по практичности монтирования накопителя под Linux. ,
— AnotherLongUsername

Этот ответ решил для меня почти идентичный вопрос.
— Мэтью Браун или Лорд Мэтт

1
Я думаю, что поведение автомонтирования во многом зависит от типа дистрибутива.
— jiggunjer

1
dfтоже, наверное.
— Алексей

24

Попробуйте команду udevinfo -q all -n /dev/sda, где /dev/sdaнаходится путь к вашему диску. Это дает вам множество информации о диске, который вы просматриваете - есть запись, которая сообщает вам о шине, к которой он подключен.

Это, конечно, избавляет вас от необходимости просматривать dmesg и / или логи.

Обновить

udevadm info --query=all -n /dev/sda 

По крайней мере, с июля 2010 года [ 1 ] udevinfo был заменен в Debian (и производным) udevadm infoнебольшим переходным процессом, с которым вскоре были удалены и удалены символические ссылки (их все еще можно найти на старой, не обновленной машине). Всегда из [ 1 ] мы можем прочитать:

В udev 117 udevadmбыла введена udevinfoи другие программы, превращенные в символьные ссылки совместимости. Символические ссылки устарели в udev 128 и навсегда удалены в udev 147 .


8
В Debian udevinfoпереименован udevadm.
— Стив Померой

8
В Ubuntu команда выглядит так: «udevadm info --query = all -n / dev / sda»
— machineghost

Я полагаю, что они переименовали команду в какой-то момент - когда я написал ответ (давным-давно), команда работала в системе Ubuntu, из которой я ее опубликовал;)
— Eltariel

Команда работает до сих пор в Ubuntu,udevadm info --query=all -n /dev/ttyUSB1
— Сиддхарт

1
udevadm info --query=all -n /dev/ttyUSBв федоре тоже.
— СЛМ

22

Самый простой способ увидеть, что происходит - просто набрать (конечно же, с правами root):

blkid -c /dev/null

это дает вам полный обзор обо всех блочных устройствах, даже если они не установлены


Не все дистрибутивы имеют это. Что вы использовали?
— Новая Александрия

Это ничего не выводит на мой дистрибутив Raspbian.
— Игорь Ганапольский

Команда не найдена: blkid
— Игорь Ганапольский

Нет выходных данных этой команды в 64-битной Ubuntu 14.04.
— gbmhunter

11

/dev/disk/by-* это самый простой способ в этом случае, если по какой-то причине вы хотите сделать жизнь более интересной, вы можете использовать HAL.

Чтобы перечислить все устройства, которые вы используете:

hal-device

Чтобы получить конкретное свойство, которое вы используете (это вернется /dev/sd*на USB-накопитель):

hal-get-property --udi $UDI --key block.device

Существует также:

hal-find-by-capability
hal-find-by-property

Если вы хотите сделать его еще более сложным, вы можете относительно легко написать себе автоматический монтировщик на основе HAL , что может быть очень удобно, если вы хотите полностью автоматизировать процесс.

И просто для полноты есть также:

lsusb -v
lshw

Который предоставляет общую информацию о USB и вашем оборудовании в целом.


2
/ dev / disk / by-id / * usb * очень полезен.
— Роб

/ dev / disk / по метке ftw. Спасибо :)
— Триптих

10
sudo fdisk -l

И просто проанализируй результат.


1
Страница справочника fdisk "Если устройства не указаны, используются те, которые указаны в / proc / partitions (если таковые существуют)." Запуск fdisk может быть невозможным ... Исходя из того, что я знаю, что на одной системе Debian она не установлена, я полагаю, что некоторые системы GPT могут не устанавливать ненужное программное обеспечение. Тем не менее, проверка / proc / partitions должна быть опцией.
— TOOGAM

Это был единственный вариант, который работал хорошо для меня. Извините, если это не сработало для вас!
— Фелипе

8

использование

ls -l /dev/disk/by-id/usb*

В соответствии с правилами udev по умолчанию, это покажет вам большинство USB-устройств и символическую ссылку на их имя блочного устройства в системе.

Если это не сработает, посмотрите /dev/disk/by-id/прямо.


6

Для USB-устройств вы можете просто сделать

REMOVABLE_DRIVES=""
for _device in /sys/block/*/device; do
    if echo $(readlink -f "$_device")|egrep -q "usb"; then
        _disk=$(echo "$_device" | cut -f4 -d/)
        REMOVABLE_DRIVES="$REMOVABLE_DRIVES $_disk"
    fi
done
echo Removable drives found: "$REMOVABLE_DRIVES"

1
+1. Простой и лаконичный скрипт для выполнения задачи автоматически.
— leesei

2

Посмотрите на дерево под /dev/disk. В нем перечислены диски и их разделы (файловые системы) по различным схемам.


2

/ var / log / message, если dmesg больше не имеет информации.


0

Если вы отключите USB-накопитель и снова подключите его, вы должны увидеть, как он инициализируется из ядра (dmesg)


0

На основании превосходного ответа от stormlash и зависимости от udev для заполнения дерева устройств "/ dev / disk / by-id / usb" вы можете определить предикат (Bash) следующим образом:

is_usb_device() {
    local device_path=$1        # such as /dev/sdc
    for devlink in /dev/disk/by-id/usb*; do
        if [ "$(readlink -f "$devlink")" = "$device_path" ]; then
            return 0
        fi
    done
    return 1
}

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

if is_usb_device "/dev/sdg"; then
    echo "/dev/sdg is a usb device"
else
    echo "/dev/sdg is not a usb device"
fi
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.