Udev - это программа, которая управляет устройствами в системах GNU/Linux.
При подключении устройства, например, когда мы монтируем файловую систему - udev получает сообщение об этом событии от ядра и проверяет существуют ли правила для настройки устройства. То же происходит и при отключении устройства.
Udev позволяет создавать правила для обработки устройств и привязывать к ним действия, такие как запуск определенного скрипта или загрузка драйвера.
Например, с помощью udev, мы можем создать дополнительные символические ссылки на определённое устройство в каталоге /dev/. Это может пригодиться, поскольку ядро не гарантирует что одни и те же устройства будут всегда получать одинаковые симлинки.
Используя правила udev мы можем настроить собственные ссылки на нужное устройство и гарантированно получать в ОС константный путь к подключённому устройству.
Кроме того, udev в своих правилах позволяет не только применить настройки к устройству, но также и выполнить пользовательские скрипты или программы в ответ на события, связанные с устройствами. Это может быть полезно, если нужно автоматизировать какие-то действия при подключении или отключении устройства.
udev + udisks2
В одной из предыдущих статей, я рассказывал о программе Udisks2. Поскольку udisks по умолчанию монтирует устройства для конкретного пользователя (как правило в каталогах /run/media/<user>), это может создать проблемы при одновременной работе нескольких пользователей в системе — для доступа к устройству понадобится вводить пароль владельца.
Обойти это ограничение позволяет udev — с помощью правил, мы можем сообщить udisks2 что устройство должно монтироваться в режиме общего доступа (shared filesystem).
Udisks2 будет монтировать раздел не в пользовательском каталоге /run/media/<user>, а уровнем выше, куда будет доступ у других пользователей системы /run/media.
Правила udev
Чтобы настроить монтирование раздела в режиме общего доступа, нужно создать новое правило udev в каталоге /etc/udev/rules.d.
Имя файла выбирается по тем же правилам, как и в polkit (см. статью о polkit):
<ЧИСЛО>-<Название>.rules
Внутри этих файлов используется несложный формат из пар ключ/значение и простых операторов между ними.
Операторы
Операторы можно условно разделить на две группы – операторы для проверки и операторы для выполнения действия, например установки значения.
В списке ниже я привожу далеко не все доступные операторы, все их можно подсмотреть в man.
- == : Сравнивает значение атрибута с указанным значением. Например, ATTRS{idVendor}=="1234" .
- = : Устанавливает значение переменной или атрибута
- != : Сравнивает значение атрибута с указанным значением и возвращает true, если значение не совпадает. Например, KERNEL!="sda1"
- || : Логический оператор "или".
Скорее всего, в большинстве случаев, вам будет достаточно использовать оператор сравнения (==) и оператор установки значения (=).
Ключи
Ключи это некоторое представление тех или иных свойств устройства или события. Мы сопоставляем те или иные ключи, чтобы выполнить некоторое действие над нужным устройством.
Например, ключ KERNEL указывает на название устройства, присвоенное ядром — те самые названия, которые можно увидеть в каталоге /dev/, например, sda1, nvme1p1.
Существует множество ключей, которые можно использовать в правилах, тут привожу лишь некоторые из них:
- SUBSYSTEM — позволяет выбрать определенное подмножество устройств на основе их подсистемы, например, usb, input или sound
- ATTR — позволяет выбрать устройства на основе значения определенного атрибута, например, ATTR{manufacturer} или ATTR{serial}
- ACTION — позволяет выбрать определенный тип события, например, add (добавление устройства) или remove (удаление устройства)
- KERNEL — позволяет выбрать устройства на основе их имени устройства, мажорного и минорного номера, идентификатора производителя и т. д.
- ENV — позволяет установить или проверить переменную окружения устройства, например, ENV{ID_BUS} или ENV{ID_VENDOR}
- RUN — позволяет запустить определенную команду или скрипт в ответ на событие.
- MODE — позволяет установить определенные права доступа к файлу устройства.
Монтирование устройств udisks2 в режиме shared filesystem
Теперь, зная о базовых сущностях udev, мы можем с лёгкостью составить правило для монтирования требуемого диска с помощью udisks2 в режиме общего доступа.
Для того чтобы определённый раздел диска или устройство подключалось udisks2 требуемым образом, мы будем устанавливать переменную окружения UDISKS_FILESYSTEM_SHARED для конкретного устройства, выбираемого при помощи проверки ключа KERNEL:
KERNEL=="nvme1n1p1", ENV{UDISKS_FILESYSTEM_SHARED}="1"
В этом правиле задаётся подключение раздела nvme накопителя в режиме общего доступа.
Чтобы узнать идентификатор накопителя, можно воспользоваться командой lsblk
Теперь при подключении указанного раздела через, например, nautilus, раздел будет монтироваться в общий каталог, например /media/<имя_устройства>.