我知道可以覆盖 dbus会议服务于~/.local/share/dbus-1/services
但这必然行不通系统服务。
在openrc下,因此我没有得到 systemd 的 systemctl 命令:
快速而肮脏(因为服务将在下次更新时恢复)的方法是重命名关联的服务文件/usr/share/dbus-1/system-services
,这是继续的唯一方法吗?
答案1
我刚刚遇到了同样的问题,在深入研究 dbus 代码后,我想我有一个解决方案:
/usr/local/share/dbus-1/system-services
中的文件覆盖中的文件/usr/share/dbus-1/system-services
。因此,为了防止服务自动启动,您可以创建一个空文件。例如,要确保 dbus 永远不会自动启动 login1:
mkdir -p /usr/local/share/dbus-1/system-services
touch /usr/local/share/dbus-1/system-services/org.freedesktop.login1.service
这还允许您使用 全局禁用用户服务/usr/local/share/dbus-1/services
。
防止其自行启动服务的另一个有效方法是使用-Dtraditional_activation=false
.但是,这会禁用所有服务。
答案2
D-Bus 服务是否有一行SystemdService=
指向 Systemd 单元文件,例如SystemdService=systemd_unit_name.service
?
/etc/systemd/system/systemd_unit_name.service
如果是,您可以添加从到 的符号链接/dev/null
。这就是systemctl mask systemd_unit_name.service
工作原理。
然后,任何激活 D-Bus 服务的尝试都将失败,因为链接的 Systemd 服务被屏蔽。但是,由于服务被屏蔽,您可能会在日志中看到一些关于激活失败的恼人日志。
如果没有行,您可以尝试添加从到 的SystemdService=
符号链接(未测试)。我假设如果没有从名为Systemd 单元文件名 的 D-Bus 单元文件的别名映射,则 D-Bus 激活将仅查找与 D-Bus 单元文件同名的 Systemd 单元文件,例如./etc/systemd/system/dbus_unit_name.service
/dev/null
dbus_unit_name.service
systemd_unit_name.service
dbus_unit_name.service
我相信您还可以覆盖 D-Bus 系统服务/etc/dbus-1/system-services/
(同样,未测试)。