Как определить, какой /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
это дает вам полный обзор обо всех блочных устройствах, даже если они не установлены
/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
, В нем перечислены диски и их разделы (файловые системы) по различным схемам.
Если вы отключите 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