在 D-Bus 中,系统总线(system bus)和会话总线(session bus)的工作方式有所不同。会话总线主要依赖环境变量来找到总线地址,而系统总线则依赖于标准的系统路径和配置。
系统总线的服务查找机制
系统总线守护进程(dbus-daemon --system)由 systemd 或系统启动脚本启动。
系统总线的地址是固定的,通常不需要通过环境变量来查找。
系统总线的地址通常是固定的 UNIX 套接字路径,例如 /var/run/dbus/system_bus_socket。这个路径在 D-Bus 配置文件中定义。
系统总线守护进程使用 /etc/dbus-1/system.conf 配置文件。这个文件定义了系统总线的行为、权限、服务目录等。
在 /usr/share/dbus-1/system-services/ 和 /etc/dbus-1/system.d/ 目录中定义了系统总线的服务。
D-Bus 客户端应用程序不需要通过环境变量来查找系统总线。它们直接连接到标准的 UNIX 套接字路径。
在编程接口中,系统总线的地址通常通过 DBUS_BUS_SYSTEM 常量来引用,具体实现中会解析到 /var/run/dbus/system_bus_socket。
查找服务的过程
当一个 D-Bus 客户端想要与系统总线通信时,它会尝试连接到 /var/run/dbus/system_bus_socket。
当客户端发送消息到系统总线请求某个服务时,系统总线守护进程会检查当前已注册的服务。
如果服务未运行,系统总线守护进程会查找 /usr/share/dbus-1/system-services/ 目录中的服务描述文件,并尝试激活该服务。
服务描述文件是 .service 文件,定义了如何启动服务。例如,一个服务描述文件可能包含以下内容:
[D-BUS Service]
Name=org.freedesktop.NetworkManager
Exec=/usr/sbin/NetworkManager --no-daemon