绑定到虚拟机内的 ipc 端口时出现 systemd 服务权限错误

绑定到虚拟机内的 ipc 端口时出现 systemd 服务权限错误

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

如果您确实需要将其作为用户服务运行,您可以考虑为二进制文件提供必要的功能(请参阅这里这里)。另一个值得研究的选项是 polkit,但最好的选择肯定是将其作为系统服务运行。

相关内容