systemd サービスがネットワークドライブで実行されない

systemd サービスがネットワークドライブで実行されない

用語、文法、慣例などの毀損がある場合は、事前にお詫び申し上げます。私はまだかなり新しいLinuxユーザーです。私は最新のSteamOS(3.5.17)を実行するSteam Deckを開発しています。

設定を使用してサービスを正常に開始して終了しました。システムSteam DeckとRaspberry Piで設定したSAMBA共有ネットワークドライブ間でゲームの保存を同期します。ドライブが「/home/deck/mnt/xtra/」(fstab経由)に自動的にマウントされるように設定しました。各サービスが実行されます。強く打つ"sync_saves.sh"スクリプトは、それぞれ起動および終了時に呼び出されます。

問題は、「sync_saves.sh」スクリプトをネットワークドライブに保存し、そこで実行して簡単に更新できることです。このスクリプトは、ネットワーク上の他のコンピューターから頻繁に更新される構成ファイルを読み取ります。手動で同期を維持することは非常に苦痛なので、それぞれのローカルバージョンを持つことを望まない。ただし、ネットワークドライブから直接スクリプトを実行できますが、提供するスクリプトがネットワークドライブにある場合は実行されません。エラーがある場合、次の実行時にエラーは表示されません。

systemctl --user status ss_lin_startup

これら 2 つのサービスは、ss_lin_startup.service および ss_lin_shutdown.service というファイルで定義されています。ここに含まれる内容は次のとおりです。

ss_lin_startup.service

[Unit]
Description=SyncSaves Startup

[Service]
#ExecStart=/home/deck/mnt/xtra/scripts/SyncSaves/sync_saves.sh #network drive, doesn't work
ExecStart=/home/deck/Documents/scripts/SyncSaves/sync_saves.sh #local drive, works

[Install]
WantedBy=default.target

ss_lin_shutdown.service

[Unit]
Description=SyncSaves Shutdown

[Service]
Type=oneshot
RemainAfterExit=true
#ExecStop=/home/deck/mnt/xtra/scripts/SyncSaves/sync_saves.sh #network drive, doesn't work
ExecStop=/home/deck/Documents/scripts/SyncSaves/sync_saves.sh #local drive, works

[Install]
WantedBy=default.target

「/home/deck/.config/systemd/user/」にサービスファイルへのリンクを入れて、次のコマンドを実行して(スクリプトがローカルドライブに保存されている場合)、それを機能させました。

systemctl --user daemon-reload
systemctl --user enable ss_lin_startup.service
systemctl --user enable ss_lin_shutdown.service

重要な場合、サービスファイルは「/home/deck/Documents/scripts/SyncSaves/services」に保存され、「/home/deck/.config/systemd/user/」フォルダにリンクされます。 Steam Deckデスクトップ環境では、ファイルをドラッグアンドドロップして移動、コピー、またはリンクするオプションを提供します。これが私がリンクを作成するために使用する方法です。

動作させる方法はありますか?私はこの問題を正しい方法で処理していますか?または、起動時に "sync_saves.sh"スクリプトをネットワークドライブからローカルドライブに自動的にコピーする方法はありますか?

私は数時間インターネット検索をしてきたが、私が得た唯一のヒントは次のとおりです。

-systemdがサービスが別のパーティション(おそらくシステムパーティション)にあるのが好きではないという内容を読んだが、正しく理解したのか、ここに意味が適用されるのか、スクリプトが呼び出す場所が重要なのかはわかりません。保存されます。

- このトピックに関するほとんどのディスカッションでは、サービスは "/ etc / systemd / system /"に配置またはリンクされています。 Raspberry Piの初期テストではこの方法を使用しましたが、Steam Deckに問題が発生しました。

修正する:

問題の一部を解決しましたが、まだ解決策はありません。これが起こる可能性があると思いますが、解決策がわかりません。私は走った

systemctl --user -l status ss_lin_startup.service

より詳細な出力が得られます。 「実行ファイルが見つかりません... sync_saves.sh」というメッセージが表示されます。したがって、おそらく(少なくとも起動時に)何が起こっているのかは、ドライブがまだマウントされていないことです。人々は、ネットワークが起動した後にコマンドが実行されるようにサービスファイルで別のパラメータを使用することを見ました(例:Wants = network-online.target、After = network-online.target)。ただし、このパラメータを使用すると何かが得られます。 「対象が見つかりません」と同じです。

最終更新:

私が考えた解決策は、アップデートスクリプトを作成し(ネットワークドライブから最新バージョンのsync_saves.shと設定ファイルを抽出し)、アップデートスクリプトを実行するスクリプトを作成し、同期スクリプトを実行することでした。これは期待どおりに機能します。 SteamOSの機能に関する情報があまりないと思うので、ここでどれほど進展があるのか​​わかりません。

答え1

  • SELINUXがある場合実装するデフォルトモード(RHEL 8.9など)では、 selinux は、/home/deck/mnt/xtra/scripts/SyncSaves/sync_saves.shファイルが実行を許可する selinux コンテキストとして表示されない限り、サービスが実行されないようにします。私はこの質問をしましたが、どんな難しい慣習もないようですbin_t
  • SELINUXの場合、他のオプションは次のとおりです。
    • プロンプトでタスクを実行し、すぐに許可モードに設定し、setenforce 0問題を解決します。問題がすぐに消えると、selinuxはそれをブロックします。
    • 以下を実行してselinuxブロックを表示し、tail -f /var/log/audit/audit.logそのようなことが発生した場合は出力を表示できます。
    • /etc/selinux/configselinuxを編集して再起動して、グローバルに許可モードに設定します。実行している操作がわからない限り、無効に設定しないことをお勧めします。許可はデフォルトで無効になっていますが、すべてを許可しますが、監査の内容も印刷します。 .log 問題を引き起こす可能性があります。

systemd サービスがネットワークドライブで実行されない

次のようにこのインストールをインストールすると、/home/deck/Documents/scripts/SyncSaves/sync_saves.sh問題のスクリプトやスクリプト、またはファイルが実行されないためです。 aを実行し、aがインストールオプションとして存在することを確認します。また、呼び出したいファイルに、そのファイルを実行するユーザーに対する実行権限があることを確認してください。noexec/etc/fstabsync_saves.shmount | grep homenoexec.sh.service

systemdがサービスが別のパーティションにあるのが好きではないという内容を読みました。

これ提供するsystemctl list-unit-filesdaemon-reload.... your file の実行後に認識されるファイルですss_lin_startup.service。サービスファイルが呼び出されているかどうかにかかわらず、execstart実行execstopのために呼び出されるすべてのファイルには、selinuxが実行されたときに実行が許可される各selinuxルールに対してselinuxタグが必要ですbin_t。このファイルの場所は、noexecマウントオプションを使用してnfsマウントにない限り、重要ではありません。

sync_saves.shまた、最初の行にあることを確認してください#!/bin/bash。それ以外の場合、私の経験によれば、ファイルから呼び出すと実行されません.service

答え2

ネットワークファイルシステムでシステムサービスを実行する方法に関する質問の主な部分には、基本的に2つの質問があります。 1つは、与えられたパス/マウントポイントが利用可能でなければならないという条件をsystemdデバイスに追加することです。もう1つは、systemdが最初にそのパス/マウントポイントを実際にマウントする方法です。なぜならこれに頼らなければならないからです。

  • パスに対するシステム単位の依存関係

次のように、ネットワークファイルシステムパスへの依存関係を追加する必要があります。インストールが必要=オプション。これは階層化されたインストールにも当てはまります(/homeはおそらく別々のファイルシステムであり、/home/deck/mnt/xtraは説明に従ってその下にマウントされたネットワークファイルシステムです)。

見積もりの​​説明:

スペースで区切られた絶対パスのリスト。指定されたパスにアクセスするために必要なすべてのインストール単位に対して、Requires =およびAfter =タイプの依存関係を自動的に追加します。

noautoとマークされたマウントポイントはlocal-fs.targetを介して自動的にマウントされませんが、このオプションの目的によっては依然として尊重されます。つまり、デバイスからドラッグします。

だから追加してみてください

RequiresMountsFor=/home/deck/mnt/xtra/scripts/SyncSaves/sync_saves.sh

ここにありますss_lin_startup.service。を実行すると、簡単にこれを行うことができますsystemctl edit --full --user ss_lin_startup.service。その後、システムサービスを編集でき、その後も実行されますsystemctl daemon-reload --user

  • systemdが/etc/fstabからアイテムをマウントする方法

/etc/fstab のすべてのエントリは、次のように systemd によって解析されます。systemd-fstab-ジェネレータ.mount起動するたびに、それぞれについていわゆるセルを作成します。ネットワークファイルシステムの場合は、常に追加する必要があります。_netdev解析時に、/etc/fstabエントリのオプションとしてペアをsystemd-fstab-generator追加しますremote-fs.target。これは通常、ネットワークファイルシステムをマウントする前にシステムがネットワークを使用できるようになるのを待つのに十分な信頼性があります。

--- * 通常、ネットワーク接続とオンラインネットワークの間に違いがあることを意味します。つまり、開始されたネットワーク接続の1つが実際に何でも接続できることを意味します。これはそれ自体非常に複雑なトピックであり、おそらくこの質問/回答の範囲を超えている可能性があります。

関連情報