Saturday, December 9th, 2006 01:24 pm
Например, у вас есть внешний USB HDD и внешняя же флэшка. В зависимости от того, в каком порядке их втыкать, у них будут разные имена. Например, у одного /dev/sda, у другого /dev/sdb. Или наоборот. Что еще хуже, диск может быть разбит на разделы, и у него надо монтировать /dev/sd?1, а флэшка используется вся целиком, как дискета, и у нее надо монтировать собственно /dev/sd?.
Или, скажем, сетевые карты при загрузке обнаруживаются в разном порядке, и получается, что eth1 - это иногда wifi, а иногда firewire. А иногда наоборот.
В результате настраивать точки монтирования или параметры сетевых интерфейсов становится очень неудобно. Но есть выход.

Подключаем диск, смотрим в /var/log/messages, как его нынче назвали. Предположим, sda. И на нем есть раздел sda1.
Запускаем
# udevinfo -a -p /sys/block/sda/sda1

и видим что-то вроде:
  looking at device '/block/sda/sda1':
    KERNEL=="sda1"
    SUBSYSTEM=="block"
    DRIVER==""
    ATTR{stat}=="      89      178        0        0"
    ATTR{size}=="195366402"
    ATTR{start}=="63"
    ATTR{dev}=="8:1"

Выбираем из этой кучки параметров что-нибудь достаточно уникальное. Например, размер.
Создаем файл /etc/udev/rules.d/10_local.rules, в который пишем
KERNEL=="sd?1", SUBSYSTEM=="block", ATTR{size}=="195366402", SYMLINK+="usbdisk"

Проверяем:
# udevtest /sys/block/sda/sda1

Если в выдаче есть строчка
udev_node_add: creating symlink '/dev/usbdisk' to 'sda1'

значит, все хорошо. Если не появилась, ищем ошибку в параметрах проверки.
Перегружать машину после этого не обязательно, правила начинают действовать сразу. Достаточно отключить диск и подключить его обратно - и магическим образом появится /dev/usbdisk, который отныне можно смело использовать в /etc/fstab.

Для дисков, которые используются целиком, без разбивки на разделы (типично для флэшек с FAT), удобно проверять ATTRS{vendor}, ATTRS{model}, ATTRS{rev} и другие более уникальные вещи, чем размер.

То же самое можно делать и для сетевых карт - у них уникальным параметром является MAC-адрес. Учтите, что в правилах для udev буквы в мак-адресах надо писать маленькими, тогда как ifconfig показывает их большими.
Например:
KERNEL=="eth*", SYSFS{address}=="00:0b:5d:xx:xx:xx", NAME="lan"
KERNEL=="eth*", SYSFS{address}=="00:0e:35:xx:xx:xx", NAME="wlan"
KERNEL=="eth*", SYSFS{address}=="00:00:0e:10:01:xx:xx:xx", NAME="eth1394"

Отныне проводной интерфейс всегда будет называться lan, wifi-интерфейс - wlan, а firewire - eth1394, и они больше не перепутаются.

А еще можно при повялении девайса выполнять некоторые команды, например, поднимать bluetooth'ный интерфейс, если он почему-то не поднимается сам.
KERNEL=="hci*", RUN+="/usr/sbin/hciconfig %k up"
.
Ну и так далее - аудиокарты, принтеры, фотокамеры...

А как в такой же ситуации явно назначить букву для диска или точку монтирования в Windows - я не знаю.
Tags:
Saturday, December 9th, 2006 01:31 pm (UTC)
А как в такой же ситуации явно назначить букву для диска или точку монтирования в Windows — я не знаю

Винда, как обычно, всё делает сама ;)
В Disk Management назначить нужному устройству нужную букву, при следующем подключении она будет ему молча выдаваться. Например, постоянно используемая USB-флэшка у меня висит на K:, и потому с временно подключаемыми флэшками, плеером и прочей фигнёй никак не интерферирует — им винда даёт первую свободную букву (F:).
Saturday, December 9th, 2006 01:45 pm (UTC)
вообще-то есть еще такая штука, как UUID и LABEL для дисковых устройств..
но в целом, спасибо, да - у меня руки не доходили почитать FM на эту тему
Saturday, December 9th, 2006 02:43 pm (UTC)
Во, а можно я задам вопрос на засыпку? Есть handspring visor (это такой древний палм). При нажатии на кнопку синхронизации он создает два usb устройства (например, /dev/ttyUSB0 & /dev/ttyUSB1 или /dev/ttyUSB1 & /dev/ttyUSB2 - если ttyUSB0 уже был занят). Так вот вопрос, как сделать так, чтобы /dev/pilot линковался именно на _второе_ из этих устройств?
Saturday, December 9th, 2006 06:52 pm (UTC)
В случае с современными дистрами все гораздо проще. Смотрим label диска и в fstab вместо /dev/sda1 например пишем LABEL=WesternDisk как у меня :)
Sunday, December 10th, 2006 05:06 am (UTC)
Осталось придумать "что-нибудь достаточно уникальное" для других USB-устройств.
USB-to-Serial, например.
Sunday, December 10th, 2006 10:07 pm (UTC)
то почему строем не ходиш то может объяснишь мне, из-за чего может быть такая засада? довольно часто происходит так: usb накопитель включил, устройство в dev появилось, но пока в него не ткнёшься чем нибудь - не появляются устройства под разделы. Ну т.е. /dev/sda есть, а /dev/sda1 - нет. И пока, например, mount /dev/sda не сделаешь - и не появится.
Wednesday, December 13th, 2006 02:19 am (UTC)
1) diskpart

2) diskmgmt.msc

3) Для экстремалов :
HKLM\SYSTEM\MountedDevices

( http://support.microsoft.com/?kbid=307844 )