Главная >> Инструкции >> Настройка udev rules в Linux

Настройка udev rules в Linux

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

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

Правила udev помогут вам, если вы хотите:

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

Содержание статьи

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

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

touch /etc/udev/rules.d/10-local.rules

Правило 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{size}=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 для добавления альтернативного имени диска:

nano /etc/udev/rules.d/10-local.rules

SUBSYSTEM=="block", ATTR{size}=="976773168", SYMLINK+="root"

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

SUBSYSTEM=="block", ATTR{size}=="976773168", name="root"

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

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

ATTRS{model}=="DVDRAM GH22NS70"

Затем добавляем правило на основе модели:

nano /etc/udev/rules.d/10-local.rules

SUBSYSTEM=="block", ATTRS{model}=="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/enp24s0

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

SUBSYSTEM=="net", ATTR{address}=="00:d8:61:16:a5:a5", NAME="eth0"

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

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

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

KERNEL=="sdb", RUN+="/usr/bin/my_script"

При подключении флешки выполнится скрипт /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, читайте официальную документацию по udev в man.

6 комментариев к “Настройка udev rules в Linux”

  1. Написано доходчиво) Огромное спасибо за статью
    Но проблему не решил....
    ...у меня, с какогото ляда, правила нагло не срабатуют (в частности RUN),
    Хотя правила проверку проходят.
    Как с тем бороться?
    ЗЫ
    openSuSE42.2

    Ответить
  2. Подскажите, пожалуйста, вы написали "ужно заметить что скрипт не должен выполняться слишком долго". А если в команде скрипта указать в конце символ &(чтобы скрипт выполнялся в фоновом режиме), так никаких проблем не будет? Просто хочу синхронизировать файлы с флешки в фоновом режиме в момент подключения.

    Ответить

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