Поиск по сайту:

Как использовать Udev для обнаружения устройств и управления ими в Linux


Udev (пространство пользователя /dev) — это подсистема Linux для динамического обнаружения и управления устройствами, начиная с версии ядра 2.6. Это замена devfs и hotplug.

Он динамически создает или удаляет узлы устройств (интерфейс драйвера устройства, который отображается в файловой системе, как если бы это был обычный файл, хранящийся в каталоге /dev) во время загрузки или если вы добавляете устройство в систему или удалить устройство из системы. Затем он распространяет информацию об устройстве или изменяет его состояние в пользовательское пространство.

Его функция заключается в том, чтобы 1) предоставлять системным приложениям события устройства, 2) управлять разрешениями узлов устройств и 3) создавать полезные символические ссылки в каталоге /dev для доступа к устройствам или даже переименовывать сетевые интерфейсы. .

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

В этой статье мы узнаем, как использовать Udev для обнаружения устройств и управления ими в системах Linux. Обратите внимание, что большинство, если не все основные современные дистрибутивы Linux поставляются с Udev как часть установки по умолчанию.

Изучите основы Udev в Linux

Демон udev, systemd-udevd (или systemd-udevd.service) взаимодействует с ядром и получает uevents устройства. > непосредственно из него каждый раз, когда вы добавляете или удаляете устройство из системы, или устройство меняет свое состояние.

Udev основан на правилах – эти правила гибкие и очень мощные. Каждое полученное событие устройства сопоставляется с набором правил, считанных из файлов, расположенных в /lib/udev/rules.d и /run/udev/rules.d.

Вы можете записать файлы пользовательских правил в каталоге /etc/udev/rules.d/ (файлы должны заканчиваться расширением .rules) для обработки устройства. Обратите внимание, что файлы правил в этом каталоге имеют наивысший приоритет.

Чтобы создать файл узла устройства, udev необходимо идентифицировать устройство, используя определенные атрибуты, такие как метка, серийный номер, используемый старший и младший номера, номер устройства шины и т. д. гораздо более. Эта информация экспортируется файловой системой sysfs.

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

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

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

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

udevadm monitor 

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

 
lsblk

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

udevadm info /dev/sdb1

Как работать с правилами 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-устройство удалено в date_time», как показано на снимке экрана.

cat /tmp/scripts.log

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

man udev
man udevadm
Краткое содержание

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

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