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

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

Все файлы устройств хранятся в каталоге /dev. Этот каталог генерируется во время загрузки специальным сервисом - 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

looking at device '/devices/pci0000:00/0000:00:11.0/ata1/host0/target0:0:0/0:0:0:0/block/sda':
KERNEL=="sda"
SUBSYSTEM=="block"
DRIVER==""
ATTR{ro}=="0"
ATTR{size}=="976773168"
ATTR{stat}==" 205 0 3408 339 0 0 0 0 0 234 339"
ATTR{range}=="16"
ATTR{discard_alignment}=="0"
ATTR{events}==""
ATTR{ext_range}=="256"
ATTR{events_poll_msecs}=="-1"
ATTR{alignment_offset}=="0"
ATTR{inflight}==" 0 0"
ATTR{removable}=="0"
ATTR{capability}=="50"
ATTR{events_async}==""

...

Опция -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 "

...

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/enp2s0

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

SUBSYSTEM=="net", ATTR{address}=="bc:ae:c5:be:8b:b7", 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 читайте:

man udev

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

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

Ответить

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

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