systemdサービスをfstabマウント後に実行するように設定します


33

CIFSネットワークの場所が起動時にto 経由でマウントされたsystemd .serviceに開始することになっているスクリプトで作業しています。/etc/fstab/mnt/

このスクリプトは、OpenVPN依存関係スクリプトが最初に起動するのを待ちますが、マウントが完了するまで待つことも必要です。

/etc/systemd/system/my-daemon.service

[Unit]
Description=Launch My Daemon
After=network.target vpn-launch.service
Requires=vpn-launch.service

systemd.mount行に追加しようとしましたAfter=network.target vpn-launch.service systemd.mountが、期待した結果が得られませんでした。


リストに追加systemd-remount-fsしても機能しますAfterか?
エリックルヌーフ

回答:


40

CIFSネットワークの場所は、起動時に/etc/fstabto /mnt/を介してマウントされます。

いいえそうではありません。これを正しく行えば、残りは自然に配置されます。

処理されるマウント(生成)にsystemd ユニットマウントのようなものという名前になりますmnt-wibble.mountsystemctl list-units --type=mountコマンドの出力で実際の名前を確認できます。で他のユニットと同じように詳細に見ることができますsystemctl status

非常に簡単に言えば、マウントユニットが開始された後にユニットを開始するように命令する必要があります。

After = network.target vpn-launch.service mnt-wibble.mount

参考文献


10
「systemctl list-units --type = mount」でマウントを一覧表示する
-nijave

信者のために、「wibbleは」「foobarに」のように、単なるダミーの名前である
rogerdpack

17

申し訳ありませんが、まだコメントできません。

JdeBPが言ったように、ファイルシステムマウントで注文する必要があります。マウントユニットの名前を予測するか、代わりに(ユニットセクションで)を使用できます。

RequiresMountsFor = / absolute / path / of / mount

このオプションは、適切な* .mountユニットへの依存関係を作成して、サービスを開始する前にパスにアクセスできるようにします。すべてのsystemdバージョンにあるとは限りませんが、私は過去6か月ほど、CentOS 7マシンで使用しています。


(そして、バニラsystemdとの違いはここにあります。) RequiresMountsFor=独自の注意事項があります。RedHatのバグ#1088057クリスSiebenmann手に、あなたは答えることができるはずですsuperuser.com/questions/988734を。この質問でもCIFSマウントです。しかしauto、幸運なことに、それはそうです。
JdeBP

@JdeBPコメントありがとうございます。私はその機能に関する警告と問題を認識していませんでした。
ミゲルベルナディ

14

両方の答えは正しいですが、議論に2セントを加えたいと思います。それを探したとき、いくつかの指示と進め方の例が欠けていたからです。

  1. ファイルシステムを追加します /etc/fstab
  2. mount -afstabに記載されているすべてのファイルシステムをマウントするタイプ
  3. で生成されたsystemdユニットを探します:(

    systemctl list-units | grep '/path/to/mount' | awk '{ print $1 }'

    で終わるものを返す必要があります.mount
  4. 見つかったマウントユニットをファイル内のAfter=ステートメントに追加し*.serviceます

my-daemon起動時にサービスを開始する例を示しますが、ネットワークの準備が整った後、CIFS共有がにマウントされ/mnt/cifsvpn-launchサービスが開始されます。

/ etc / fstab

//servername/sharename /mnt/cifs cifs defaults,some,other,options 0 0

注:nofailfstabオプションに追加することもできます(外部ドライブを使用する場合など)。そうしないと、デバイスが接続されていないとマシンが起動しません。ArchWikiのfstabの記事をご覧ください


/etc/systemd/system/my-daemon.service

[Unit]
Description=Launch My Daemon
Requires=vpn-launch.service mnt-cifs.mount
After=network.target vpn-launch.service mnt-cifs.mount

[Service]
ExecStart=/path/to/my-daemon

[Install]
WantedBy=multi-user.target

起動時に開始されるようにサービスを有効にすることを忘れないでください: systemctl enable my-daemon

これは他のファイルシステム(NFS、HDDなど)でも機能することに注意してください。

すでに述べたように、両方の答えは正しいので、みんなに読んでもらうことをお勧めしますが、私にとってはいくつかの例が時間を節約してくれました。

更新(2019-06-25):

  • 外部ドライブの使用時にブートロックを防ぐためのfstabオプションに関する注意を追加しました
  • cifsマウントが正常にマウントされなかった場合に起動に失敗する原因となるリストに追加されmnt-cifs.mountましたRequires=my-daemon.service

明確にするために、「mnt-cifs.mount」は、特定のマウントポイントのマウントユニットの名前systemctl list-units --type=mountです。
smdvlpr

1

@ bm-bergmotte:ご指導ありがとうございました。私にとっては、私が置くなら、それはただ働いています

After=network.target vpn-launch.service mnt-cifs.mount
Requires=vpn-launch.service mnt-cifs.mount

「Requires」内に「mnt-cifs.mount」を(およびこの順序で)配置しない場合、再起動/起動には機能しますが、デバイスがマウントされていなくてもサービスは開始されます。デバイスがマウントされていない場合、「 "Requires"」内に追加で追加すると、サービスはデバイスをマウントしてから起動します。


あなたが正しいです。マウントが失敗した場合、とにかくmy-daemon.serviceが開始されます。After=順番を決めるだけです。Requires=cifsマウントが存在する必要があることを必須にします(その1つについてのSufiyan Ghoriの回答を参照)。回答を更新します。
bm-bergmotte
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.