Как определить, какой / 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.