Оглавление |
---|
Введение
В
обновлениях Astra Linux до обновления x.7.2 для управления подключаемыми устройствами
совместно используются механизмы udev и mount. См. Съемные носители в Astra Linux. В данной статье рассматривается пример сценария, использующего механизм udev для автоматического монтирования съемных носителей. Сценарий имеет следующие особенности:
- монтирование выполняется в предопределенную точку монтирования (/media/<имя_устройства>);
- монтирование выполняется для всех пользователей (примонтированное устройство доступно для чтения и записи всем пользователям;
- размонтирование устройства доступно всем пользователям.
Информация |
---|
Данная статья применима к: |
|
Предупреждение |
---|
Предлагаемый в настоящей статье сценарий монтирования предназначен исключительно для демонстрации приемов работы. Для практического применения предлагаемый сценарий должен быть доработан в соответствии с поставленными задачами. В частности, автоматически примонтированные сценарием носители с файловой системой NTFS не могут быть размонтированы через службу fly-reflex (графическое приложение). Однако при этом пользователи могут использовать для размонтирования команду umount из командной строки. Применение собственных сценариев обработки событий udev одновременно с использованием учтенных носителей (см. Съемные носители в Astra Linux) допустимо только в рамках действующих правил безопасности.. |
Перехват события udev
События udev ("action") возникают при изменении статуса подключенных устройств. Наиболее употребительные события:
- физическое подключение устройства (событие "add");
- физическое отключение (извлечение) устройства (событие "remove");
- смена носителя в устройстве (событие "change"). Используется для устройств типа компакт-диск (CD- и DVD-приводы).
Перехват событий осуществлятся осуществляется с помощью сценариев обработки. Файлы со сценариями - обработчиками событий udev располагаются в каталогах:
- /lib/udev/rules.d/
- /run/udev/rules.d/
- /etc/udev/rules.d/
Каталоги обрабатываются в том порядке, в котором они перечислены. Перед выполнением файлы упорядочиваются по алфавиту. Файлы с одинаковыми именами - переписываются последним найденным файлом, т.е. файл, найденный в последнем каталоге (/etc и /lib/udev/rules.d/) заменит собой ранее найденный файл с таким же именем.
Стандартно имя каждого файла - сценария начинается с двух цифр, и имеет расширение .rules.При обработке события файлы выполняются в порядке алфавитной сортировки независимо от каталога, к котором они размещены.
Пример файла перехвата события /etc/udev/rules.d/99-local.rules:
Информацияcode | ||
---|---|---|
| ||
KERNEL=="sd[a-z]|sd[a-z][0 1-9]", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service" ", RUN+="/usr/bin/logger -s -t Astra StepAdd" KERNEL=="sd[a-z][0 |sd[a-z][1-9]", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.servic service", RUN+="/usr/bin/logger -s -t Astra StepRemove" KERNEL=="sd[a-z]|sd[a-z][1-9]", SUBSYSTEMS=="usb", ACTION=="change", RUN+="/bin/systemctl reload usb-mount@%k.service", RUN+="/usr/bin/logger -s -t Astra StepReload" |
Этот перехватчик обрабатывает события подключения/отключения дисковых разделов с именами:
- начинающимися с букв "sd", после которых следует одна любая строчная буква ([a-z]) — такие имена используются для дисковых разделов с файловой системой vfat и, иногда, NTFS;
- начинающимися с букв "sd", , после которых следует одна любая строчная буква ([a-z]), после которой следует одна цифра ([0-9]) — такие имена используются для дисковых разделов ext2/ext3/ext4 и NTFS.
Для отладки в сценарий вставлены команды трассировки выполняемых вызовов:
Блок кода |
---|
RUN+="/usr/bin/logger -s -t Astra_USB ... |
Отладочные сообщения отмеченные тегом Astra_USB записываются в системный журнал /var/log/syslog.
Сам перехватчик не выполняет устройств, однако не выполняет при этом прямых действий, а вызывает для выполнения этих действия системную службу usb-mount@%k.service, то есть вызывает сценарий обработки события как системную службу.
При выполнении правила обработки события служба udev вместо специальной переменной %k автоматически подставит имя подключаемого объекта (полный список специальных переменных имеется в документации). Т.е. при подключении дискового раздела, например, /dev/sdb1, будет выполняться команда:
Command |
---|
/bin/systemctl start usb-mount@sdb1.service |
Имя вызываемой службы usb-mount@%k помимо переменной %k содержит символ "коммерческое at" ("собака", "@"), имеющий специальный смысл: при вызове службы в имени которой содержится символ "@" системная служба вызова служб разберет это имя на части, и передаст часть, находящуюся после символа "@" вызываемой службе как параметр. Т.е. вызов:
Блок кода |
---|
systemctl start usb-mount@sdb1.service |
превратится в вызов службы usb-mount с параметрами start и sdb1. Как организовать такую обработку этого вызова и саму службу описано ниже.
Для того, чтобы новый сценарий обработки был зарегистрирован системой и начал работать, необходимо перезагрузить Новые (добавленные) правила обработки регистрируются системой автоматически, однако после внесения изменений в существующие правила следует обновить правила udev командой:
Command |
---|
udevadm control --reload-rules |
Вызов сценария обработки события как системного сервиса
Итак, сценарий обработки вызывается как системный сервиссистемная служба. Для вызова сервисов системных служб используются так называемы называемые "юниты" (units), специальные сценарии запуска сервисовслужб, расположенные в каталоге каталогах /etc/systemd/system/.
Пример сценария обработчика вызова службы для вышеуказанного правила перехвата события udev разместим в файле /etc/systemd/system/usb-mount@.service обработчика события:
Информация | ||
---|---|---|
| ||
[Unit] |
Этот сценарий умеет обрабатывать две команды - старт и стопstart (параметр ExecStart) и stop (параметр ExecStop), но сам опять ничего не делает, а вызывает исполнимый файл сценария обработки события (для примера - файл /usr/local/bin/usb-mount.sh). При вызове файлу передается параметр, определяющий действие (в примере выше - add или remove) и специальный параметр %i, вместо которого автоматически подставляется часть имени вызова службы, находящаяся после символа "@", т.е. в используемом примере - sdb1.
Сценарий обработки события
Сценарий обработки события в принципе может размещаться где угодно, для . Для примера используем используется файл /usr/local/bin/usb-mount.sh. Комментарии см. в тексте сценария. Важные особенности работы сценария:
- монтирование устройств vfat:
- выполняется от имени пользователя nobody ("никто") и группы nogroup ("никакая группа");
- на устройство устанавливается маска доступа (umask) 000, разрешающая доступ на чтение и запись к файловым объектам на устройстве всем пользователям;
- при монтировании для повышения безопасности используется опция users, которая при выполнении монтировании интерпретируется как опции "noexec, nosuid, nodev":
- noexec — запрет исполнения двоичных файлов, расположенных на носителе;
- nosuid — запрет применения битов установки идентификатора пользователя и идентификатора группы, используемых для изменения (повышения) привилегий;
- nodev — запрет применения файлов, расположенных на устройстве, как файлов символьных или блочных устройств;
в файл /etc/fstab добавляется строка вида:
Блок кода <имя_устройства> <точка_монтирования> auto <опции_монтирования>
Наличие такой строки позволяет выполнять операцию монтирования с помощью команды mount указанного устройства в указанную точку любому пользователю. Дополнительно сценарий в опциях монтирования указывает:
Опция монтирования users. Наличие этой опции, когда она указана в файле /etc/fstab, помимо задания опций "noexec, nosuid, nodev" при монтировании, имеет дополнительную функцию: наличие этой опции разрешает размонтировать устройство любому пользователю;
- Опция монтирования noauto. Наличие этой опции исключает автоматическое монтирование носителя при загрузке ОС (или при выполнении команды mount -a).
Текст сценария:
Информация | ||
---|---|---|
| ||
#!/bin/bash # Этот сценарий вызывается из системного юнита как сценарий обработки подключения/отключения накопителей .и должен получать два параметра ACTION=$1${1:-} # Проверяем, не примонтировано ли уже устройство # Получаем информацию # Получение и сохранение в переменных информации об устройстве : метка $IDID_FS_LABEL, идентификатоп $IDID_FS_UUID, и тип файловой системы $IDID_FS_TYPE # Глобальные опции монтирования # Специфические для файловых систем опции монтирования: UUID=`lsblk $DEVICE -no UUID`
chmod 777 ${MOUNT_POINT} if ! /bin/mount -o ${OPTS} ${DEVICE} ${MOUNT_POINT}; then $log echo "**** Устроййство Устройство ${DEVICE} смонтировано примонтировано в ${MOUNT_POINT} ****" do_unmount() { do_reload() { case "${ACTION}" in |
После создания файла сценария не забыть сделать его исполнимым:
Command |
---|
sudo chmod +x /usr/local/bin/usb-mount.sh |
Приемы отладки
Включение вывода отладочных сообщений udev в файл /var/log/syslog:
Информация |
---|
sudo udevadm control -l debug |
Тестовая отработка правил udev без их загрузки:
Command |
---|
udevadm test /dev/sdb1 |
Мониторинг событий udev:
Command |
---|
udevadm monitor -k -u -p |
Путь к устройству:
Command |
---|
udevadm info -q path -n /dev/sdd1 |
Полная информация об устройстве:
Command |
---|
udevadm info -a -p $(udevadm info -q path -n /dev/sdd1) |