Как использовать Udev для обнаружения устройств и управления ими в Linux
Udev (userspace /dev) — это подсистема Linux для динамического обнаружения устройств и управления ими, начиная с версии ядра 2.6. Это замена devfs и hotplug.
Она динамически создаёт или удаляет узлы устройств (интерфейс для драйвера устройства, который появляется в файловой системе, как если бы это был обычный файл, хранящийся в каталоге /dev) во время загрузки или если вы добавляете устройство или удаляете устройство из системы. Затем она передаёт информацию об устройстве или изменениях его состояния в пользовательское пространство.
Её функция состоит в том, чтобы 1) снабжать системные приложения событиями устройств, 2) управлять разрешениями узлов устройств и 3) создавать полезные символические ссылки в каталоге /dev для доступа к устройствам или даже переименовывать сетевые интерфейсы.
Одним из плюсов udev является то, что она может использовать постоянные имена устройств, чтобы гарантировать согласованное именование устройств при перезагрузке, несмотря на порядок их обнаружения. Эта функция полезна, потому что ядро просто назначает непредсказуемые имена устройств в зависимости от порядка обнаружения.
В этой статье мы узнаем, как использовать Udev для обнаружения устройств и управления ими в системах Linux. Обратите внимание, что большинство, если не все основные современные дистрибутивы Linux, поставляются с Udev как часть установки по умолчанию.
Изучите основы Udev в Linux
Демон udev, systemd-udevd (или systemd-udevd.service) взаимодействует с ядром и получает события устройства непосредственно от него каждый раз, когда вы добавляете или удаляете устройство из системы, или когда устройство меняет своё состояние.
Udev основан на правилах — правила гибкие и очень мощные. Каждое полученное событие устройства сопоставляется с набором правил, считываемых из файлов, расположенных в /lib/udev/rules.d, /usr/lib/udev/rules.d и /run/udev/rules.d.
Вы можете записать файлы пользовательских правил в каталог /etc/udev/rules.d/ (файлы должны заканчиваться расширением .rules) для обработки устройства. Обратите внимание, что файлы правил в этом каталоге имеют наивысший приоритет.
Чтобы создать файл узла устройства, udev необходимо идентифицировать устройство с помощью определённых атрибутов, таких как label, serial number (метка, серийный номер), его основной и дополнительный номер, номер устройства шины и многое другое. Эта информация экспортируется файловой системой sysfs.
Каждый раз, когда вы подключаете устройство к системе, ядро обнаруживает и инициализирует его, и в каталоге /sys/ создаётся каталог с именем устройства, в котором хранятся атрибуты устройства.
Главный файл конфигурации для udev — это /etc/udev/udev.conf, а для управления поведением демона udev во время выполнения вы можете использовать утилиту udevadm.
Чтобы отобразить полученные события ядра (uevents) и события udev (которые udev отправляет после обработки правила), запустите udevadm с командой monitor. Затем подключите устройство к вашей системе и наблюдайте с терминала, как обрабатывается событие устройства.
На следующем снимке экрана показан фрагмент события ADD после подключения USB-накопителя к тестовой системе:
Чтобы узнать имя, присвоенное вашему USB-диску, используйте утилиту lsblk, которая считывает файловую систему sysfs и udev db для сбора информации об обрабатываемых устройствах.
Исходя из вывода предыдущей команды, USB-диск называется sdb4 (абсолютный путь должен быть /dev/sdb4). Чтобы запросить атрибуты устройства из базы данных udev, используйте команду info.
Как работать с правилами Udev в Linux
В этом разделе мы кратко обсудим, как писать правила udev. Правило состоит из списка из одной или нескольких пар ключ-значение, разделённых запятыми. Правила позволяют вам, среди прочего, переименовать узел устройства с именем по умолчанию, изменить разрешения и владение узлом устройства, инициировать выполнение программы или сценария при создании или удалении узла устройства.
Мы напишем простое правило для запуска скрипта при добавлении USB-устройства и его удалении из работающей системы.
Начнём с создания двух скриптов:
Добавьте следующие строки в скрипт device_added.sh.
Откройте второй скрипт.
Затем добавьте следующие строки в скрипт device_removed.sh.
Сохраните файлы, закройте и сделайте оба сценария исполняемыми.
Затем давайте создадим правило для запуска выполнения вышеуказанных сценариев, которое называется /etc/udev/rules.d/80-test.rules.
Добавьте в него эти два следующих правила.
- «==»: оператор для сравнения на равенство.
- «+=»: оператор для добавления значения к ключу, содержащему список записей.
- SUBSYSTEM: соответствует подсистеме устройства события.
- ACTION: соответствует названию действия события.
- ENV : соответствует значению свойства устройства, в данном случае типу устройства.
- RUN: указывает программу или сценарий, выполняемый как часть обработки события.
Сохраните файл и закройте его. Затем от имени пользователя root скажите systemd-udevd перезагрузить файлы правил (это также перезагрузит другие базы данных, такие как индекс модуля ядра), для этого выполните:
Теперь подключите USB-накопитель к своей машине и проверьте, был ли выполнен скрипт device_added.sh. Прежде всего, файл scripts.log должен быть создан в /tmp.
Проверьте журнал сценариев после добавления USB
Затем в файле должна быть запись типа «USB device added at ВРЕМЯ».
Для получения дополнительной информации о том, как писать правила udev и управлять udev, обратитесь к записям руководства udev и udevadm соответственно, запустив:
Резюме
Udev — замечательный диспетчер устройств, который обеспечивает динамический способ настройки узлов устройств в каталоге /dev. Это гарантирует, что устройства будут настроены, как только они будут подключены и обнаружены. Он передаёт информацию об обрабатываемом устройстве или изменениях его состояния в пользовательское пространство.
Name already in use
arch-wiki-md-repo / wiki / _content / russian / Udev (russian).md
- Go to file T
- Go to line L
- Copy path
- Copy permalink
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
По функциональности udev заменяет hotplug и hwdetect.
В целях обеспечения лучшей производительности udev загружает модули ядра асинхронно, то есть параллельно, а не последовательно. В этом есть свой недостаток: udev не сохраняет порядок загрузки модулей, он может отличаться от загрузки к загрузке. Если компьютер имеет несколько блочных устройств, это может привести к тому, что при случайном порядке загрузки им будут присваиваться случайные имена. Например, если к компьютеру подключены два жестких диска, /dev/sda может случайно становиться /dev/sdb . Дополнительную информацию об этом смотрите далее.
В настоящий момент udev включен в состав пакета systemd и в системах Arch Linux устанавливается по умолчанию. Смотрите также systemd-udevd.service(8) для получения дополнительной информации.
О правилах udev
Файлы правил udev хранятся в каталоге /etc/udev/rules.d/ , их имена должны оканчиваться на .rules. Правила, предоставляемые другими пакетами, помещаются в каталог /usr/lib/udev/rules.d/ . При этом, если правила в этих каталогах имеют одинаковые имена, приоритет отдается файлам из /etc/udev/rules.d/ .
Написание своих правил
Важно: Чтобы смонтировать съемные устройства, не вызывайте mount из правил udev. В случае использования файловых систем FUSE, вы получите ошибку «Transport endpoint not connected». Вместо этого используйте udisks, который выполняет автомонтирование правильно.
- Чтобы узнать, как создавать собственные правила, смотрите страницу в интернете Написание правил udev.
- Пример правила udev можно найти в разделе Примеры на той же странице.
Ниже приведен пример правила, которое создает символическую ссылку /dev/video-cam1 , когда к компьютеру подключается веб-камера. Например, мы выяснили, что для подключенной камеры создан файл устройства /dev/video2 . Причина, по которой мы создаем это правило, заключается в том, что при следующей загрузке веб-камере может быть присвоено другое имя, например, /dev/video0 .
# udevadm info -a -p $(udevadm info -q path -n /dev/video2)
Примечание: Утилита udevadm выводит информацию об устройствах, начиная с указанного устройства ( /dev/video2 ), и затем, следуя по цепочке родительских устройств, выводит информацию о них. Кроме всего прочего, выводятся все возможные атрибуты устройств в формате, совместимом с udev. Правило для сопоставления может быть создано на основе этих атрибутов самого устройства или атрибутов родительского устройства.
Мы используем параметры веб-камеры KERNEL==»video2″ и SUBSYSTEM==»video4linux» , затем мы возьмем идентификаторы производителя и изделия родительского USB-устройства SUBSYSTEMS==»usb» , ATTRS
В примере мы создали символическую ссылку, используя параметр SYMLINK+=»video-cam1″ . Мы можем также легко задать владельца ( OWNER=»john» ), группу ( GROUP=»video» ), или установить права доступа к ссылке ( MODE=»0660″ ). Однако, если вы намереваетесь создать правило, которое делает что-нибудь при удалении устройства, имейте в виду, что атрибуты устройства могут стать недоступны. В этом случае вам необходимо использовать специальный набор переменных окружения. Чтобы отобразить эти переменные, выполните следующую команду при отсоединении устройства:
В выводе команды вы увидите значения параметров устройства, например, ID_VENDOR_ID и ID_MODEL_ID , которые соответствуют использованным ранее идентификаторам производителя и изделия. Правило, которое использует переменные окружения устройства, может выглядеть следующим образом:
Список атрибутов устройства
Чтобы вывести все атрибуты устройства, которые вы можете использовать в написании правил udev, выполните:
Замените *имя_устройства* текущим именем файла устройства, например, /dev/sda или /dev/ttyUSB0 .
Если вы не знаете имя файла устройства, вы можете также вывести все атрибуты по конкретному системному пути:
Проверка правил перед загрузкой
Вы можете также указать прямой системный путь до устройства:
Загрузка новых правил
udev способен определять наличие изменений в файлах правил автоматически, поэтому изменения сразу вступают в силу без необходимости перезапуска udev. Однако, новые правила не будут применены сразу к уже подключенным устройствам. Устройства с возможностью горячей замены, например, устройства USB, могут быть просто переподключены для применения к ним новых правил. Также вы можете перезагрузить модули ядра ohci-hcd и ehci-hcd , что автоматически приведет к перезагрузке всех драйверов для каждого USB-устройства.
Если правила не перезагружаются автоматически, выполните:
Чтобы вручную заставить udev применить ваши правила, выполните:
Советы и рекомендации
Доступ к программаторам и виртуальным COM-портам
Следующий набор правил даст возможность обычным пользователям (членам группы users ) получить доступ к USB-программаторам для микроконтроллеров AVR USBtinyISP (англ.), виртуальным COM-портам (преобразователям интерфейса USB <-> UART) на основе популярной микросхемы CP2102 (англ.), программаторам Atmel AVR Dragon (англ.) и Atmel AVR ISP mkII (англ.).
Набор правил актуален на 31 октября 2012 года. Идентификаторы производителя и изделия для новых ревизий устройств могут быть другими.
Выполнение команд при подключении USB-устройств
Выполнение команд при подключении VGA-монитора
Создайте правило /etc/udev/rules.d/95-monitor-hotplug.rules со следующим содержимым, чтобы запустить arandr при подключении VGA-монитора:
Определение новых накопителей eSATA
Если ваш накопитель eSATA не был определен системой при подключении, вы можете перезагрузить систему, не отключая кабель устройства, либо, если перезагрузка нежелательна, выполнить:
Еще один вариант заключается в использовании утилиты scsiadd из AUR:
Накопитель должен появиться в /dev . Если это не так, попробуйте выполнить:
до и после вышеприведенных команд и посмотреть, происходит ли что-нибудь.
Определение внутренних портов SATA как внешних
Если вы подключили eSATA-адаптер, система все еще будет распоздавать его как внутренний SATA-накопитель. GNOME и KDE будут постоянно запрашивать пароль администратора. Следующее правило помечает все указанные SATA-порты как порты eSATA, благодаря чему обычные пользователи смогут подключать свой накопитель eSATA к этому порту как USB-накопитель без запроса пароля администратора:
Примечание: Узнать правильное значение параметра DEVPATH вы можете, используя следующие команды (вместо /dev/sdb укажите имя вашего устройства):
Установка постоянных имен устройств
Из-за асинхронного способа загрузки модулей, они инициализируются в разном порядке от загрузки к загрузке. Это приводит к случайному переименованию устройств при каждом запуске. Чтобы задать постоянные имена вашим устройствам, можно создать специальное правило udev.
Смотрите также статьи Постоянные имена для блочных устройств для получения информации по блочным устройствам и Настройка сети#Драйвер устройства — для сетевых устройств.
Процедура установки веб-камеры описана в статье Настройка веб-камеры.
Использование нескольких веб-камер может быть полезно, например, совместно с motion (программный детектор движения, который получает изображения с устройств video4linux и/или веб-камер). При загрузке веб-камер им случайно присваиваются имена вида /dev/video[0..n] . Рекомендуемое решение состоит в создании символических ссылок с использованием правила udev (как в примере #Написание своих правил):
Примечание: Использование имен, отличных от /dev/video* , может помешать загрузке v4l1compat.so , и, возможно, v4l2convert.so
Если у вас несколько принтеров, им будут случайным образом присвоены имена вида /dev/lp[0-9] , что, например, может помешать серверу CUPS правильно настроить устройства. Вы можете создать следующее правило, которое будет создавать постоянные символические ссылки в каталогах /dev/lp/by-id и /dev/lp/by-path подобно схеме, приведенной в статье Постоянные имена для блочных устройств:
USB флеш-накопители обычно содержат разделы, и метки разделов позволяют получить статичные имена устройств. Также этого можно достичь, создав правило udev.
Первым делом узнайте серийный номер и идентификаторы USB вашего устройства (если у вас несколько одинаковых устройств, убедитесь, что серийные номера на самом деле уникальны):
Создайте правило udev для устройства, добавив следующее в файл в /etc/udev/rules.d/ , например, 8-usbstick.rules :
Замените, соответственно, *серийный_номер* , *id_поставщика* , *id_устройства* на реальные значения, а *имя* — на желаемое имя устройства, например, /dev/sdd . Специальная метка %n обозначает номер раздела, не удаляйте ее. Например, если у накопителя два раздела, будут созданы две символические ссылки.
Проверьте содержимое /dev :
Вы должны увидеть одну или несколько созданных символических ссылок для вашего устройства.
Пробуждение при активности USB-устройства
Первым делом, определите идентификаторы производителя и изделия вашего устройства:
# lsusb | grep Logitech Bus 007 Device 002: ID 046d:c52b Logitech, Inc. Unifying Receiver
Теперь измените атрибут power/wakeup устройства и USB-контроллера, к которому оно подключено. В данном примере это driver/usb7/power/wakeup . Используйте следующее правило:
Примечание: Убедитесь также, что контроллер USB активирован в /proc/acpi/wakeup .
Может быть полезно сгенерировать различные события udev. Например, вы хотите симулировать отключение USB-устройства на удаленной машине. В таких случаях, используйте udevadm trigger :
Эта команда симулирует отключение всех USB-устройств с указанным идентификатором поставщика *id_поставщика* .
Добавление модулей в черный список
Иногда udev может ошибочно загружать неправильные модули ядра. Чтобы избежать этого, вы можете добавить такие модули в черный список. Если модуль добавлен в этот список, udev станет игнорировать его при загрузке (в том числе, если устройство подключено уже после загрузки системы).
udevd вылетает при загрузке
После миграции на LDAP или обновления системы, использующей LDAP, udevd может начать аварийно завершаться в момент загрузки системы с сообщением «Starting UDev Daemon». Обычно это происходит потому, что udevd пытается определить имя через LDAP, но не может, так как в этот момент еще не установлено подключение к сети.
Необходимо, чтобы все используемые в LDAP группы были продублированы локально. Получить имена групп, используемых в правилах udev, и имена групп, присутствующих в системе, можно командами:
Вывод будет записан в файлы present_groups и udev_groups . Чтобы увидеть различия, выполните построчное сравнение командой diff:
В данном примере группа pcscd по какой-то причине отсутствует в системе. Все такие группы необходимо добавить в систему. Также убедитесь, что имена всех локальных ресурсов разрешены, прежде чем возвращаться к LDAP. Файл /etc/nsswitch.conf должен содержать следующую строку:
Неработоспособные устройства BusLogic могут вызывать зависание при загрузке системы
Это баг в ядре Linux, на данный момент не исправленный.
Устройство является съемным, однако не признается таковым
Создайте правило udev для конкретного устройства. Чтобы получить подробную информацию об устройстве вы можете либо использовать ID_SERIAL , либо ID_SERIAL_SHORT (не забудьте поменять /dev/sdb если нужно):
Теперь создайте файл правила в /etc/udev/rules.d/ и установите переменные либо для udisks, либо для udisks2.
Для udisks установите UDISKS_SYSTEM_INTERNAL=»0″ , которая пометит все устройства как съемные, и, таким образом, подходящие для автоматического монтирования. Смотрите подробности на странице udisks(7).
Для udisks2 установите UDISKS_AUTO=»1″ , чтобы пометить устройство для автоматического монтирования и UDISKS_SYSTEM=»0″ , чтобы пометить устройство как съемное. Смотрите подробности на странице udisks(8).
Перезагрузите правила udev командой udevadm control —reload . Теперь ваше устройство будет распознаваться как съемное.
Проблемы с автоматической загрузкой модулей аудиоустройств
Некоторые пользователи испытывают проблемы с загрузкой модулей звуковых устройств, для которых остались старые записи в /etc/modprobe.d/sound.conf . Чистка файла от таких записей может помочь.
Примечание: Начиная с версии udev 171, модули эмуляции OSS ( snd_seq_oss , snd_pcm_oss и snd_mixer_oss ) больше не загружаются автоматически.
Поддержка дисководов IDE
Начиная с версии 170, udev не поддерживает устройства CD-ROM/DVD-ROM, загружаемые как обычные IDE дисководы модулем ide_cd_mod и отображаемые в системе как /dev/hd* . Дисковод доступен только программам, которые обращаются к устройству напрямую, таким как cdparanoia, но невидим для более высокоуровневых программ, таких как KDE.
Причина, по которой загрузка модуля ide_cd_mod имеет приоритет перед другими модулями, например, sr_mod , может заключаться в том, что по какой-либо причине модуль piix загружается в вашем initramfs. В этом случае вы можете просто заменить его в файле /etc/mkinitcpio.conf на ata_piix .
Оптические дисководы имеют неверный group ID
Если значение group ID вашего дисковода установлено как disk , но вы хотите, чтобы оно было optical , вам следует создать такое правило:
udev (Русский)
udev — работающая в пространстве пользователя система, с помощью которой системный администратор может создавать обработчики событий. События, получаемые udev, обычно генерируются ядром Linux в ответ на физические события, происходящие с периферийными устройствами. Например, при обнаружении периферийных устройств или «горячем» подключении udev может выполнить определённые действия, в том числе и вернуть управление ядру, если необходима загрузка модулей или прошивок.
Подобно предшественникам, утилитам devfsd и hotplug, udev управляет файлами устройств в каталоге /dev , добавляя их, переименовывая и создавая символические ссылки. udev полностью замещает функционал hotplug и hwdetect.
Обработка событий в udev происходит параллельно, что теоретически улучшает производительность старых систем. С другой стороны, это может усложнить администрирование. Так, при перезапуске системы порядок загрузки модулей ядра может измениться, а при наличии в машине нескольких блочных устройств могут поменяться названия их файлов. Например, для системы с двумя жёсткими дисками файл /dev/sda после перезагрузки может превратиться в /dev/sdb .
Установка
udev входит в состав systemd и установлен по умолчанию. Подробнее см. systemd-udevd.service(8) .
Существует также отдельный от systemd форк, который можно установить с пакетом eudev AUR или eudev-git AUR .
О правилах udev
Создаваемые системным администратором правила udev хранятся в каталоге /etc/udev/rules.d/ . Названия файлов правил должны заканчиваться суффиксом .rules. Правила из пакетов программ при установке помещаются в каталог /usr/lib/udev/rules.d/ . Если в каталогах /usr/lib и /etc находятся два файла правил с одинаковыми именами, то файл в /etc будет иметь приоритет.
Правила udev подробно описаны в руководстве udev(7) . Также стоит изучить статью Создание правил udev (англ.) и приведённые в ней практические примеры: Создание правил udev — Примеры (англ.).
Пример правила udev
Ниже приведён пример правила, которое создаёт символическую ссылку /dev/video-cam , когда к компьютеру подключается веб-камера.
Предположим, мы выяснили, что для подключённой камеры создан файл устройства /dev/video2 . Причина, по которой мы создаем это правило, заключается в том, что при следующей загрузке веб-камере может быть присвоено другое имя, например, /dev/video0 .
Мы используем параметры веб-камеры KERNEL==»video2″ и SUBSYSTEM==»video4linux» , затем мы возьмем идентификаторы производителя и изделия родительского USB-устройства SUBSYSTEMS==»usb» , ATTRS
В примере мы создали символическую ссылку, используя параметр SYMLINK+=»video-cam» . Мы можем также легко задать владельца ( OWNER=»john» ), группу ( GROUP=»video» ), или установить права доступа к файлу ссылки ( MODE=»0660″ ).
Если вы намереваетесь создать правило, которое делает что-нибудь при удалении устройства, имейте в виду, что атрибуты устройства могут стать недоступны. В этом случае вам необходимо использовать специальный набор переменных окружения. Чтобы отобразить эти переменные, выполните следующую команду при отсоединении устройства:
В выводе команды вы увидите значения параметров устройства, например, ID_VENDOR_ID и ID_MODEL_ID , которые соответствуют использованным ранее идентификаторам производителя и изделия. Правило, которое использует переменные окружения устройства, может выглядеть следующим образом:
Список атрибутов устройства
Чтобы вывести все атрибуты устройства, которые вы можете использовать в написании правил udev, выполните:
Замените имя_устройства текущим именем файла устройства, например, /dev/sda или /dev/ttyUSB0 .
Если вы не знаете имя файла устройства, вы можете также вывести все атрибуты по конкретному системному пути:
Чтобы сузить поле поиска, определите класс устройства и выполните:
Найденную символическую ссылку (или файл, на который она указывает) можно использовать в параметре —name :
Проверка правил перед загрузкой
Вы можете также указать прямой системный путь до устройства:
Загрузка новых правил
udev способен определять наличие изменений в файлах правил автоматически, поэтому изменения сразу вступают в силу без необходимости перезапуска udev. Однако, новые правила не будут применены сразу к уже подключенным устройствам. Устройства с возможностью горячей замены, например, устройства USB, могут быть просто переподключены для применения к ним новых правил. Также вы можете перезагрузить модули ядра ohci-hcd и ehci-hcd , что автоматически приведет к перезагрузке всех драйверов для каждого USB-устройства.
Если правила не перезагружаются автоматически, выполните:
Чтобы вручную заставить udev применить ваши правила, выполните:
udisks
Советы и рекомендации
Монтирование съёмных устройств
Монтировать съёмные устройства с помощью команды mount в правиле udev не стоит по двум причинам: (1) systemd по умолчанию запускает systemd-udevd.service с отдельным «пространством имён монтирования» (см. namespaces(7) ), что означает, что данное устройство не будет видно из остальной системы. (2) Чтобы этого не происходило, можно закомментировать параметры PrivateMounts и MountFlags в файле службы, но тогда проявится другая проблема: запускаемые udev процессы система будет убивать по истечении нескольких секунд. В случае файловых систем FUSE, вроде NTFS, «монтирование» запустит в пространстве пользователя процесс для работы с файловой системой; затем процесс будет уничтожен и при попытке доступа к ФС вы получите ошибку Transport endpoint not connected .
Есть несколько возможных решений:
- Из правила udev запускается пользовательская служба systemd; служба запустит сценарий, который, в свою очередь, может породить любое количество долгосрочных процессов (вроде FUSE). В качестве примера можно использовать утилиту udev-media-automount, разработанную для быстрого и надёжного автоматического монтирования устройств. Другой вариант той же идеи предложен в этом сообщении.
- В правилах udev вместо команды mount можно использовать systemd-mount , как рекомендуют разработчики systemd. Пример монтирования USB-дисков в каталоге /media :
- Программы вроде udisks или udiskie. Мощные утилиты, хоть и с довольно сложной настройкой. Нужно учитывать, что они работают для одного пользовательского сеанса: доступ к некоторым файловым системам предоставляется только тому пользователю, сеанс которого активен в данный момент.
Доступ к программаторам и виртуальным COM-портам
Следующий набор правил даст возможность пользователям, входящим в группу users , получить доступ к USB-программаторам микроконтроллеров AVR USBtinyISP:
Идентификаторы производителя и изделия для других устройств можно узнать с помощью утилиты lsusb.
Выполнение команд при подключении VGA-монитора
Создайте правило /etc/udev/rules.d/95-monitor-hotplug.rules со следующим содержимым, чтобы запускать arandr при каждом подключении VGA-монитора:
Некоторые экранные менеджеры размещают файл .Xauthority вне домашнего каталога пользователя. В этом случае параметр ENV
Определение новых накопителей eSATA
Если ваш накопитель eSATA не был определен системой при подключении, вы можете перезагрузить систему, не отключая кабель устройства, либо, если перезагрузка нежелательна, выполнить:
Еще один вариант заключается в использовании утилиты scsiadd AUR из AUR:
Накопитель должен появиться в /dev . Если это не так, попробуйте выполнить:
до и после вышеприведенных команд и посмотреть, происходит ли что-нибудь.
Определение внутренних портов SATA как внешних
Если вы подключили eSATA-адаптер, система все еще будет распоздавать его как внутренний SATA-накопитель. GNOME и KDE будут постоянно запрашивать пароль администратора. Следующее правило помечает все указанные SATA-порты как порты eSATA, благодаря чему обычные пользователи смогут подключать свой накопитель eSATA к этому порту как USB-накопитель без запроса пароля администратора:
Установка постоянных имен устройств
Из-за асинхронного способа загрузки модулей, они инициализируются в разном порядке от загрузки к загрузке. Это приводит к случайному переименованию устройств при каждом запуске. Чтобы задать постоянные имена вашим устройствам, можно создать специальное правило udev. Смотрите также статьи Постоянные имена для блочных устройств и Настройка сети#Смена имени интерфейса.
Видеоустройства
Процедура установки веб-камеры описана в статье Webcam setup.
При загрузке веб-камерам присваиваются случайные имена вида /dev/video* . Рекомендуемое решение состоит в создании символических ссылок с использованием правила udev (подобно правилу в разделе #Пример правила udev):
Принтеры
Если у вас несколько принтеров, им будут случайным образом присвоены имена вида /dev/lp[0-9] , что, например, может помешать серверу CUPS правильно настроить устройства. Вы можете создать следующее правило, которое будет создавать постоянные символические ссылки в каталогах /dev/lp/by-id и /dev/lp/by-path подобно схеме, приведенной в статье Постоянные имена для блочных устройств:
Определение диска по серийному номеру
Действия с дисковыми устройствами /dev/sdX можно выполнять на основании серийного номера ID_SERIAL_SHORT , который можно узнать из вывода команды udevadm info /dev/sdX . Примерное правило udev для этого случая приведено ниже. В параметре RUN сценарию передаётся имя устройства; это сделано исключительно в иллюстративных целях:
Пробуждение при активности USB-устройства
С помощью правила udev можно настроить систему выходить из режима сна при активности USB-устройств, например, мыши или клавиатуры.
Первым делом определите идентификаторы производителя и изделия для вашего устройства:
Затем найдите, куда данное устройство подключено:
Наконец, создайте правило, которое при подключении будет изменять атрибут power/wakeup как для устройства, так и для USB-контроллера, к которому оно подключено:
Генерирование событий
Может быть полезно сгенерировать различные события udev. Например, вы хотите симулировать отключение USB-устройства на удалённой машине. В таких случаях, используйте udevadm trigger :
Эта команда симулирует отключение всех USB-устройств с указанным идентификатором поставщика idVendor .
Уведомления на рабочем столе
Заставить правильно работать из правила udev сценарий, содержащий команду notify-send , может оказаться непростой задачей, потому что уведомления не будут выводиться на рабочий стол. Ниже показано, какие файлы, команды и переменные окружения необходимо задйствовать, чтобы notify-send работала как положено.
1) Следующее правило udev запускает сценарий, создающий графическое и звуковое уведомление, когда яркость экрана меняется в зависимости от способа питания ноутбука:
- USERNAME_TO_RUN_SCRIPT_AS и USERNAME необходимо заменить на имя пользователя, который запустил графический сеанс;
- сценарий должен запускаться командой /usr/bin/su , чтобы его владельцем считался не root, а пользователь, который запустил графический сеанс и для которого будут выводиться уведомления.
2) Содержимое сценария, который запускается правилом udev:
- USERNAME_TO_RUN_SCRIPT_AS , UID_OF_USER_TO_RUN_SCRIPT_AS и USERNAME необходимо заменить на имя и идентификатор пользователя, запустившего графический сеанс;
- команда /usr/bin/sudo воспроизводит звуковое уведомление с помощью pulseaudio;
- для пользователя, запустившего графический сеанс, в котором будут отображаться уведомления, необходимо определить и экспортировать три переменные окружения ( XAUTHORITY , DISPLAY и DBUS_SESSION_BUS_ADDRESS ).
3) Загрузите/перезагрузите новое правило udev и проверьте, как оно работает, выдернув или подключив кабель питания ноутбука.
Создание долгосрочных процессов
Программы, запущенные udev, блокируют последующие события от данного устройства, а любые процессы, порождённые правилом udev, завершаются сразу после обработки события. Если вы хотите запустить долгосрочный процесс с помощью udev, то либо используйте at (например, ваша_команда | at now или batch ), либо создайте юнит systemd, который можно запустить из правила udev.
Решение проблем
Добавление модулей в черный список
Иногда udev может ошибочно загружать неправильные модули ядра. Чтобы избежать этого, добавьте такие модули в чёрный список. Если модуль находится в чёрном списке, udev будет игнорировать его как при загрузке, так и при более позднем «горячем» подключении внешнего устройства (например, USB-носителя).
Отладочная печать
Если задать параметр ядра udev.log-priority=debug , то аппаратное обеспечение будет выдавать отладочную информацию. Другой способ — задать параметр
Чтобы добавить эту опцию в initramfs, укажите файл настроек udev в строке FILES
после чего сгенерируйте initramfs.
udevd вылетает при загрузке
После миграции на LDAP или обновления системы, использующей LDAP, udevd может начать аварийно завершаться в момент загрузки системы с сообщением «Starting UDev Daemon». Обычно это происходит потому, что udevd пытается определить имя через LDAP, но не может, так как в этот момент еще не установлено подключение к сети.
Необходимо, чтобы все используемые в LDAP группы были продублированы локально. Получить имена групп, используемых в правилах udev, и имена групп, присутствующих в системе, можно командами:
Вывод будет записан в файлы present_groups и udev_groups . Чтобы увидеть различия, выполните построчное сравнение командой diff:
В данном примере группа pcscd по какой-то причине отсутствует в системе. Все такие группы необходимо добавить в систему. Также убедитесь, что имена всех локальных ресурсов разрешены, прежде чем возвращаться к LDAP. Файл /etc/nsswitch.conf должен содержать следующую строку:
Устройство является съемным, однако не признается таковым
Создайте правило udev для конкретного устройства. Чтобы получить подробную информацию об устройстве вы можете либо использовать ID_SERIAL , либо ID_SERIAL_SHORT (не забудьте поменять /dev/sdb если нужно):
Теперь установите UDISKS_AUTO=»1″ , чтобы пометить устройство для автоматического монтирования и UDISKS_SYSTEM=»0″ , чтобы пометить устройство как съёмное. Подробнее см. udisks(8)
Перезагрузите правила udev командой udevadm control —reload . Теперь ваше устройство будет распознаваться как съёмное.
Проблемы с автоматической загрузкой модулей аудиоустройств
Некоторые пользователи испытывают проблемы с загрузкой модулей звуковых устройств, для которых остались старые записи в /etc/modprobe.d/sound.conf . Чистка файла от таких записей может помочь.
Поддержка дисководов IDE
Начиная с версии 170, udev не поддерживает устройства CD-ROM/DVD-ROM, загружаемые как обычные IDE дисководы модулем ide_cd_mod и отображаемые в системе как /dev/hd* . Дисковод доступен только программам, которые обращаются к устройству напрямую, таким как cdparanoia, но невидим для более высокоуровневых программ вроде KDE.
Причина, по которой загрузка модуля ide_cd_mod имеет приоритет перед другими модулями, например, sr_mod , может заключаться в том, что по какой-либо причине модуль piix загружается в вашем initramfs. В этом случае вы можете просто заменить его в файле /etc/mkinitcpio.conf на ata_piix .
Оптические дисководы имеют неверный group ID
Если значение group ID вашего дисковода установлено как disk , но вы хотите, чтобы оно было optical , вам следует создать такое правило:
Etc udev rules d как назвать файл
Файловая система udev ("юдев") появилась в ядрах версии 2.6 заместо DevFS ("дев фс")
В отличие от devfs, которая работает в пространстве ядра, udev работает в пространстве пользователя. Она динамически обновляет содержимое директории /dev , как и его предшественница sysfs ("сисфс"). Sysfs рассматривалась как полезный инструмент для разработки и существовала только в ядрах Линукс версии 2.5, и была замещена udev в ядре 2.6.
udev позволяет назначать постоянные имена для устройств. Например, можно создать правило для монтирования жесткого диска производителем которого является "iRiver" с кодом устройства "ABC", как устройство /dev/iriver. Постоянность в названии устройств гарантирует, что все скрипты, зависящие от присутствия в системе определённых устройств, будут работать правильно.
Обзор
udev состоит из нескольких сервисов ядра и демона (процесса) udevd. Ядро сообщает демону udevd о наступлении определённого события. Сам демон udevd реагирует на наступившее событие через actions ("действия"). Информация о событии поступает от ядра. Все действия происходят в пользовательском окружении. Можно ли сделать так, чтобы от ядра передавалась только определенная информация о событии ? Можно настраивать действия на наступившее событие через "rules" ("правила").
Демон udevd запускается скриптом /etc/rcS.d/udev. Файл конфигурации находится в /etc/udev/udev.conf. Файл правил для более полной настройки демона udevd лежит в /etc/udev/rules.d. Файлы находящиеся в данной директории оканчивающиеся на ".rules" парсятся в алфавитном порядке. При изменении конфигурационного файла или файла правил, демон udevd следует перезапускать.
Множество файлов, находящихся в директории /etc/udev/rules.d, ссылаются на другие файлы. Можно предположить, что при редактировании файлов правил, текстовый редактор сделает работоспособные резервные копии, которые можно будет использовать при следующем запуске udevd. Поскольку имена ссылок могут отличаться от имён исходных файлов, они могут быть упорядочены без опасений.
udev был создан для реагирования на события типа "горячего подключения". Большая часть документации касается создания файлов устройств для новых физических устройств появившихся в системе. Однако udev не является узкоспециализированным. Он может запускать любую команду пользовательского режима в ответ на обнаружение нового устройства или любого другого события, полученного от ядра.