web-dev-qa-db-ja.com

systemd-サービス終了後にデバイスをアンマウントします。

Udevルールとsystemdを使用して自動バックアップのメカニズムを実装しようとしています。アイデアは、特定のストレージデバイスのホットプラグ時にバックアップルーチンを起動することです。これは この質問 と非常によく似ています。この方法で自分で回答を提供しましたが、ここではいくつかの議論に興味がありますさらに微調整します。つまり、バックアップサービスの終了後にデバイスをマウント解除する必要があります。

背景:

これまでのところ、udevを使用して、バックアップルーチンを実行するsystemdサービスを起動することができました。関連するファイルは次のとおりです。

backup.service

[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-backup.rules

KERNEL=="sd*", ATTRS{serial}=="<HD SERIAL HERE>", TAG+="systemd", ENV{SYSTEMD_WANTS}+="backup.service" 

質問:

ここで、backup.serviceが終了したらすぐにmnt-backup.mountを停止します。

ドキュメントによると ExecStartPost = はExecStart =のコマンドの後に実行されるので、追加してみました

ExecStartPost=/usr/bin/systemctl stop mnt-backup.mount

mnt-backup.mountを停止することはわかっていますが、backup.serviceに それ自体がバインドされています 、私が理解している限り、mnt-の前にbackup.serviceを停止する必要があります正常な停止のためのbackup.mount、したがって周期的な依存関係を作成します。

これをテストしたとき、カーネルパニックが発生する前に数回機能しました。これは、私のマシンで最初に見たもので、これが何らかの原因であるのかどうか疑問に思いました。

いずれにしても、私のアプローチは正しいですか?

7
brunocodutra

前のアプローチが確実に機能するかどうかはわかりませんが、確かに好ましいと思われる代替方法があります。

魔法のプロパティは StopWhenUnneeded と呼ばれます。これは、マウントファイルの[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によって明示的にサポートされているため、動作が保証されていることです。

また、サービスユニットで RefuseManualStart をtrueに設定することを強くお勧めします。これにより、ユーザーが手動でサービスを開始できなくなります。アイデアは、正確にバックアップメカニズムを自動化することです。したがって、ユーザーが明示的に開始することはできません。そのため、この責任は専らudevに任せてください。

5
brunocodutra