Настройка UDEV: даем устройствам свои имена

Полезные советы и программы от пользователей нашего форума.

Модератор: Модераторы разделов

Ответить
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Настройка UDEV: даем устройствам свои имена

Сообщение madskull »


Оригинал

Вот меня часто спрашивают, чем udev лучше devfs, зачем он нужен и тому подобное.
Мой главный козырь - см. тему :)
Настраивая очередную железку (новый фотик), решил таки описать этот процесс.


Одно из замечательных свойств udev, на мой взгляд, это возможность создавать файлы устройств с нестандартными именами. Например, для фотокамеры - /dev/camera, для флэшки - /dev/flash и так далее, а не безличные /dev/sda1. Главный плюс: если будут подключены несколько устройств одного типа (usb-storage, например), не нужно гадать, ху из ху.
Итак:

1. Втыкаем устройство и смотрим, какой файл появился в /dev. Скажем, /dev/sdb1

2. Определяем его путь в sysfs:

Код: Выделить всё

[mage ~]# udevinfo -q path -n /dev/sdb1
/block/sdb/sdb1

3. Смотрим на "характеристики" девайса

Код: Выделить всё

[mage ~]# udevinfo -a -p /block/sdb/sdb1
... SKIP ...
follow the "device"-link to the physical device:
looking at the device chain at '/sys/devices/pci0000:00/0000:00:01.3/usb2/2-1/2-1:1.0/host8/8:0:0:0':
BUS=="scsi"
ID=="8:0:0:0"
DRIVER=="sd"
DRIVER=="sd"
SYSFS{detach_state}=="0"
SYSFS{device_blocked}=="0"
SYSFS{max_sectors}=="240"
SYSFS{model}=="QV DigitalCamera"
SYSFS{queue_depth}=="1"
SYSFS{rev}=="1000"
SYSFS{scsi_level}=="3"
... SKIP ...

Среди всей выведенной непонятной чепухи отыскиваем "индивидуальные", на наш взгляд, для девайса строки. Для моей камеры это SYSFS{model}=="QV DigitalCamera".

4. Создаем файлик /etc/udev/rules.d/00.my.rules (имя, в общем-то любое, главное, чтобы отработалось перед стандартным udev.rules) и заносим в него:

Код: Выделить всё

SYSFS{model}=="QV DigitalCamera", NAME="camera"

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

Перезапускать udev не надо, конфиги перечитываются при подключении нового девайса. В общем, man udev.

Конечно, в Сети есть и более подробные рассказки. Так что, гугль вам в помошь.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
agent-mega
Сообщения: 505
Статус: Автономный модуль
Контактная информация:

Re: Настройка UDEV: даем устройствам свои имена

Сообщение agent-mega »

Гм, полезная инфа! Обязательно воспользуюсь, спасибо!
DEBIAN & DEBIAN-BASED ONLY

Всё относительно. Объективности не существует.
Спасибо сказали:
Аватара пользователя
TuLiss
Сообщения: 1611
Статус: 01100
ОС: Gentoo,Ubuntu,MacOS X
Контактная информация:

Re: Настройка UDEV: даем устройствам свои имена

Сообщение TuLiss »

(agent-mega @ Среда, 17 Августа 2005, 15:35) писал(а):Гм, полезная инфа! Обязательно воспользуюсь, спасибо!


Обсалютно согласен =) Что еще будет интересное пиши =)
Чтение man'нов в слух ещЁ никому не помогало!...
kernel 4.2
chmod -x `which chmod`
War, war never changes...
Спасибо сказали:
vadiml
Сообщения: 446
ОС: fc12.x86_64
Контактная информация:

Re: Настройка UDEV: даем устройствам свои имена

Сообщение vadiml »

у меня с symlink'ами казус получается:
есть Logitech Coldress Desktop MX (радио мышь и клавиатура), которые при подключении через USB являются одним устройством:

Код: Выделить всё

I: Bus=0003 Vendor=046d Product=c50b Version=2100
N: Name="Logitech USB Receiver"
P: Phys=usb-0000:00:1d.0-1/input0
H: Handlers=kbd event1
B: EV=120013
B: KEY=10000 7 ff800000 7ff febeffdf ffefffff ffffffff fffffffe
B: MSC=10
B: LED=1f

I: Bus=0003 Vendor=046d Product=c50b Version=2100
N: Name="Logitech USB Receiver"
P: Phys=usb-0000:00:1d.0-1/input1
H: Handlers=kbd mouse0 event2
B: EV=17
B: KEY=ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff ffffffff 0 0 1878 d800d100 1e0000 0 0 0
B: REL=103
B: MSC=10


в 10-input.rules для них написал:

Код: Выделить всё

....
#usb keyboard
BUS="usb", SYSFS{dev}="13:65", SYSFS{idProduct}="c50b", KERNEL="event*", SYMLINK="input/keyboard_1"
#usb mouse
BUS="usb", SYSFS{idProduct}="c50b", KERNEL="mouse*", SYMLINK="input/mouse_1"
....

хотя сейчас распределяется и правильно из-за порядка инициализации, но ничего не мешает обоим symlink'ам указывать на мышь

есть соображения как их более правильно развести?
phenom x4 905e, asus m4a79 deluxe, 4 gb, ati x550, ati 4350, 2 x 17" LCD
Спасибо сказали:
Аватара пользователя
ami
Сообщения: 210
Статус: awb
ОС: FreeBSD
Контактная информация:

Re: Настройка UDEV: даем устройствам свои имена

Сообщение ami »

Спасибо за фичу. Теперь коннекчусь по /dev/courier а не по /dev/ttyS0
work: ubuntu-server (freebsd for www)
home: freebsd
Спасибо сказали:
Аватара пользователя
Malkoff
Сообщения: 29

Re: Настройка UDEV: даем устройствам свои имена

Сообщение Malkoff »

ami писал(а):
27.08.2005 17:41
Спасибо за фичу. Теперь коннекчусь по /dev/courier а не по /dev/ttyS0

Так это можно было и символической ссылкой сделать
# ln -s /dev/ttyS0 /dev/courier

А можно поподробней что из себя представляет этот udev :huh: .
Спасибо сказали:
Аватара пользователя
@leX
Сообщения: 313
ОС: Linux

Re: Настройка UDEV: даем устройствам свои имена

Сообщение @leX »

Malkoff писал(а):
06.10.2005 15:08
А можно поподробней что из себя представляет этот udev :huh: .

Информация по UDEV
Теория:
Спасибо сказали:
Аватара пользователя
Spider84
Сообщения: 79

Re: Настройка UDEV: даем устройствам свои имена

Сообщение Spider84 »

я тут пытаюсь завести DVB карту при помощи UDEV, она создаётся как /dev/dvb0.{net0,adapter0,tuner0,...}
а весь софт пытается найти её как /dev/dvb/adapter0/{net0,adapter0,tuner0,...}

Как это сделать?
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: Настройка UDEV: даем устройствам свои имена

Сообщение madskull »

Правила читали? Дистр кто будет указывать?

У меня таких устройств нету, но в Arch'е, похоже, уже все прописано, чтоб сделать так, как Вам нужно.

/etc/udev/rules.d/udev.rules:

Код: Выделить всё

KERNEL=="dvb*",     PROGRAM="/etc/udev/scripts/dvb.sh %k", NAME="%c", GROUP="video"


/etc/udev/scripts/dvb.sh:

Код: Выделить всё

#!/bin/sh -e
echo $1 | sed -e 's#^dvb\([0-9]\)\.\([^0-9]*\)\([0-9]\)#dvb/adapter\1/\2\3#'
exit 0


А если это не совсем то... зато тема для размышления есть.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
Spider84
Сообщения: 79

Re: Настройка UDEV: даем устройствам свои имена

Сообщение Spider84 »

madskull писал(а):
28.11.2005 11:07
Правила читали? Дистр кто будет указывать?

Sorry
Slackware 10
kernel 2.6.14
madskull писал(а):
28.11.2005 11:07
У меня таких устройств нету, но в Arch'е, похоже, уже все прописано, чтоб сделать так, как Вам нужно.

/etc/udev/rules.d/udev.rules:

Код: Выделить всё

KERNEL=="dvb*",     PROGRAM="/etc/udev/scripts/dvb.sh %k", NAME="%c", GROUP="video"


/etc/udev/scripts/dvb.sh:

Код: Выделить всё

#!/bin/sh -e
echo $1 | sed -e 's#^dvb\([0-9]\)\.\([^0-9]*\)\([0-9]\)#dvb/adapter\1/\2\3#'
exit 0


А если это не совсем то... зато тема для размышления есть.

в результате этого ваще все устройсва умерли и я ели поднял систему.

То что у меня сейчас:
/etc/udev/rules.d/dvb.rule

Код: Выделить всё

KERNEL="dvb*", PROGRAM="/etc/udev/scripts/dvb.sh %k", NAME="%c"


/etc/udev/scripts/dvb.sh

Код: Выделить всё

#!/bin/sh
/bin/echo $1 | /bin/sed -e 's,dvb\([0-9]\)\.\([^0-9]*\)\([0-9]\),dvb/adapter\1/\2\3,'


и это даёт эффект описыный выше.
Я немного не понимаю принципа udev и этого скрипта. понятно, что при обнаружении dvb* он запускат скрипт с параметром этот самый dvb*, а что скрипт должен дать на выходе?
Должна ли папка /dev/dvb существовать или udev её сам создаст? Может стоит добавить

Код: Выделить всё

mkdev /dev/dvb
mkdev /dev/dvb/adapter0

?
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: Настройка UDEV: даем устройствам свои имена

Сообщение madskull »

В общем-то, достаточно почитать man udev, чтобы понять, что происходит.

Общий принцип работы udev:
При появлении устройства, ulev берет "ядреное" название устройства (напр. ttyUSB8). И вместо него создает файл устройства /dev/tty/USB8, руководствуясь строкой правил в rules. Это в простейшем случае.

Если используется PROGRAM=..., то udev создает файл устройства, имя которого возвращает скрипт (из stdout скрипта).

Все каталоги и файлы udev создает сам.
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
Poor Fred
Сообщения: 1575
Статус: Pygoscelis papua
ОС: Gentoo Linux, FreeBSD

Re: Настройка UDEV: даем устройствам свои имена

Сообщение Poor Fred »

У меня какая-то проблема с монтированием. Раньше флешку и камеру монтировал через /dev/sda1 и файловая система в fstab была auto. Теперь пытаюсь /dev/camera (как выше описано). Но auto не прокатывает, а если указать vfat, msdos - mount: /dev/camera is not a block device.

Мопс 3.1/ядро 2.6.14.

Или я чего-то не догоняю, как с udev обращаться?

P.S. С флешкой та же ерунда.

Все, разобрался или почти разобрался. Включил в ядре все, что касается USB и эмуляции SCSI.
Убить всех человеков!
Спасибо сказали:
Аватара пользователя
Docent
Сообщения: 216

Re: Настройка UDEV: даем устройствам свои имена

Сообщение Docent »

Suse
Что делать если устройства в базе udevdb нет. Я хочу чтобы мой модем был не /dev/ttyLTM0, а /dev/modem.
При выпонении команды об определении пути устройства пишет, что его нет в базе данных, что мне делать вэтом случае? Как его прописать туда? Где брать характеристики устройства?
Спасибо сказали:
Аватара пользователя
aivs
Сообщения: 67

Re: Настройка UDEV: даем устройствам свои имена

Сообщение aivs »

Здрасте, спасибо за мануал.
У меня интересная ситуация, не зню прям как и сделать.
Есть плеер, одна память внутренняя, а другая флэш, в /dev/ понимается как sda и sdb.
Посмотрел инфу о них udevinfo -a -p /block/sdX, и они почти абсолютно идентичны, т.е. не могу в rules.d сделать 2 запись о 2 флэшках. Разная инфа только вот SYSFS{iodone_cnt}=="0x4", но при каждом переплаге, значение меняется, такчто в rules не пропишешь.
Подскажите как быть?

Дистр ArchLinux 0.7.1
kernel 2.6.15
Archlinux
Спасибо сказали:
Аватара пользователя
madskull
Сообщения: 1019
Статус: Экс-металлюга
Контактная информация:

Re: Настройка UDEV: даем устройствам свои имена

Сообщение madskull »

Docent
Найти как создается этот самый /dev/ttyLTM0, скопировать строку в свой rules и добавить команду SYMLINK.
Вот только что-то мне кажется, что в Suse это не получится...

aivs
Может поэкспериментировать с созданием своего скриптика, который бы вызывался по PROGRAM и делал все что нужно?
ArchLinux / IceWM
Спасибо сказали:
Аватара пользователя
Docent
Сообщения: 216

Re: Настройка UDEV: даем устройствам свои имена

Сообщение Docent »

2madskull

Спасибо. Так и сделал теперь работает. :)
Спасибо сказали:
Аватара пользователя
aivs
Сообщения: 67

Re: Настройка UDEV: даем устройствам свои имена

Сообщение aivs »

Подскажите как udev создает 2 разных устройства которые почти идентичны, откуда он инфу берет? Может скриптик и накатаю. Если есть готовые скрипты по опрделению устройств и подключению их, поделитесь пожалуйста.
Archlinux
Спасибо сказали:
slava68
Сообщения: 29

Re: Настройка UDEV: даем устройствам свои имена

Сообщение slava68 »

Если я правильно понял, udev работает только с ядром 2.6? А с 2.4 это невозможно? Спасибо.
Спасибо сказали:
Аватара пользователя
Thoth
Сообщения: 432
Статус: Хорошему коту и в декабре март.
ОС: gentoo only !!!
Контактная информация:

Re: Настройка UDEV: даем устройствам свои имена

Сообщение Thoth »

ой круто пасиб (респект )
ГГГента vanilla-sources + some patchs, kde real-base only,GNU emacs
Юзаю gentoo патаму шта он рудит нипадецки, а всё астальное ацтой.
лапоть: OpenSuse-10.2
Спасибо сказали:
Аватара пользователя
Dimon93rus
Сообщения: 428
Статус: Kernel Killer

Re: Настройка UDEV: даем устройствам свои имена

Сообщение Dimon93rus »

А у меня 2 флэшки и одна определяется как съёмное устройство и выводится да рабочий стол, а вот другая определяется как раздел жёсткого диска :unsure: . Можно конечно сделать чтобы и жесткие диски тоже выводились на рабочий стол, вот толко не охота наблюдать множество разделов на столе. Можно как-нибудь это исправить, а именно чтобы вторая флэшка определялась как флэшка?

ОС: ASPLinux 11.2
Ядро: 2.6.17-1.2157.1asp
Ubuntu Server 10.04 x86, Calculate Linux 11.6 x86
Спасибо сказали:
Аватара пользователя
Dimon93rus
Сообщения: 428
Статус: Kernel Killer

Re: Настройка UDEV: даем устройствам свои имена

Сообщение Dimon93rus »

Ээх, неужели мне никто не сможет помочь? Или мне лучше создать топик в разделе RH/Fedora/ASP ?
А Администрация не обидится?
Просто я думаю, что проблема в правилах udev, вот поэтому здесь и написал. :wacko:
Ubuntu Server 10.04 x86, Calculate Linux 11.6 x86
Спасибо сказали:
Аватара пользователя
Rootlexx
Бывший модератор
Сообщения: 4455
Статус: GNU generation
ОС: Debian GNU/Linux

Re: Настройка UDEV: даем устройствам свои имена

Сообщение Rootlexx »

Dimon93rus писал(а):
20.03.2008 13:30
Просто я думаю, что проблема в правилах udev, вот поэтому здесь и написал.

Проблема скорее в том, как HAL определяет тип устройства. Дело UDEV - создать сам файл устройства и ссылки на него, если нужны. Тип устройства KDE определяет через HAL.
Спасибо сказали:
Аватара пользователя
Dimon93rus
Сообщения: 428
Статус: Kernel Killer

Re: Настройка UDEV: даем устройствам свои имена

Сообщение Dimon93rus »

И всё же мне не понятно почему он распознаёт именно эту флэшку как жёсткий диск?
Где мне нужно поковырять hal чтобы разобраться.
Кстати, подкаталоги в папке /etc/hal/fdi пусты...... Судя по описаниям в гугле там должны быть какие-то конфиги...
Вот выводы lshal:
"Нормальная флэшка" (которая определяется как флэшка):

Код:

udi = '/org/freedesktop/Hal/devices/usb_device_3538_54_000000000014D6' info.udi = '/org/freedesktop/Hal/devices/usb_device_3538_54_000000000014D6' (string) linux.subsystem = 'usb' (string) linux.hotplug_type = 1 (0x1) (int) usb_device.bus_number = 1 (0x1) (int) usb_device.can_wake_up = false (bool) usb_device.is_self_powered = false (bool) usb_device.version_bcd = 512 (0x200) (int) usb_device.speed_bcd = 4608 (0x1200) (int) usb_device.serial = '000000000014D6' (string) usb_device.linux.device_number = 10 (0xa) (int) usb_device.num_ports = 0 (0x0) (int) usb_device.max_power = 80 (0x50) (int) usb_device.device_revision_bcd = 256 (0x100) (int) info.product = 'PQI USB Flash Drive' (string) usb_device.product = 'PQI USB Flash Drive' (string) info.vendor = 'Power Quotient International Co., Ltd' (string) usb_device.vendor = 'Power Quotient International Co., Ltd' (string) usb_device.product_id = 84 (0x54) (int) usb_device.vendor_id = 13624 (0x3538) (int) usb_device.device_protocol = 0 (0x0) (int) usb_device.device_subclass = 0 (0x0) (int) usb_device.device_class = 0 (0x0) (int) usb_device.num_interfaces = 1 (0x1) (int) usb_device.num_configurations = 1 (0x1) (int) usb_device.configuration_value = 1 (0x1) (int) usb_device.linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1f.2/usb1/1-2' (string) info.linux.driver = 'usb' (string) info.bus = 'usb_device' (string) info.parent = '/org/freedesktop/Hal/devices/usb_device_0_0_0000_00_1f_2' (string) linux.sysfs_path_device = '/sys/devices/pci0000:00/0000:00:1f.2/usb1/1-2' (string) linux.sysfs_path = '/sys/devices/pci0000:00/0000:00:1f.2/usb1/1-2' (string)


"Ненормальная флэшка" (которая определяется как ЖД):

Код:

udi = '/org/freedesktop/Hal/devices/storage_model_TS512MJFV30' info.addons = {'hald-addon-storage'} (string list) storage.policy.should_mount = true (bool) block.storage_device = '/org/freedesktop/Hal/devices/storage_model_TS512MJFV30' (string) info.udi = '/org/freedesktop/Hal/devices/storage_model_TS512MJFV30' (string) storage.requires_eject = false (bool) storage.hotpluggable = true (bool) info.capabilities = {'storage', 'block'} (string list) info.category = 'storage' (string) info.product = 'TS512MJFV30' (string) info.vendor = 'JetFlash' (string) storage.removable = true (bool) storage.physical_device = '/org/freedesktop/Hal/devices/usb_device_457_151_2901f8e3f54678_if0' (string) storage.lun = 0 (0x0) (int) storage.drive_type = 'disk' (string) storage.vendor = 'JetFlash' (string) storage.model = 'TS512MJFV30' (string) storage.automount_enabled_hint = true (bool) storage.media_check_enabled = true (bool) storage.no_partitions_hint = false (bool) storage.bus = 'usb' (string) block.is_volume = false (bool) block.minor = 0 (0x0) (int) block.major = 8 (0x8) (int) block.device = '/dev/sda' (string) linux.hotplug_type = 3 (0x3) (int) info.parent = '/org/freedesktop/Hal/devices/usb_device_457_151_2901f8e3f54678_if0_scsi_host_scsi_device_lun0' (string) linux.sysfs_path_device = '/sys/block/sda' (string) linux.sysfs_path = '/sys/block/sda' (string)

P.S. может попробовать её форматнуть? :)
Ubuntu Server 10.04 x86, Calculate Linux 11.6 x86
Спасибо сказали:
tremor
Сообщения: 32

Re: Настройка UDEV: даем устройствам свои имена

Сообщение tremor »

Огромное спасибо Madscull'у!!
У меня в убунту автомаунт перестал почемуто работать. По первому мессаджу в теме сделал линк на свой внешний винт, называется /dev/vint, ну и в фстаб прописал его с параметром auto. Это просто жесть, надо же как все прикольно! ))

PS Только смутило следующеее: у меня винт - усб, и когда я делаю udevinfo то система показывает свойства всех parent устройств, а их там много, и конкретно свойства у /block/sdc/sdc2 не несут "уникальных строк" а вот один из parent устройств имеет 2 строки:
ATTRS{manufacturer}=="Sunplus Technology Inc."
ATTRS{product}=="USB to Serial-ATA bridge"
Ну я на авось сделал строчку типа ATTRS{product}=="USB to Serial-ATA bridge", NAME=/dev/vint -- но это должен же быть только мост от УСБ к самому Винчестеру вроде.... Видимо для каждого Партишна есть свой мост и можно указывать его, иначе говоря наверное все парент устройства относятся к sdc2 который я указал в udevinfo. Как бы там нибыло все работает.
Спасибо сказали:
Аватара пользователя
Dimon93rus
Сообщения: 428
Статус: Kernel Killer

Re: Настройка UDEV: даем устройствам свои имена

Сообщение Dimon93rus »

Dimon93rus писал(а):
21.03.2008 11:56
...
P.S. может попробовать её форматнуть? :)

Кстати, если кому это интересно......... после того форматнул эту флэшку, она стала нормально монтироваться, т.е. определяться как флэшка, а не как винт :)
Ubuntu Server 10.04 x86, Calculate Linux 11.6 x86
Спасибо сказали:
Ответить