用語、文法、慣例などの毀損がある場合は、事前にお詫び申し上げます。私はまだかなり新しい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
。- systemd サービスの ExecStart の selinux コンテキストのカスタマイズ
semanage fcontext -a -t bin_t "/home/deck/mnt/xtra/scripts/SyncSaves/sync_saves.sh"
restorecon -vR /home/deck/mnt/xtra/scripts/SyncSaves/sync_saves.sh
- SELINUXの場合、他のオプションは次のとおりです。
- プロンプトでタスクを実行し、すぐに許可モードに設定し、
setenforce 0
問題を解決します。問題がすぐに消えると、selinuxはそれをブロックします。 - 以下を実行してselinuxブロックを表示し、
tail -f /var/log/audit/audit.log
そのようなことが発生した場合は出力を表示できます。 /etc/selinux/config
selinuxを編集して再起動して、グローバルに許可モードに設定します。実行している操作がわからない限り、無効に設定しないことをお勧めします。許可はデフォルトで無効になっていますが、すべてを許可しますが、監査の内容も印刷します。 .log 問題を引き起こす可能性があります。
- プロンプトでタスクを実行し、すぐに許可モードに設定し、
systemd サービスがネットワークドライブで実行されない
次のようにこのインストールをインストールすると、/home/deck/Documents/scripts/SyncSaves/sync_saves.sh
問題のスクリプトやスクリプト、またはファイルが実行されないためです。 aを実行し、aがインストールオプションとして存在することを確認します。また、呼び出したいファイルに、そのファイルを実行するユーザーに対する実行権限があることを確認してください。noexec
/etc/fstab
sync_saves.sh
mount | grep home
noexec
.sh
.service
systemdがサービスが別のパーティションにあるのが好きではないという内容を読みました。
これ提供するsystemctl list-unit-files
daemon-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つが実際に何でも接続できることを意味します。これはそれ自体非常に複雑なトピックであり、おそらくこの質問/回答の範囲を超えている可能性があります。