November 2019

S M T W T F S
      12
34 5 678 9
10111213141516
17181920212223
24252627282930

Style Credit

Expand Cut Tags

No cut tags
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:
Sunday, December 10th, 2006 03:22 pm (UTC)
О, ура, нашел!

< SYSFS{dev}=="188:0"
---
> SYSFS{dev}=="188:1"

Так что различить можно!
Sunday, December 10th, 2006 05:23 pm (UTC)
Меня терзают смутные сомнения, что это атрибут не самого девайса, а порядковый номер aka minor, назначенный драйвером.
То есть, различить-то их, понятное дело, можно, но определить, что конкретно этот - второй от пальма - нельзя.
Можно попробовать извратиться с запуском внешнего скрипта, который будет следить за количеством девайсов.. udev так тоже может
Sunday, December 10th, 2006 05:52 pm (UTC)
Не, хочется без внешних скриптов. Чиста на рулезах.
Sunday, December 10th, 2006 05:55 pm (UTC)
В общем, я выдал в файлы usb0 & usb1 результат udevinfo на два tty, созданные визором. И вот что вижу в дифф:

svu@sputnik:~$ diff usb0 usb1
8,9c8,9
< looking at device '/class/tty/ttyUSB0':
< KERNEL=="ttyUSB0"
---
> looking at device '/class/tty/ttyUSB1':
> KERNEL=="ttyUSB1"
11c11
< SYSFS{dev}=="188:0"
---
> SYSFS{dev}=="188:1"
13,14c13,14
< looking at device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1:1.0/ttyUSB0':
< ID=="ttyUSB0"
---
> looking at device '/devices/pci0000:00/0000:00:1d.0/usb1/1-1/1-1:1.0/ttyUSB1':
> ID=="ttyUSB1"
Sunday, December 10th, 2006 06:18 pm (UTC)
Это понятно. Я к тому, что если в момент подключения визора /dev/ttyUSB0 уже существовал, то у новых ttyUSB1 и ttyUSB2 SYSFS{dev} будут уже не :0 и :1, а :1 и :2. И правило добавления симлинка накроется медным тазом. И это, кажется, неизлечимо, потому что у этих девайсов ничего уникального нету.
Sunday, December 10th, 2006 06:49 pm (UTC)
Правда, молодцы работают в компании Palm?:) Это не хэндспрингсовские штучки, это палм придумал такую жудь.

А какие мысли будут по поводу скрипта?
Tuesday, December 12th, 2006 10:36 pm (UTC)
Попробовать запоминать время появления предыдущего аналогичного девайса, и если нынешний почвился вскорости после предыдущего, то приделывать к нему имя /dev/pilot
Tuesday, December 12th, 2006 10:48 pm (UTC)
Да, мысль понятна. хотя как-то гниловато, эвристики какие-то левые... А вообще как в файл с рулезами прописать скрипт?
Tuesday, December 12th, 2006 10:58 pm (UTC)
PROGRAM="/bin/foo %k", SYMLINK+="%c{1}", GROUP="%c{2}"

Параметром туда передается ядреное имя девайса, а на выходе скрипт должен сгенерировать последовательность слов, разделенных пробелами. на которые потом можно ссылаться как %c{i}
Tuesday, December 12th, 2006 11:25 pm (UTC)
Не богато. Но, по идее, достаточно. В общем, небольшая проблема только в том, что надо хранить где-то состояние между запусками foo.
Wednesday, December 13th, 2006 08:02 am (UTC)
Ну да, а я других вариантов не вижу, если у самих девайсов ничего уникального нет. Придется запоминать внешние факторы.
Wednesday, December 13th, 2006 08:08 am (UTC)
Как я их нэнавижу! Нэнатуралы. Даже нокию с ее mrouter, наверное, нэнавижу меньше.
Sunday, December 10th, 2006 07:21 pm (UTC)
Да, про то, что это всего лишь последовательность minor я как-то мощщно стормозил.