Приёмы работы с UDEV

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

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

Mellon
Сообщения: 655
Статус: Powered by Gentoo
ОС: Gentoo

Приёмы работы с UDEV

Сообщение Mellon »

Эта рубрика посвящена борьбе с трудом, за экономию времени и ресурсов.

1. Загрузка служб.

Пользуете ли вы принтер?
Если да, то наверно через CUPS, и скорее всего, он запускается при загрузке системы.
Вопрос. А так ли вы часто печатаете, что CUPS находится в автозагрузке?
Очевидно, если CUPS будет запускатся только при включении принтера, и останавливаться при выключении, то это будет хорошо.

Следующий набросок сделан на примере Gentoo, но скорее всего он подойдёт и к другим дистрибутивам с некоторым адаптированием.

И так, надеюсь вам известно, какое устройство в /dev представляет ваш принтер.
узнаем о нём немного больше.
Смотрим путь в sysfs:

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

# udevinfo -q path -n /dev/usb/lp0
/devices/pci0000:00/0000:00:10.1/usb6/6-2/6-2:1.0/lp0

Затем его "особенности"

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

# udevinfo -a -p /devices/pci0000:00/0000:00:10.1/usb6/6-2/6-2:1.0/lp0
              ---SKIP---
  looking at device '/class/usb/lp0':
    KERNEL=="lp0"                         <==== Вот, что надо.
    SUBSYSTEM=="usb"
    SYSFS{dev}=="180:0"
              ---SKIP---

Там много чего выодится, но нам нужно, только то, как его обзывает ядро.
Дальше создаем правила udev:

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

/etc/udev/rules.d/99-udev-my.rules

# Printer
KERNEL=="lp0", ACTION=="add", RUN+="/etc/udev/scripts/printer add"
KERNEL=="lp0", ACTION=="remove", RUN+="/etc/udev/scripts/printer remove"

И скрипт к нему

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

/etc/udev/scripts/printer

#!/bin/bash

LOG="/var/log/udev"

sleep 3

if [ "$1" = "add" ]; then
    echo "--- `date` ---" >> $LOG
    echo "starting printing system" >> $LOG
    /etc/init.d/cupsd start  >> $LOG 2>&1
elif [ "$1" = "remove" ]; then
    echo "--- `date` ---" >> $LOG
    echo "stopping printing system" >> $LOG
    /etc/init.d/cupsd stop  >> $LOG 2>&1
fi

Надо пояснить, что
Задержка в 3 или более секунд необходима для того, чтобы ядро успело выполнить свои действия по инициализации устройства.

Есть в этом деле одно но, если принтер включен до загрузки Linux, то из-за того, что udev инициализируется гораздо раньше запуска требуемых служб, наш сервис остается не запущенным.
Дабы избежать этого, можно в ваш дополнительный локальный скрипт инициализации (в Gentoo это уже присутствующий /etc/init.d/local, с файлами конфигурации /etc/conf.d/local.*, в других дистрибутивах вы можете создать свой) добавить следующее:

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

checkprinter() {
PRINTERDEV=/dev/usb/lp0
if [ -e $PRINTERDEV ]; then
        /etc/init.d/cupsd start
fi
}

checkprinter

(В моем случае я это добавил в /etc/conf.d/local.start согласно рекомендациям моего дистрибутива)

Вот и всё :)
-----------------------------------------------------------
Литература.
Tips от Madskull'a
http://ru.gentoo-wiki.com/HOWTO_Udev_и_авт...вание_носителей
man udev
Некоммерческий файлообмен не может сравниваться с кражей, так как кража лишает кого-то возможности использовать украденный объект. ©
--------------------
Переворачиватель пингвинов
Спасибо сказали:

Аватара пользователя
BlackStar
Сообщения: 1338
Статус: We are all Kosh
ОС: Fedora 10

Re: Приёмы работы с UDEV

Сообщение BlackStar »

Спасибо! Очень интересно. А можно ли прикрутить этот прием для сетевого принтера?
LightLang Team
Спасибо сказали:

pelmen
Сообщения: 1268
ОС: debian

Re: Приёмы работы с UDEV

Сообщение pelmen »

Я в баш-скриптинге не очень силён, но хотелось бы подразобраться:
Mellon писал(а):
10.10.2006 16:46

Код:

#!/sbin/runscript depend() { <=== Что это за функция и что она делает? (use, after... - можно поподробнее?) use net after logger before nfs use hotplug after vmware } start() { ebegin "Starting printing system" /etc/init.d/hplip start /etc/init.d/cupsd start eend $? - что за символы вконце? зачем они? } stop() { ebegin "Stopping printing system" /etc/init.d/cupsd stop /etc/init.d/hplip stop eend $? }

Я так понимаю, с флэшкой будет тоже самое? Просто у меня (debian etch) при её подсоединении еще и маунт надо писать...
Спасибо сказали:

trifon
Сообщения: 1
ОС: linux

Re: Приёмы работы с UDEV

Сообщение trifon »

$? - Это переменная, возвращающая код завершения, предыдушей команды.
С gentoo я не знаком(использую lfs initng), но думаю(гением для этого быть не нужно), что depend() проверяет зависимости с другими сервисами.
Соответственно after - запускает нужный сервис(если ещё не запущен), use - ждёт, запуска.

Что касается сетевого принтера, то ядро о его существовании не знает, сооветственно udev тоже, так что этот метод не подойдёт.
Спасибо сказали:

Mellon
Сообщения: 655
Статус: Powered by Gentoo
ОС: Gentoo

Re: Приёмы работы с UDEV

Сообщение Mellon »

Исправил досадные ошибки, убрал упоминание hplip.
hplip скорее всего работает через usblib, с которым я пока не разобрался до конца.

Если кто знает, как сдружить запуск/остановку служб при подключении/отключении устройств с usblib, пожалуйста, напишите об этом.
Некоммерческий файлообмен не может сравниваться с кражей, так как кража лишает кого-то возможности использовать украденный объект. ©
--------------------
Переворачиватель пингвинов
Спасибо сказали: