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

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

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

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

13 ответов

Решение

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

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

mount

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

Пока вы используете 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 ничего не выводит.

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

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

Обновить

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

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

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

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

blkid -c /dev/null

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

sudo fdisk -l

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

/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 и вашем оборудовании в целом.

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

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

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

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

Для 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"

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

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

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

На основании превосходного ответа от 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
Другие вопросы по тегам