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

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

Мануал

Udev (userpace / 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 с помощью команды monitor. Затем подключите устройство к вашей системе и наблюдайте с терминала, как обрабатывается событие устройства.

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

$ udevadm monitor 
monitor will print the received events for:
UDEV - the event which udev sends out after rule processing
KERNEL - the kernel uevent

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

$ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 465,8G 0 disk 
├─sda2 8:2 0 122,1G 0 part 
└─sda1 8:1 0 343,7G 0 part /

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

Чтобы запросить атрибуты устройства из базы данных udev, используйте команду info.

$ udevadm info /dev/sdb1
P: /devices/pci0000:00/0000:00:11.0/ata1/host0/target0:0:0/0:0:0:0/block/sda/sda1
N: sda1
S: disk/by-id/ata-HGST_HTS545050A7E680_RBF50AM53M3E8P-part1
S: disk/by-id/wwn-0x5000cca7a3f2f66e-part1
S: disk/by-path/pci-0000:00:11.0-ata-1-part1
S: disk/by-uuid/34ca8f2a-ac59-44d4-9701-8cd472ec9940
E: DEVLINKS=/dev/disk/by-path/pci-0000:00:11.0-ata-1-part1 /dev/disk/by-id/wwn-0x5000cca7a3f2f66e-part1 /dev/disk/by-uuid/34ca8f2a-ac59-44d4-9701-8cd472ec9940 /dev/disk/by-id/ata-HGST_HTS545050A7E680_RBF50AM53M3E8P-part1
E: DEVNAME=/dev/sda1
E: DEVPATH=/devices/pci0000:00/0000:00:11.0/ata1/host0/target0:0:0/0:0:0:0/block/sda/sda1
E: DEVTYPE=partition
E: ID_ATA=1
E: ID_ATA_DOWNLOAD_MICROCODE=1
E: ID_ATA_FEATURE_SET_APM=1
E: ID_ATA_FEATURE_SET_APM_CURRENT_VALUE=128
E: ID_ATA_FEATURE_SET_APM_ENABLED=1
E: ID_ATA_FEATURE_SET_HPA=1
E: ID_ATA_FEATURE_SET_HPA_ENABLED=1
E: ID_ATA_FEATURE_SET_PM=1
E: ID_ATA_FEATURE_SET_PM_ENABLED=1
E: ID_ATA_FEATURE_SET_PUIS=1
E: ID_ATA_FEATURE_SET_PUIS_ENABLED=0
E: ID_ATA_FEATURE_SET_SECURITY=1
E: ID_ATA_FEATURE_SET_SECURITY_ENABLED=0
E: ID_ATA_FEATURE_SET_SECURITY_ENHANCED_ERASE_UNIT_MIN=116
E: ID_ATA_FEATURE_SET_SECURITY_ERASE_UNIT_MIN=114
E: ID_ATA_FEATURE_SET_SECURITY_FROZEN=1
E: ID_ATA_FEATURE_SET_SMART=1
E: ID_ATA_FEATURE_SET_SMART_ENABLED=1
E: ID_ATA_ROTATION_RATE_RPM=5400
E: ID_ATA_SATA=1
E: ID_ATA_SATA_SIGNAL_RATE_GEN1=1
E: ID_ATA_SATA_SIGNAL_RATE_GEN2=1
E: ID_ATA_WRITE_CACHE=1
E: ID_ATA_WRITE_CACHE_ENABLED=1
E: ID_BUS=ata
E: ID_FS_TYPE=ext4
E: ID_FS_USAGE=filesystem
E: ID_FS_UUID=34ca8f2a-ac59-44d4-9701-8cd472ec9940
E: ID_FS_UUID_ENC=34ca8f2a-ac59-44d4-9701-8cd472ec9940
E: ID_FS_VERSION=1.0
E: ID_MODEL=HGST_HTS545050A7E680
E: ID_MODEL_ENC=HGST\x20HTS545050A7E680\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20\x20
E: ID_PART_ENTRY_DISK=8:0
E: ID_PART_ENTRY_NUMBER=1
E: ID_PART_ENTRY_OFFSET=2048
E: ID_PART_ENTRY_SCHEME=dos
E: ID_PART_ENTRY_SIZE=720795648
E: ID_PART_ENTRY_TYPE=0x83
E: ID_PART_ENTRY_UUID=a90897fa-01
E: ID_PART_TABLE_TYPE=dos
E: ID_PART_TABLE_UUID=a90897fa
E: ID_PATH=pci-0000:00:11.0-ata-1
E: ID_PATH_TAG=pci-0000_00_11_0-ata-1
E: ID_REVISION=GR2OA230
E: ID_SERIAL=HGST_HTS545050A7E680_RBF50AM53M3E8P
E: ID_SERIAL_SHORT=RBF50AM53M3E8P
E: ID_TYPE=disk
E: ID_WWN=0x5000cca7a3f2f66e
E: ID_WWN_WITH_EXTENSION=0x5000cca7a3f2f66e
E: MAJOR=8
E: MINOR=1
E: PARTN=1
E: SUBSYSTEM=block
E: TAGS=:systemd:
E: UDISKS_AUTO=1
E: UDISKS_IGNORE=1
E: UDISKS_PRESENTATION_NOPOLICY=1
E: USEC_INITIALIZED=2958671
E: net.ifnames=0

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

В этом разделе мы кратко обсудим, как писать правила udev.

Правило содержит список разделенных запятыми одной или нескольких пар ключ-значение.

Правила позволяют переименовывать узел устройства c имени по умолчанию, изменять разрешения и владение узлом устройства, запускать выполнение программы или скрипта, когда узел устройства создается или удаляется/

Мы напишем простое правило для запуска сrhbgnf при добавлении 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

Затем добавьте следующие строки в script_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 device removed at date_time”»

$ cat /tmp/scripts.log

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

$ man udev
$ man udevadm

 

Пожалуйста, не спамьте и никого не оскорбляйте. Это поле для комментариев, а не спамбокс. Рекламные ссылки не индексируются!
Добавить комментарий

  1. Michael Shigorin

    Судя по эмблеме справа сверху — соросята? Такие же безграмотные в itsec (с учётом пропаганды операций в /tmp), как и в просто жизни?..

    Эх. Взрослейте уже.

    Ответить
    1. cryptoparty автор

      Судя по эмблеме справа сверху — соросята

      Что это значит?

      как и в просто жизни?..

      Мы знакомы, чтобы за жизнь говорить?

      Ответить