仮想マシンのipcポートにバインドするとシステムサービス権限エラーが発生する

仮想マシンのipcポートにバインドするとシステムサービス権限エラーが発生する

私はネットワーク通信サービスをシミュレートするためにvagrantを使用しています。私のデフォルトのボックスはubuntu / bionic64です。 VMに移植するアプリケーションはC ++で書かれており、次のようにipcアドレスにバインドされています。

sink.bind("ipc:///var/run/dummy-service");

したがって、このサービスを/usr/bin/にコンパイルしてインストールし、systemctl次のサービスファイルを使用して必要なサービスを作成します。

[Unit]
Description=dummy manipulator
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/run/dummy-service.pid
ExecStart=/usr/bin/dummy-service
[Install]
WantedBy=multi-user.target

サービスファイルの場所は次のとおりです。$HOME/.config/systemd/user/dummy.service

したがって、次のコマンドを実行するとき:

systemctl --user enable dummy.service
systemctl --user start dummy.service

ステータスの実行中に終了コードエラーが発生します。

 dummy.service - belt and electrodes status manipulator
   Loaded: loaded (/home/vagrant/.config/systemd/user/dummy.service; enabled; vendor preset: enabled)
   Active: failed (Result: exit-code) since Thu 2021-01-28 23:52:58 UTC; 18s ago
  Process: 22420 ExecStart=/usr/bin/dummy-service (code=exited, status=1/FAILURE)
Jan 28 23:52:58 ubuntu-bionic systemd[20920]: Starting dummy manipulator...
Jan 28 23:52:58 ubuntu-bionic systemd[20920]: dummy.service: Control process exited, code=exited status=1
Jan 28 23:52:58 ubuntu-bionic systemd[20920]: dummy.service: Failed with result 'exit-code'.
Jan 28 23:52:58 ubuntu-bionic systemd[20920]: Failed to start dummy manipulator.

後でサービスが許可されていないため、権限エラーであることがわかりました/var/run/。バインディングを次に切り替えたとき、sink.bind("ipc:///tmp/dummy-service");サービスは明らかに問題なく実行されました。

 dummy.service - dummy manipulator
   Loaded: loaded (/home/vagrant/.config/systemd/user/dummy.service; enabled; vendor preset: enabled)
   Active: activating (start) since Fri 2021-01-29 00:06:04 UTC; 30s ago

/var/runそのアドレスにバインドされたサービスを実行するにはどうすればよいですか?

スーパーユーザーとしてバイナリをインストールしようとしましたが、chmod 777サービスファイルのオプションを変更してみました。

User=root
Group=root

すべて失敗しました。

ベストアンサー1

問題は、サービスをユーザーサービス(--user)として実行していることです。ユーザーサービスはルートファイルシステムにファイルを生成できません(/tmp唯一の例外)。

/etc/systemd/systemユニットファイルは(手動で挿入した場合)または/lib/systemd/system(パッケージマネージャを使用してインストールした場合)に入れる必要があります。

その後、起動/停止/アクティブ化sudo systemctl start dummyなどを実行できます。

ユーザーサービスとして実行する必要がある場合は、バイナリに必要な機能を提供することを検討してください。ここそしてここ)。見てみる価値があるもう1つのオプションはpolkitですが、最善の選択肢は確かにシステムサービスとして実行することです。

おすすめ記事