停電後、ファイルシステムのマウント前にSystemdサービスが開始されます。

停電後、ファイルシステムのマウント前にSystemdサービスが開始されます。

問題が発生しました。システムサービスは、ローカルパーティションがマウントされる前、特に停電イベントの後に開始されます。調査の結果、システムの再起動とフォローアップによって問題が発生したことが確認されました。FSCK仕事。

問題を簡単に再現するために、最小限の概念証明を作成しました。詳細は次のとおりです。

test.service次のように構成されたsystemdというサービスがあります。

[Unit]
Description=fsck order POC
After=network-online.target local-fs.target remote-fs.target swap.target

[Service]
ExecStart=/bin/bash -c "date > /mnt/storage/hello"

[Install]
WantedBy=multi-user.target

私は/etc/fstab次のようにマウントポイントを設定しました。

/dev/sda1 /mnt/storage auto nosuid,nodev,nofail 0 2

実行sudo tune2fs -l /dev/sda1 | grep -i "mount count"結果:

Mount count: 1
Maximum mount count: 1

これは/dev/sda1、起動するたびにfsckが発生することを示しています。ただし、ファイルは、予期したディレクトリの代わりにhelloルートファイルシステムのディレクトリに作成されます。/mnt/storagesda1マウントポイント。

その結果、/mnt/storage起動後は何も表示されません。しかし、helloファイルを見ることができればumount /mnt/storage

test.service私の質問は:すべてのファイルシステムがマウントされ、スキャンされた後にスクリプトが実行されるようにするにはどうすればよいですか? (注:マウントポイントの名前は、クライアントサイトに展開するときに制御できないため、異なる場合があります。)

システムがUbuntuを実行しています。 Debian ではこの問題は発生しません。

この問題を解決する方法についての洞察や提案をいただきありがとうございます。助けてくれてありがとう!

答え1

私の意見に解決策

systemd.mountのマンページから:

nofail
            With nofail, this mount will be only wanted, not required,
 by local-fs.target or remote-fs.target. Moreover the mount unit is not ordered
 before these target units. This means that the boot will continue without
 waiting for the mount unit and regardless whether the mount point can be 
 mounted successfully.

そのフラグなしで試してみると local-fs.target

まず助けてください(この場合解決策はありません)

ランニング:

systemctl list-units --type=mount

マウントデバイスを識別し、systemdファイルのAfter =に追加します。

おそらく正しい単位を識別するのに役立ちます。

systemctl status <unit>

関連情報