udevルールとsystemdを使用して自動バックアップメカニズムを実装しようとしています。アイデアは、特定のストレージデバイスをホットプラグするときにバックアップルーチンを起動することです。この問題ところで、私は直接答えを提供しましたが、ここではいくつかの追加の調整について議論したいと思います。つまり、バックアップサービスが完了した後にデバイスをアンマウントしたいのです。
いくつかの背景:
これまで、私はudevを使用して独自にバックアップルーチンを実行するsystemdサービスを開始しました。関連書類は次のとおりです。
バックアップサービス
[Unit]
Description=<DESCRIPTION HERE>
BindsTo=<STORAGE DEVICE UNIT HERE>.device mnt-backup.mount
After=<STORAGE DEVICE UNIT HERE>.device mnt-backup.mount
[Service]
ExecStart=<CALL TO BACKUP SCRIPT HERE>
mnt-backup.mount
[Unit]
DefaultDependencies=no
Conflicts=umount.target
Before=umount.target
[Mount]
What=/dev/disk/by-uuid/<DEVICE UUID HERE>
Where=/mnt/backup
Type=<FILESYSTEM HERE>
90-バックアップ。ルール
KERNEL=="sd*", ATTRS{serial}=="<HD SERIAL HERE>", TAG+="systemd", ENV{SYSTEMD_WANTS}+="backup.service"
質問:
今、backup.serviceが完了したらすぐにmnt-backup.mountを停止したいと思います。
文書によると実行開始後 =ExecStart=コマンドの後に実行されるので、追加しようとしました。
ExecStartPost=/usr/bin/systemctl stop mnt-backup.mount
mnt-backup.mountが停止することを知っていますが、backup.serviceにそれ自体が結ばれている、私が理解している限り、適切に停止するには、mnt-backup.mountの前にbackup.serviceを停止する必要があるため、循環依存関係が生成されます。
私はこれをテストしながら何度も働きましたが、私のコンピュータで初めて見たカーネルパニックを経験したので、これが原因かどうか疑問に思いました。
いずれにせよ、私のアプローチは正しいですか?
ベストアンサー1
以前の方法が必ずしも効果があるかどうかはわかりませんが、より良い選択肢があります。
この魔法の属性は不要な場合は停止。これはマウントファイルの[Unit]でtrueに設定する必要があるため、次のようになります。
mnt-backup.mount
[Unit]
DefaultDependencies=no
Conflicts=umount.target
Before=umount.target
StopWhenUnneeded=true
[Mount]
What=/dev/disk/by-uuid/<DEVICE UUID HERE>
Where=/mnt/backup
Type=<FILESYSTEM HERE>
とても簡単です。
このアプローチの最大の利点は、systemdで明示的にサポートされているため、動作が保証されることです。
私も設定を強くお勧めします手動起動拒否ユーザーが手動でサービスを開始できないようにするには、サービス単位でtrueに設定します。アイデアは正確にバックアップメカニズムを自動化することであるため、ユーザーが明示的に起動できないようにする必要があるため、この責任を完全にudevに任せることをお勧めします。