systemd:mkdirおよびExecStartPreのアクセス許可の問題


37

この(短縮された)systemdサービスファイルに問題があります。

[Unit]
Description=control FOO daemon
After=syslog.target network.target

[Service]
Type=forking
User=FOOd
Group=FOO
ExecStartPre=/bin/mkdir -p /var/run/FOOd/
ExecStartPre=/bin/chown -R FOOd:FOO /var/run/FOOd/
ExecStart=/usr/local/bin/FOOd -P /var/run/FOOd/FOOd.pid
PIDFile=/var/run/FOOd/FOOd.pid

[Install]
WantedBy=multi-user.target

してみましょう食べ物は、ユーザー名となりFOOすでに私のデーモンのために存在するグループ名、/usr/local/bin/FOOd

経由で/var/run/FOOd/デーモンプロセス/usr/local/bin/FOOdを開始する前にディレクトリを作成する必要があります# systemctl start FOOd.service。これは失敗します。mkdirはアクセス許可のためにディレクトリを作成できないためです。

...
Jun 03 16:18:49 PC0515546 mkdir[2469]: /bin/mkdir: cannot create directory /var/run/FOOd/: permission denied
Jun 03 16:18:49 PC0515546 systemd[1]: FOOd.service: control  process exited, code=exited status=1
...

ExecStartPreでmkdirが失敗するのはなぜですか?どうすれば修正できますか?(いいえ、mkdirにsudoを使用できません...)


FYI:私はDebianの8使用しています
マット・

エラーメッセージを英語に翻訳してください。
故スーフィー

1
... Jun 03 16:18:49 PC0515546 mkdir [2469]:/ bin / mkdir:ディレクトリ/ var / run / FOOd /を作成できません:許可なしJun 03 16:18:49 PC0515546 systemd [1] :FOOd.service:制御プロセスが終了し、code = exited status = 1 ...-
マット

回答:


56

追加する必要があります

PermissionsStartOnly=true

[Service]FOOdもちろん、ユーザーはにディレクトリを作成する権限がありません/var/run。manページを引用するには:

ブール引数を取ります。trueの場合、User =および同様のオプション(詳細についてはsystemd.exec(5)を参照)で設定された許可関連の実行オプションは、ExecStart =で開始されたプロセスにのみ適用され、他のさまざまなExecStartPre =には適用されません、ExecStartPost =、ExecReload =、ExecStop =、およびExecStopPost =コマンド。falseの場合、設定はすべての構成済みコマンドに同じ方法で適用されます。デフォルトはfalseです。


1
素晴らしい、まさに私が探していたもの。
ロバート

2
このオプションは、コマンドExecReload=をルート権限で実行します。これはあなたが望むものではないかもしれません。
-Rockallite

@Rockalliteは、私が引用したドキュメントが文字通り言っていることです。
-embik

2
PermissionsStartOnly廃止されました。参照:github.com/NixOS/nixpkgs/issues/53852今それを行う方法?
adrelanos

2
@adrelanosでは、+直後にを追加しExecStartPre=ます。例えばExecStartPre=+/bin/mkdir test
ジェイミー・スコット

28

これは、アクセス許可の問題を説明または修正する回答ではありませんが、systemds RuntimeDirectoryオプションを使用する必要があると思います。マニュアルページを引用する:

RuntimeDirectory=, RuntimeDirectoryMode=
       Takes a list of directory names. If set, one or more directories by
       the specified names will be created below /run (for system
       services) or below $XDG_RUNTIME_DIR (for user services) when the
       unit is started, and removed when the unit is stopped. The
       directories will have the access mode specified in
       RuntimeDirectoryMode=, and will be owned by the user and group
       specified in User= and Group=. Use this to manage one or more
       runtime directories of the unit and bind their lifetime to the
       daemon runtime. The specified directory names must be relative, and
       may not include a "/", i.e. must refer to simple directories to
       create or remove. This is particularly useful for unprivileged
       daemons that cannot create runtime directories in /run due to lack
       of privileges, and to make sure the runtime directory is cleaned up
       automatically after use. For runtime directories that require more
       complex or different configuration or lifetime guarantees, please
       consider using tmpfiles.d(5).

そのため、サービスファイルを次のように変更するだけです。

[Unit]
Description=control FOO daemon
After=syslog.target network.target

[Service]
Type=forking
User=FOOd
Group=FOO
RuntimeDirectory=FOOd
RuntimeDirectoryMode=$some-mode
ExecStart=/usr/local/bin/FOOd -P /run/FOOd/FOOd.pid
PIDFile=/run/FOOd/FOOd.pid

[Install]
WantedBy=multi-user.target

ありがとうありがとう。OpenVPN Ubuntuパッケージに悲しいことに欠けています!!
BaseZen

Licensed under cc by-sa 3.0 with attribution required.