1. Главная страница » Компьютеры

Etc udev rules d

Автор: | 16.12.2019

Начнем с небольшого введения для новичков. Философия Unix гласит что все есть файл. Таким образом, файлы в Unix это не только информация хранимая на жестком диске, но и устройства. Да, в Linux жесткий диск, мышь, клавиатура, флешка, сетевой адаптер и другие устройства имеют свои файлы с помощью которых с ними и взаимодействуют различные системные программы.

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

Правила udev могут:

  • Переименовать устройство, например, жесткий диск или сетевую карту;
  • Создать дополнительное имя для устройства;
  • Поменять права доступа к устройству;
  • Установить владельца и группу;
  • Выполнить скрипт при подключении или отключении устройства.

Общая информация

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

Читайте также:  Check cable connection на ноутбуке lenovo

Правило Udev состоит из нескольких пар "ключ — значение" разделенных запятой. Одни ключи используются для проверки соответствия устройства определенному правилу, в таких ключах используется знак == для разделения пары, например: SUBSYSTEM=="block" — т е правило будет применено только если значения ключа SUBSYSTEM для этого устройства равно block. Другие ключи используются для указания действия если все условия соответствия выполняются. Для разделения пар в таких ключах используется знак равно "=", Например, NAME="mydisk". Ну и полностью правило:

SUBSYSTEM=="block", ATTR(size)=="1343153213", NAME="mydisk"

Это правило выполниться только для устройства подсистемы block и с размером 1343153213 байт. Откуда брать эти значения мы рассмотрим ниже, а пока разберемся что же значат те или иные ключи. Сначала ключи соответствия:

  • SUBSYSTEM — подсистема устройства;
  • KERNEL — имя выдаваемое устройству ядром;
  • DRIVER — драйвер обслуживающий устройство;
  • ATTR — sysfs атрибут устройства;
  • SUBSYSTEMS — подсистема родительского устройства;

Устройство может иметь родительские устройства, например жесткий диск имеет родительское устройство SSCI, которое в свою очередь имеет родительское устройство шину BUS. Иногда необходимо получить информацию из родительского устройства, для этого используются ключи SUBSYSTEMS, KERNELS, DRIVERS, ATTRS соответственно.

Для действий используются ключи:

  • NAME — установить имя файла устройства
  • SYMLINK — альтернативное имя устройства
  • RUN — выполнить скрипт при подключении устройства
  • GROUP — группа у которой есть доступ к файлу
  • OWNER — владелец файла устройства
  • MODE — маска прав доступа

Рассмотрим подробнее ключ ATTR. Он позволяет получить информацию об устройстве, доступную в sysfs. Например, ATTR=13413423124 если размер устройства равен 13413423124. Посмотреть все возможные sysfs параметры для устройства можно непосредственно в файловой системе /sys. Например, для диска /dev/sda есть каталог /sys/block/sda/ в котором можно найти файлы size, stat, ro, range и т д. Также посмотреть все возможные Udev параметры для устройства можно с помощью утилиты udevadm. Например, для диска /dev/sda:

udevadm info -a -n sda1

Опция -n задает имя устройства, -p путь в sysfs. Например, то же самое получим если выполнить:

udevadm info -a -p /sys/block/sda/sda1

Как переименовать устройство в Linux

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

SUBSYSTEM=="block", ATTR=="976773168", SYMLINK+="root"

Или смены названия:

SUBSYSTEM=="block", ATTR=="976773168", name="root"

Получим устройство /dev/root, которое будет указывать на корневой раздел (sda1), то же самое можно сделать для привода оптических дисков:

udevadm info -a -p /sys/block/sr0

SUBSYSTEM=="block", ATTRS=="DVDRAM GH22NS70 ", SYMLINK+="cdrom"

После перезагрузки появиться файл устройства /dev/cdrom. Хотя, конечно, это можно сделать без udev, прописав в автозагрузку команду создания символической ссылки:

ln -s /dev/sr0 /dev/cdrom

Как переименовать сетевую карту

Настройка udev linux на этом не заканчивается. Сетевая карта, тоже устройство и тоже управляется udev. Файлы сетевых устройств хранятся в /sys/class/net. Поэтому получаем информацию о ней с помощью udevadm:

udevadm info -a -p /sys/class/net/enp2s0

И создаем правило например на основе mac адреса:

SUBSYSTEM=="net", ATTR

=="bc:ae:c5:be:8b:b7", NAME="eth0"

Перезагружаем компьютер и теперь устройство называется eth0.

Как запустить скрипт при подключении устройства

Например, мы хотим автоматически скопировать все данные с флешки при ее подключении к компьютеру. Мы знаем что флешка будет называться /dev/sdb, тогда можно создать правило udev такого вида:

При подключении флешки выполниться скрипт /usr/bin/my_script, и сделает необходимые действия. Нужно заметить что скрипт не должен выполняться слишком долго, так как udev остановиться и будет ожидать завершения его работы.

Отладка правил

Если вы не уверенны правильно ли составлено правило можно воспользоваться командой udevadm test для проверки. В единственном параметре нужно передать путь sysfs устройства. Например проверим наше правило для жесткого диска:

$ udevadm test /sys/block/sda

Среди многочисленного вывода видим строчку:

creating link ‘/dev/root’ to ‘/dev/sda’

Значит все работает, настройка udev выполнена успешно.

Если же в правиле допустить синтаксическую ошибку, например, UBSYSTEM вместо SUBSYSTEM, udevadm test выдаст что то подобное:

read rules file: /etc/udev/rules.d/10-local.rules
unknown key ‘UBSYSTEM’ in /etc/udev/rules.d/10-local.rules:2
invalid rule ‘/etc/udev/rules.d/10-local.rules:2’

Здесь мы видим саму причину ошибки, неверный ключ, а также файл и строку в которой допущена ошибка.

Выводы

На этом все. Теперь вы знаете как создать правило udev и взять полностью под контроль все ваши устройства. Если нужна более подробная информация по созданию и использованию правил udev читайте:

Нет похожих записей

Оцените статью:

Об авторе

Основатель и администратор сайта losst.ru, увлекаюсь открытым программным обеспечением и операционной системой Linux. В качестве основной ОС сейчас использую Ubuntu. Кроме Linux интересуюсь всем, что связано с информационными технологиями и современной наукой.

4 комментария

Спасибо!
Довольно доходчиво написано. Свою задачу я решил!

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 к тестовой системе:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Сохраните файл и закройте его.

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

Теперь подключите USB-накопитель к компьютеру и проверьте, был ли запущен скрипт device_added.sh.

Прежде всего файл scripts.log должен быть создан в /tmp.

Затем файл должен иметь запись, такую как «USB device removed at date_time”»

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

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

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

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

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

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

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

Самый быстрый VPN

Рубрики

  • Аудит ИБ (30)
  • Вакансии (7)
  • Закрытие уязвимостей (95)
  • Книги (25)
  • Мануал (1 421)
  • Медиа (65)
  • Мероприятия (29)
  • Мошенники (20)
  • Обзоры (585)
  • Обход запретов (28)
  • Опросы (3)
  • Скрипты (88)
  • Статьи (207)
  • Философия (25)
  • Юмор (12)

Метки

Социальные сети

Hack shop

Поделиться

Anything in here will be replaced on browsers that support the canvas element

Не очень коротко про udev

kayo — Вс, 15/12/2013 — 00:44

Есть такая замудрёная штука в этих наших linux-ах, как udev. Это сервис, который подхватывает и конфигурирует периферию, получая уведомления от ядра. Он гибко настраивается под оборудование и задачи с помощью специальных правил. Стандартные системные правила обычно лежат в директории /lib/udev/rules.d, а наших инвалидов мы можем смело сохранять в /etc/udev/rules.d.

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

sysfs

Про sysfs (да-да ту самую, которая обычно монтируется в /sys), можно рассказать на большую статью, но здесь мы коснёмся только того, что нам чаще всего может понадобиться. Итак, вот некоторые важные для нас подкаталоги:

  • /bus — здесь расположены устройства по шинам обмена данными (неожиданно не правда ли ^_^ ). Как правило, сюда смотреть нам не понадобится, но будем иметь ввиду.
  • /class — тут устройства по классам. Это нам однозначно пригодится.
  • /devices — устройства по типам. Часто ядро бросает уведомления с путями устройств здесь, а из других подкаталогов сюда смотрят символьные ссылки.
  • /kernel/debug — файловая система отладочного интерфейса ядра. Может пригодится, чтобы смотерть, что не так с устройствами.

Будем иметь ввиду, что поскольку udev работает с sysfs, то все пути (syspath) следует рассматривать относительно /sys, то есть вместо /sys/devices/xyz писать /devices/xyz.

udevadm

Полезный инструмент для работы с udev, наверно, единственное, без чего нельзя обойтись при настройке.

Исследуем sysfs командой info

Вот как мы можем узнать, что udev думает об интересующем нас устройстве или подсистеме, для примера возьмём gpio на Raspberry Pi:

В этом примере мы не получили ничего интересного, но сможем сделать вывод, что это территория ядра. Записи вида ABCD==»abcd» это селекторы, которые могут быть использованы в качестве условий в правилах. Пойдём дальше, исследуем контроллер gpio:

Уже интереснее, подсистема gpio и появились атрибуты: начальный порт: 0, количество портов: 54, метка указывает на драйвер контроллера: bcm2708_gpio. Кстати путь изменился потому, что на самом деле /sys/class/gpio/gpiochip0 это символьная ссылка, заруленая на /sys/devices/virtual/gpio/gpiochip0, в чём не сложно убедиться.

Давайте посмотрим что-нибудь другое, например устройство i2c:

То, что мы здесь видим представляет собой иерархию вложенных друг в друга узлов от частного к общему. Выдавать такую ботву, как вы уже догадались, заставляет параметр —attribute-walk. Стоит обратить внимание на пути и на значения селекторов. У меня на этой шине сидят часы реального времени, поэтому можем сделать так:

Поменялся только самый нижний (то есть верхний) узел, теперь там собственно сами часы.

Ловим события командой monitor

Часто бывает полезно мониторить события ядра и udev, чтобы понять, что происходит, например при добавлении или удалении интересующих нас устройств. Мы можем запустить мониторинг так:

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

При этом в мониторе будет примерно следующее:

Пришло два события добавления устройства: одно от ядра, другое сгенерировал сам udev. Теперь можно исследовать появившееся устройство как мы это уже делали:

Как видим, всё так, как и ожидается. А теперь удалим порт:

Будет всё тоже самое, только действие удаление вместо добавления:

Пробуем писать правила

Итак, откуда что берётся мы более-менее разобрались, настало время написать какие-нибудь полезные правила.

Допустим, нам нужно предоставить доступ к устройствам gpio группе gpio. Создаём файл /etc/udev/rules.d/90-gpio.rules, цифра по традиции это приоритет правила. Для управления gpio, то есть активации/деактивации портов служат файлы /sys/class/gpio/export и /sys/class/gpio/unexport. Для управления направлением работы порта и получения/установки значения используются файлы /sys/class/gpio/gpioN/direction и /sys/class/gpio/gpioN/value соответственно. Всё, что нам нужно, переназначить группу для всех этих файлов в gpio, а затем дать права на запись в них для группы. Вот мой вариант правил:

Первое правило настраивает доступ к интерфейсам export/unexport, а второе — к direction и value каждого настроенного порта. Как было сказано выше, записи ABCD==»xyz» — это селекторы, задающие условие срабатывания правила. Правило действует, если все условия соблюдены. Записи ABCD=»xyz» — это действия, то есть то, что будет выполнено при активации правила. В селекторах можно использовать простые шаблоны:

  • «*» — любое количество символов, в том числе и не одного
  • «?» — один или ниодного символа
  • «[abcd]» — один из символов группы (можно задавать диапазоны вида [a-z], [0-9] и тд)

Слишком многого от шаблонов ожидать не следует, это вам не регулярные выражения, однако функционала вполне достаточно для всего. В наших правилах мы использовали шаблон [0-9]* для обобщения имени KERNEL номером устройства. Чтобы инвертировать действие селектора, надо писать его в виде ABCD!=»xyz».

В действиях можно использовать подстановки вида %xyz. Вот некоторые из них:

  • %k — имя KERNEL устройства
  • %n — номер KERNEL устройства
  • %p — значение DEVPATH

В наших правилах мы использовали подстановку %p, чтобы не писать длинное значение DEVPATH. Мы использовали действие вызова внешней программы в котором запустили оболочку, чтобы выполнить назначение группы и предоставить права доступа. Здесь может возникнуть мысль, что запускать оболочку — действие избыточное и не обязательное, однако, udev не выполнит более одной программы, указать дважды PROGRAM в одном правиле нельзя, потому что последнее присвоение заменит первое. Более хорошей идеей может быть написать правило дважды, но я не уверен, так ли это на самом деле.

Раньше, когда я исследовал внутренности sysfs, мне казалось странным огромное количество символьных ссылок в разных каталогах, которые порой заставляют следовать длинными зацикленными цепочками. Вся их полезность становится очевидна когда начинаешь писать правила udev. В нашем случае мы использовали символьную ссылку subsystem, чтобы прийти к интерфейсам управления портами, хоть в данном случае пример не очень показателен.

Тестируем правила

Чтобы понять, не накосячили ли мы случайно где-нибудь, можем сделать следующее:

Здесь мы форсируем событие, а udev читает правила и выполняет действия при совпадении условий. Я выполнил это под непривилегированным пользователем, поэтому получил ненулевой код возврата.

Чтобы добавленные правила начали работать, надо заставить демон их перечитать:

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

Давайте напишем ещё каких-нибудь правил. Как я говорил, у нас есть часы реального времени на шине i2c, однако, система не в состоянии правильно связать устройство часов с шиной без дополнительных правил. Логично использовать для этих целей событие добавления устройства i2c, возникающее при инициализации драйвера:

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

«>

Добавить комментарий

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