Управление аппаратными средствами в Linux с помощью udev. Часть 2

()

Заставляем сканер работать правильно

Сканеры и многофункциональные принтеры/копиры не работают в Linux "из коробки". Так что давайте совершим небольшую экскурсию с целью заставить их работать. Для примера мы возьмём Epson Stylus CX4800. (Не потому что это хорошая машина, а потому что она у меня есть. Он работает на "изумительных" скоростях и использует специальные чернила, которые сворачиваются как кровь. Когда они случайно забивают носики печати - он сам их очищает. Здорово, не правда ли?)

Прежде всего убедитесь, что ваше устройство поддерживается в Linux. Если это не так - даже udev не сможет вам помочь. Проверьте sane-project.org и Google перед покупкой устройства.

Посмотрите у себя файл /etc/udev/rules.d/*-libsane-rules. Естественно, что в разных дистрибутивах этот файл может называться по разному. В Kubuntu это 45-libsane.rules, в RedHat - 60-libsane.rule. Число в начале - приоритет файла с правилами. Файлы с меньшими приоритетами анализируются первыми. Пример *-libsane-rules:

SUBSYSTEM!="usb_device", ACTION!="add", GOTO="libsane_rules_end"

# Hewlett-Packard|ScanJet 4100C
SYSFS{idVendor}=="03f0", SYSFS{idProduct}=="0101", MODE="664", GROUP="scanner"
# Hewlett-Packard|PhotoSmart S20
SYSFS{idVendor}=="03f0", SYSFS{idProduct}=="0102", MODE="664", GROUP="scanner"
# Hewlett-Packard|ScanJet 4200C
[...]

Кажется довольно нелепым, что udev, делая грандиозную работу, всё же наполняет /dev некоторым количеством неверных нодов. В любом случае достаточно просто удалить лишние ноды.

Убедитесь что у вас установлен SANE. Подключите сканер к компьютеру и выполните следующую команду:

# sane-find-scanner
  # sane-find-scanner will now attempt to detect your scanner
[...]
found USB scanner (vendor=0x04b8, product=0x0819) at libusb:003:002
  # Your USB scanner was (probably) detected. It may or may not be supported by
  # SANE. Try scanimage -L and read the backend's manpage [...]

Теперь попробуйте выполнить scanimage -L под простым пользователем. Если не получится - повторите тоже самое от имени пользователя root:

# scanimage -L
device `epson:libusb:003:002' is a Epson Unknown model flatbed scanner

В сообщение говориться о проблеме с правами доступа к сканеру. На самом деле это не проблема. Для начала отредактируйте /etc/sane.d/epson.conf, чтобы иметь правильно сконфигурированный сканер. Закомментируйте все строчки кроме двух:

usb
usb 0x4b8 0x0819

Откуда берутся эти шестнадцатиричные значения? Из вывода команды sane-find-scanner. Впишите корректные значения, а затем добавьте в /etc/udev/rules.d/*-libsane-rules следующуе

#epson stylus cx4800
SYSFS{idVendor}=="04b8", SYSFS{idProduct}=="0819", MODE="664", GROUP="scanner"

Фактически, это банальный копи-паст строчек из начала файла. Начальные нули можно удалить.

В первой части было описано как получить уникальный ID из /sys для испоьзования в правилах udev. Вот то, как выглядит наш Epson:

 $ udevinfo -a -p /class/usb_device/usbdev3.2 

follow the "device"-link to the physical device:
  looking at the device chain at '/sys/devices/pci0000:00/0000:00:02.2/usb3/3-6':
    BUS=="usb"
    ID=="3-6"
    DRIVER=="usb"
    SYSFS{configuration}=="USB2.0 MFP_Hi-Speed_"
    SYSFS{devnum}=="2"
    SYSFS{idProduct}=="0819"
    SYSFS{idVendor}=="04b8"
    SYSFS{manufacturer}=="EPSON"
    SYSFS{product}=="USB2.0 MFP_Hi-Speed_"
    SYSFS{serial}=="L84010507120939390"
    SYSFS{speed}=="480"
    SYSFS{version}==" 2.00"

Вот и всё. Сохраните изменения, перезагрузитесь и - вуаля! Вы больше не должны заходить как root, чтобы использовать ваш сканер.

SANE поставляется с огромным количеством страниц man, которые помогут вам настроить ваш сканер. Команда man sane покажет вам их список.

Владельцы и права доступа. Имена и симлинки

Конфигурация udev оперирует тремя основными понятиями: права и владельцы, имена, симлинки. Kubuntu раскидывает эти настройки по трём различным файлам: 20-names.rules, 40-permissions.rules, и 60-symlinks.rules. В RedHat они не разделены на категории таким образом. Все настройки хранятся в файле 50-udev.rules. Вы можете редактировать его, или создать свой, например 10-udev.rules.

Когда вы хотите изменить права доступа то вам нужно проверить /etc/udev/rules.d и убедиться что вы имеет соответствующие правила. Легче всего для этого использовать grep. Пример поиска правил для дисковых устройств:

$ grep -ir 'group="disk"' /etc/udev
/etc/udev/rules.d/40-permissions.rules:SYSFS{removable}!="1",     GROUP="disk"
/etc/udev/rules.d/40-permissions.rules:KERNEL=="raw1394",   GROUP="disk"

Этот пример показывает имя файла и найденную строку. Вы можете так же добавить ключ -B 5 для просмотра ещё и пяти предыдущих строк, или -A 5 для просмотра последующих пяти строк.

Устройства с постоянными именами

Linux проделал большой путь. Сейчас он поддерживает множество устройств. Обратная сторона этой медали - неустойчивые имена устройств. Ваш дистрибутив скорее всего идёт с заранее определёнными именами устройств для жёстких и компакт-дисков, но такие устройства как карты USB-Flash или сетевые карты USB всё ещё не имеют фиксированных имён.

Для решения этой проблемы есть два способа. Можно добавить другое название или создать симлинк. Например мой второй жёсткий диск /dev/sda является SATA-диском на 300 гигабайт, и используется мной для хранения архива фотографий. Я могу создать файл 10-local.rules следующего содержания:

# nickname for /dev/sda
KERNEL=="sda", NAME="photo-archives"

После перезагрузки будет устройство /dev/photo-archives. Я могу использовать его как обычный жёсткий диск. Например я могу написать в /etc/fstab строчку с использованием /dev/photo-archives.

Конечно это быстро и просто, но иногда лучше создать симлинк, который будет указывайть на оригинальный нод устройства. В таком случае не придётся искать в /etc/udev.d чтобы вспомнить реально имя устройства если я его забуду. Запустите udevinfo и посмотрите на информацию об устройстве:

$ udevinfo -a -p /block/sda
[...]
device '/sys/block/sda' has major:minor 8:0
  looking at class device '/sys/block/sda':
    KERNEL=="sda"
    SUBSYSTEM=="block"
    SYSFS{dev}=="8:0"
    SYSFS{range}=="16"
    SYSFS{removable}=="0"
    SYSFS{size}=="156301488"
[...]

Затем выберите один или несколько признаков и создайте правило для симлинка:

# nickname for /dev/sda
KERNEL=="sda", SYSFS{size}=="156301488", SYMLINK+="photo-archives"

Если вы используете несколько признаков одновременно - следите чтобы они харакетризовали одно устройство. Следите за пунктуацией. значения KERNEL и SYSFS называются ключами соответствия, и должны использовать знак равенства ==. SYMLINK - ключ назначения. Знак "плюс" говорит о том что нужно "добавить симлинк", а знак равенства указывает имя этого симлинка. Если вы пропутите "плюс" то вы удалите все уже имеющиеся силинки.

Я для страховки использую размер, так как это единственный диск такого размера в системе. Если любой ключ соответствия изменится - правило не будет работать.

После перезагрузки вы обнаружите новый симлинк:

 $ ls -l /dev/photo-archives
lrwxrwxrwx 1 root root 3 2006-10-09 22:19 /dev/photo-archives -> sda

Настройка сетевых карт USB

Обычным сетевым картам PCI Ethernet имена даются при помощи ifrename на Debian-системах, или посредством методов конфигурации на RedHat. Сетевыми картами USB всё по другому, но не сложнее. Всё что вам нужно - MAC адрес вашей сетевой карты. Дальше легко написать правило. Например для беспроводного адаптера:

KERNEL=="wlan*", SYSFS{address}=="00.11.22.33.44.55", NAME="wlan0"

Вы не обязаны использовать wlan0. Вы можете использовать любое другое название, которое вам нравиться. Только не забудьте его:)

Вы можете использовать /sbin/ifconfig -a или udevinfo для получения MAC-адреса:

$ udevinfo -a -p /sys/class/net/wlan0

Все сетевые интерфейсы находятся в /sys/class/net/.

Применение изменений udev

В Kubuntu вам необходима перезагрузка для применения новых правил. В RedHat можно применить новые правила и без перезагрузки. Просто выполните:

# udevcontrol reload_rules
# udevstart

Это всё. Однако имейте ввиду что udev ещё очень молод, и потому нам хотелось бы видеть более удобные инструментальные средства для работы с ним. Будет очень хорошо, если пользователи помогут создавать их.

Источник

Ключевые слова: udev, udevinfo, udevcontrol, udevstart.

Комментарии:

Шаманыш 2006-10-12 16:05:44 (#)

мдя, неуклюже получилось.
Ещё раз, пропроще :)
http://linuxforum.ru/index.php?showtopic=26761

MooSE 2006-10-12 16:13:55 (#)

Шаманыш, корявый пост удалил:)

Неплохая мысль. Странно что никто раньше не додумался... Предложи какому-нибудь дистро-строителю. Например ALTLinux. Я думаю что им понравиться:)
Новый комментарий



© 2006-2016 Вадим Калинников aka MooSE