Используйте UUID в правилах udev и подключите USB-диск к / media / $ UUID


13

Я хочу смонтировать USB-накопитель на /mediaоснове UUID диска. Как я могу использовать UUID USB-диска в файле правил udev и что такое правило udev для монтирования USB-диска с номером UUID в качестве имени папки.

Команда blkidвыводит UUID диска, но только после монтирования.


1
Предупреждение 2019. В современных настольных системах Linux, использующих systemd, правила udev не монтируют файловые системы в обычном пространстве имен пользователя, т.е. вы не можете монтировать файловую систему с помощью команды mount в правиле udev. Кроме того, в этих системах система предохранителей (пользовательских файловых систем) сконфигурирована для обработки подключений USB через значок на рабочем столе, поэтому монтирование вручную с использованием правила fstab в некоторой степени противоречит системе предохранителей. Для автоматического монтирования файловых систем USB с помощью UUID на автономном сервере лучше всего удалить конфигурацию системного предохранителя и использовать правила udev для запуска служб моноблочного монтирования.
Джонатан Бен-Авраам,

Посмотрите на это решение, используя fstab, systemd и automount, протестированное на недавнем Debian: unix.stackexchange.com/a/347007/31228
Джонатан Бен-Авраам,

Ответы:


14

Хотя 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/fstabudisks - это монтирование файловых систем zfs, которые имеют некоторые особенности, делающие их не совсем подходящими для обычных инструментов.


1
Один важный момент, который мне потребовалось некоторое время, чтобы понять: для сопоставления с переменными среды ваше правило должно быть применено после того, как эти переменные установлены. Для этого имя вашего .rulesфайла должно начинаться с цифры> 60 .
ali_m

@ali_m: Спасибо, я добавил твою информацию в ответ.
Персеиды

Ubuntu 18.04, некоторые команды udevadm могут быть указаны в / dev / sdXX (например, информация udevadm), другие должны быть указаны по какой-либо причине в / sys / block / sdXX (например, тест udevadm).
Грег Белл

0

Мне пришло в голову грубое решение. Установите соответствующую запись fstab, которая идентифицируется UUID. И в правилах udev выполняйте mount -aкаждый раз, когда добавляется новое устройство sd *.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.