У меня есть сервер под управлением Ubuntu Server 20.04, и я хочу запустить сценарий, как только известное устройство с шифрованием USB (LUKS) будет подключено к серверу.
Для запуска сценария у меня уже есть сценарий и служба systemd
, которая запускает службу после монтирования диска:
/etc/systemd/system/mybackup.service
[Unit]
Description=Backup
Requires=mnt-encrypted.mount
After=mnt-encrypted.mount
[Service]
ExecStart=/path/to/script.sh
Для внешний зашифрованный USB-накопитель, у меня есть запись в / etc / crypttab
encrypted UUID=<UUID> /path/to/key luks,noauto
И служба в /etc/systemd/system/mnt-encrypted.mount
[Unit]
Description=Mount unit for backup
[Mount]
What=/dev/mapper/encrypted
Where=/mnt/encrypted
Options=defaults
Однако я знаю, что mnt-encrypted.mount Не заполнен блок. Он должен запускаться после файла, сгенерированного systemd-cryptsetup-generator , чтобы том был расшифрован и его можно было смонтировать.
Как я могу это сделать? или чего не хватает в моем файле mnt-encrypted.mount ?
Edit
Прочитав кое-какие сообщения (добавленные в конце), я наконец понял, что systemd
не подключает ваш диск автоматически, когда вы подключаете его. Это udev
тот, который запускает установку, и вы можете указать, что это нужно сделать, через systemd
.
Что необходимо сделать:
/ etc / crypttab
, если диск зашифрован. / etc / fstab
с записью для внешний привод.Это сгенерирует модуль systemd
для монтирования udev
, которые будут запустить службу systemd
, когда диск подключен к Например:
[Unit]
Description=Backup service
Requires=mnt-human-readable-label.mount
After=mnt-human-readable-label.mount
[Service]
ExecStart=/path/to/backup-script.sh
User=your-user
Group=your-group
[Install]
WantedBy=mnt-human-readable-label.mount
/ etc / crypttab
human-readable-label UUID=your-disk-uuid /path/to/key luks,noauto,nofail
/ etc / fstab
/dev/mapper/human-readable-label /mnt/human-readable-label ext4 defaults,noauto,nofail,x-systemd.automount,x-systemd.device-timeout=15s,x-systemd.idle-timeout=30 0 0
/etc/udev/rules.d/99- my-usb-dribe.rules
(Используйте lsusb
для получения идентификатора продукта)
SUBSYSTEM=="usb", ACTION=="add", ATTRS{idProduct}=="id-product", ENV{SYSTEMD_WANTS}="external-backup.service", TAG+="systemd"
Затем:
# Copy the systemd service that will start the backup script to the right place
sudo cp external-drive/external-backup.service /etc/systemd/system/external-backup.service
# Reload file system services for creating mount services for the external drive
sudo systemctl restart local-fs.target
sudo systemctl restart remote-fs.target
# Enable the backup service
sudo systemctl enable external-backup.service
# Reload the UDEV ruls
sudo udevadm control --reload-rules
# Reload systemd daemon
sudo systemctl daemon-reload
Различные источники, которые я использовал:
Я знаю, что это достаточно старый вопрос, и проблема, вероятно, уже решена, но монтирование, как и все другие модули systemd, должно поддерживать зависимости
Общие элементы конфигурации настраиваются в универсальном [Unit ] и [Установить].
Таким образом, добавления следующего раздела [Install] должно быть достаточно:
[Install]
After = systemd-cryptsetup-generator.service
(я не уверен, является ли systemd-cryptsetup-generator сервисом, но если это что-то другое, достаточно изменить расширение)