我正在使用 Distrobox 开发应用程序,目前正在开发一个与系统总线上运行的服务交互的应用程序。
为了测试与系统总线和我想要交互的服务的连接,我使用以下命令:
$ gdbus introspect --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1
如果我在主机系统上运行它,它会正常工作,并会给我一个接口列表以及它们相应的方法、信号和属性。但是,如果我在 Distrobox 容器内运行它,它只会给我以下信息:
$ gdbus introspect --system --dest org.freedesktop.login1 --object-path /org/freedesktop/login1
Error connecting: Could not connect: No such file or directory
我推测这是因为 Distrobox 容器无法访问主机系统的系统总线,而且我没有在容器本身中运行任何初始化系统。我想允许在此 Distrobox 容器内运行的应用程序能够访问我的主机系统的系统总线。如何在 Distrobox 容器内实现这一点?
就我而言,将
DBUS_SYSTEM_BUS_ADDRESS
环境变量设置为适当的值是解决此问题的可行方法。为容器全局设置此项可能会产生一些潜在的不良后果,例如“
apt
如果找到该路径,则尝试在容器内启动 systemd”(有关更多信息,请参阅Distrobox 存储库中的讨论 1188),因此我只是根据需要通过在命令行中像这样设置环境变量来在每个应用程序上进行设置:但是,也可以在创建新容器时全局设置它,如下所示:
在上述链接讨论中,
unix:///run/host/var/run/dbus/system_bus_socket
使用了 而不是unix:path=/run/host/var/run/dbus/system_bus_socket
。但是,前者似乎与我在应用程序中使用的 dbus-fast 不兼容。其他一些实现可能支持前一种格式,但至少 dbus-fast 需要后一种格式才能工作。它在我在原始问题中编写的测试用例中也不起作用:但其他格式却可以: