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-накопителя к тестовой системе:
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. Это гарантирует, что устройства будут настроены, как только они будут подключены и обнаружены. Он передаёт информацию об обрабатываемом устройстве или изменениях его состояния в пользовательское пространство.
Связанные статьи:
- Как передавать файлы между Android и Linux (74.7%)
- Как в Linux подключить новый диск, разметить и отформатировать разделы (60%)
- Постоянные имена для блочных устройств (60%)
- Как проверить, использует ли компьютер BIOS или UEFI; загрузчик GRUB или systemd-boot; таблицу разделов MBR или GPT (60%)
- Как найти дубликаты файлов на Linux с помощью dupeGuru (50%)
- Как сделать общую сетевую папку в Linux (настройка SMB в Linux) (RANDOM - 15.4%)