Хотя UUID не доступны напрямую через udev, по крайней мере, в Fedora и Ubuntu они задаются как переменные среды (ENV
). Вы можете прочитать все переменные среды устройства, вызвав udevadm info /dev/sdc
. Например, для NTFS на внешнем диске я получаю:
$ udevadm info /dev/sdc2
P: /devices/pci0000:00/0000:00:14.0/usb4/4-2/4-2:1.0/host7/target7:0:0/7:0:0:0/block/sdc/sdc2
N: sdc2
[…]
E: ID_FS_TYPE=ntfs
E: ID_FS_USAGE=filesystem
E: ID_FS_UUID=4A6F2ABC1232FA37
[…]
Все, что с E:
впереди, устанавливается как переменная окружения.
Сопоставление с UUID
Вы можете сопоставить его с ENV{ID_FS_UUID}=="4A6F2ABC1232FA37"
. В качестве первого фильтра я сопоставляю с KERNEL=="sd?2"
чтобы убедиться, что я работаю только с блочными устройствами с правильным номером раздела. Полное правило будет выглядеть так:
KERNEL=="sd?2", ENV{ID_FS_UUID}=="4A6F2ABC1232FA37", RUN+="/usr/bin/logger --tag my-manual-usb-mount Mounting the device with UUID 4A6F2ABC1232FA37", RUN+="/usr/bin/mount [Your mount options here]"
Команда logger полезна для подтверждения того, что правило действительно выполняется. Затем вы должны убедиться, что правило не содержит синтаксических ошибок с помощью udevadm test /dev/sdc2
. Ваш файл правил должен быть указан в выводе, и рядом с ним не должно появляться сообщений об ошибках. Теперь вы можете активировать все правила для вашего устройства, чтобы проверить, работает ли ваше правило в соответствии с планом: sudo udevadm trigger /dev/sdc2
. Если ваше правило соответствует, вы найдете пользовательское сообщение в системном журнале (/var/log/syslog
или через journalctl -b
).
Редактировать: ali_m указал, что переменные среды установлены по предыдущим правилам и, следовательно, доступны только в том случае, если ваш файл .rules
имеет достаточно высокий лексикографический порядок. Начиная с "60" должно быть достаточно. Лично я начинаю свои правила с "zz" (если возможно), чтобы сразу же отличить их от предопределенных правил.
Использование UUID в команде RUN
и в других местах
У Udev достаточно мощный синтаксис подстановки переменных и атрибутов. В частности, каждое вхождение $env{ID_FS_UUID}
будет заменено на UUID накопителя. Поэтому для монтирования устройства в /media/
UUID
вы можете использовать это правило:
KERNEL=="sd??", RUN+="/usr/bin/mkdir /media/$env{ID_FS_UUID}", RUN+="/usr/bin/mount $devpath /media/$env{ID_FS_UUID}"
Вы, вероятно, хотите вместо этого сконфигурировать udisks, он специализирован для проблемного пространства, которое вы хотите решить. См. Https://wiki.archlinux.org/index.php/udisks#udisks2:_mount_to_.2Fmedia в качестве отправной точки.
Фактический пример использования для монтирования устройств с помощью udev вместо /etc/fstab
или udisks - это монтирование файловых систем zfs, которые имеют некоторые особенности, что делает их не совсем подходящими для обычных инструментов.