ZaLinux.ru

Как использовать 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 необходимо идентифицировать устройство с помощью определённых атрибутов, таких как labelserial number (метка, серийный номер), его основной и дополнительный номер, номер устройства шины и многое другое. Эта информация экспортируется файловой системой sysfs.

Каждый раз, когда вы подключаете устройство к системе, ядро обнаруживает и инициализирует его, и в каталоге /sys/ создаётся каталог с именем устройства, в котором хранятся атрибуты устройства.

Главный файл конфигурации для udev — это /etc/udev/udev.conf, а для управления поведением демона udev во время выполнения вы можете использовать утилиту udevadm.

Чтобы отобразить полученные события ядра (uevents) и события udev (которые udev отправляет после обработки правила), запустите udevadm с командой monitor. Затем подключите устройство к вашей системе и наблюдайте с терминала, как обрабатывается событие устройства.

На следующем снимке экрана показан фрагмент события ADD после подключения USB-накопителя к тестовой системе:

udevadm monitor

Чтобы узнать имя, присвоенное вашему USB-диску, используйте утилиту lsblk, которая считывает файловую систему sysfs и udev db для сбора информации об обрабатываемых устройствах.

lsblk

Исходя из вывода предыдущей команды, USB-диск называется sdb4 (абсолютный путь должен быть /dev/sdb4). Чтобы запросить атрибуты устройства из базы данных udev, используйте команду info.

udevadm info /dev/sdb4

Как работать с правилами Udev в Linux

В этом разделе мы кратко обсудим, как писать правила udev. Правило состоит из списка из одной или нескольких пар ключ-значение, разделённых запятыми. Правила позволяют вам, среди прочего, переименовать узел устройства с именем по умолчанию, изменить разрешения и владение узлом устройства, инициировать выполнение программы или сценария при создании или удалении узла устройства.

Мы напишем простое правило для запуска скрипта при добавлении USB-устройства и его удалении из работающей системы.

Начнём с создания двух скриптов:

sudo vim /bin/device_added.sh

Добавьте следующие строки в скрипт device_added.sh.

#!/bin/bash

echo "USB device added at $(date)" >>/tmp/scripts.log

Откройте второй скрипт.

sudo vim /bin/device_removed.sh

Затем добавьте следующие строки в скрипт device_removed.sh.

#!/bin/bash

echo "USB device removed at $(date)" >>/tmp/scripts.log

Сохраните файлы, закройте и сделайте оба сценария исполняемыми.

sudo chmod +x /bin/device_added.sh
sudo chmod +x /bin/device_removed.sh

Затем давайте создадим правило для запуска выполнения вышеуказанных сценариев, которое называется /etc/udev/rules.d/80-test.rules.

vim /etc/udev/rules.d/80-test.rules

Добавьте в него эти два следующих правила.

SUBSYSTEM=="usb", ACTION=="add", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_added.sh"
SUBSYSTEM=="usb", ACTION=="remove", ENV{DEVTYPE}=="usb_device", RUN+="/bin/device_removed.sh"

где:

  • «==»: оператор для сравнения на равенство.
  • «+=»: оператор для добавления значения к ключу, содержащему список записей.
  • SUBSYSTEM: соответствует подсистеме устройства события.
  • ACTION: соответствует названию действия события.
  • ENV{DEVTYPE}: соответствует значению свойства устройства, в данном случае типу устройства.
  • RUN: указывает программу или сценарий, выполняемый как часть обработки события.

Сохраните файл и закройте его. Затем от имени пользователя root скажите systemd-udevd перезагрузить файлы правил (это также перезагрузит другие базы данных, такие как индекс модуля ядра), для этого выполните:

sudo udevadm control --reload

Теперь подключите USB-накопитель к своей машине и проверьте, был ли выполнен скрипт device_added.sh. Прежде всего, файл scripts.log должен быть создан в /tmp.

ls -l /tmp/scripts.log

Проверьте журнал сценариев после добавления USB

Затем в файле должна быть запись типа «USB device added at ВРЕМЯ».

cat /tmp/scripts.log

Для получения дополнительной информации о том, как писать правила udev и управлять udev, обратитесь к записям руководства udev и udevadm соответственно, запустив:

man udev
man udevadm

Резюме

Udev — замечательный диспетчер устройств, который обеспечивает динамический способ настройки узлов устройств в каталоге /dev. Это гарантирует, что устройства будут настроены, как только они будут подключены и обнаружены. Он передаёт информацию об обрабатываемом устройстве или изменениях его состояния в пользовательское пространство.

Рекомендуемые статьи:

Оставить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *