Настройка 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.

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

  1. Аватар Радик 14 января, 2016 Ответить
  2. Аватар TUX 19 августа, 2016 Ответить
  3. Аватар Konstantin 25 февраля, 2017 Ответить
  4. Аватар Ник 10 июля, 2017 Ответить

Ответить

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: