Вопрос или проблема
Я пытаюсь настроить систему так, чтобы скрипт выполнялся каждый раз, когда монтируется любое USB-устройство хранения (в данном случае автоматически монтируется с помощью systemd). На основе нескольких ссылок здесь, здесь и здесь, systemd позволяет выполнять пользовательские скрипты после монтирования конкретного устройства, но это либо:
- Требует конкретного устройства или точки монтирования.
- Использует udev, который срабатывает слишком рано и задерживает процесс монтирования.
- Использует аудиты или логи, что не совсем удовлетворительно.
Есть ли способ быть менее конкретным в модулях systemd, позволив использовать ExecStart
после любого успешного (авто)монтирования?
Я могу только указать путь.
cat /etc/udev/rules.d/bb-clam.rules
KERNEL=="sd[b-z]*", SUBSYSTEMS=="usb", TAG+="systemd", ENV{SYSTEMD_WANTS}="clamtk.service"
это запускает мою единицу clamtk.service cat /etc/systemd/system/clamtk.service
[Unit]
Description=clamtk
Requires=dev-media0.device
[Service]
Type=simple
User=alex
ExecStart=/bin/bash -c "/usr/local/bin/clam"
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=15s
[Install]
WantedBy=multiuser.target
Но это работает только хорошо, если ваша единица запускается как пользователь, и единица также срабатывает для USB-жестких дисков.
Ответ или решение
Чтобы запустить скрипт после каждого автомонтирования с помощью systemd, необходимо принять во внимание несколько аспектов, связанных с системой и конфигурацией systemd. Задача состоит в том, чтобы обеспечить автоматическое выполнение скрипта при каждом успешном (авто)монтировании USB-устройства. Рассмотрим пошаговое решение этой задачи.
Понимание системы и конфигурация
Сначала следует уточнить, что automounting через systemd включает в себя использование unit-файлов типа .automount
и .mount
. Однако для того чтобы запустить скрипт после каждого монтирования, требуется нечто большее, чем файлы для отдельных монтировок.
Решение с использованием Udev и Systemd
1. Определение файлов правил udev
Создайте файл правил udev, который будет мониторить подключение USB-устройств. Пример на основе вашего описания:
# /etc/udev/rules.d/99-usb-autorun.rules
KERNEL=="sd[b-z]*", SUBSYSTEMS=="usb", TAG+="systemd", ENV{SYSTEMD_WANTS}="usb-mount.service"
2. Определение unit-файла systemd
Создайте unit-файл systemd, который будет выполняться после монтирования:
# /etc/systemd/system/usb-mount.service
[Unit]
Description=USB Automount Script
After=dev-sd[b-z].device
[Service]
Type=oneshot
User=alex
ExecStart=/usr/local/bin/your-script.sh
[Install]
WantedBy=multi-user.target
Пожалуйста, замените /usr/local/bin/your-script.sh
на путь к вашему скрипту.
Принципы работы
-
Udev предоставляет возможность отслеживать события ядра и идентифицировать подключение USB-устройства, используя шаблон идентификации
KERNEL=="sd[b-z]*"
. -
Systemd через параметр
SYSTEMD_WANTS
в правилах udev запускает связанный unit-файл (usb-mount.service
). -
Параметр
After=dev-sd[b-z].device
в unit-файле systemd гарантирует, что выполнение вашего скрипта начнётся только после успешного обнаружения устройства.
Дополнительные сведения
-
Проверка конфигураций: Убедитесь, что все пути, указанные в конфигурационных файлах, корректны и что все скрипты имеют необходимые разрешения для выполнения.
-
Журналирование и аудиты: Рекомендуется включить логи для мониторинга успешности выполнения скрипта и устранения возможных проблем.
Заключение
Эта конфигурация позволяет добиться автоматического запуска скриптов после монтирования USB-устройств с минимальным вмешательством после первичной настройки. Она объединяет гибкость udev с мощью systemd для достижения поставленной цели.