Linux

綁定到 VM 內的 ipc 埠時出現 systemd 服務權限錯誤

  • February 1, 2021

我正在使用 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

都沒有成功。

您的問題是您將服務作為使用者服務 ( --user) 執行。使用者服務永遠無法在根文件系統中創建文件(/tmp唯一的例外)。

單元文件需要進入/etc/systemd/system(如果你手動將它放在那裡),或者進入/lib/systemd/system(如果你使用包管理器安裝它)。

然後你可以啟動/停止/啟用sudo systemctl start dummy等。

如果您確實需要將其作為使用者服務執行,您可以考慮為二進製文件提供必要的功能(請參閱此處此處)。另一個值得研究的選項是 polkit,但最好的選擇絕對是將其作為系統服務執行。

引用自:https://unix.stackexchange.com/questions/631564