编辑
2025-04-29
小白笔记
0

目录

System Bus让系统级服务和用户程序通信
Session Bus(会话总线)
附加一个核心程序:dbus-daemon

D-Bus是desktop Bus缩写,针对桌面优化的IPC,用于进程间通讯IPC或内核通信。

D-Bus 是 Linux 下程序和服务之间用来“对话沟通”的公共通道。

D-Bus允许系统级进程(如:打印机和硬件驱动服务)和普通用户进程进行通信。

  • 桌面环境需要通知音频服务“播放声音”

  • 文件管理器需要让蓝牙服务“发送文件”

  • 系统托盘的电池图标要读取电池状态

  • 一个应用请求 systemd 管理服务状态 传统上,不同程序各搞各的,通信特别麻烦(得自己造 socket,造协议,非常繁琐)。

D-Bus 提供了一套统一又简单的通信机制:

可以让不同进程随时发消息

可以注册服务、方法,其他进程可以“远程调用”

D-Bus 总线(Bus)有两种:

名称用途举例
System Bus系统范围的服务通信(管理员级)控制网络、蓝牙、电源管理
Session Bus单个用户登录会话里的通信控制桌面、音量、通知栏等

System Bus让系统级服务和用户程序通信

NetworkManager:管理你的网络连接(Wi-Fi、以太网)

systemd:管理开机启动项、服务状态

udisks2:管理磁盘挂载/卸载

开启时由root启动

需要较高权限。

通常涉及硬件、系统资源访问。

通常在 /run/dbus/system_bus_socket 上通信。

Session Bus(会话总线)

作用是:在同一个用户登录会话里的程序们互相通信。

比如:

你打开一个 Deepin 应用,它想要调用托盘区通知图标

或者桌面环境要告诉音频服务音量变化了

每个用户登录一次,系统就启动一条 session bus。

特点:

只在你这个用户的登录会话里。

不涉及硬件,不需要 root 权限。

通常在 /run/user/$UID/bus 上通信($UID 是你的用户 ID)。

附加一个核心程序:dbus-daemon

dbus-daemon 是 D-Bus 服务的后台守护进程。

它负责:

创建 system bus 和 session bus

中转消息、分发请求

每次开机启动时,都会自动启动 system bus 的 dbus-daemon

每次用户登录时,也会自动启动一个 session bus 的 dbus-daemon

你可以用这个命令看到它们:

ps aux | grep dbus-daemon

会看到有两个实例,一个是系统的,一个是你用户自己的。

bash
root@momen-ASUS:/run/dbus# ps aux | grep dbus-daemon message+ 3052 1.0 0.0 12176 6216 ? Ss 08:04 0:29 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only momen 5508 0.8 0.0 11368 6220 ? Ss 08:04 0:24 /usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation --syslog-only momen 6747 0.0 0.0 9564 5000 ? S 08:04 0:00 /usr/bin/dbus-daemon --config-file=/usr/share/defaults/at-spi2/accessibility.conf --nofork --print-address 11 --address=unix:path=/run/user/1000/at-spi/bus_0 root 50507 0.0 0.0 9444 2204 pts/1 S+ 08:53 0:00 grep dbus-daemon

dbus-daemon 真正在后台跑的 D-Bus 服务程序

system bus 系统范围的通信总线,涉及硬件/网络等高权限操作

session bus 用户级别通信总线,主要给桌面应用之间交互用

bash
# 查看 system bus 上都有哪些服务 busctl list --system # 查看 session bus 上都有哪些服务 busctl list --user # 查看某个服务暴露出来的接口 busctl introspect --system org.freedesktop.NetworkManager /org/freedesktop/NetworkManager

查看服务暴露的接口 (以下是输出,可以不必理会,看下文提取版)

bash
root@momen-ASUS:/run/dbus# busctl introspect --system org.freedesktop.NetworkManager /org/freedesktop/NetworkManager NAME TYPE SIGNATURE RESULT/VALUE FLAGS org.freedesktop.DBus.Introspectable interface - - - .Introspect method - s - org.freedesktop.DBus.Peer interface - - - .GetMachineId method - s - .Ping method - - - org.freedesktop.DBus.Properties interface - - - .Get method ss v - .GetAll method s a{sv} - .Set method ssv - - .PropertiesChanged signal sa{sv}as - - org.freedesktop.NetworkManager interface - - - .ActivateConnection method ooo o - .AddAndActivateConnection method a{sa{sv}}oo oo - .AddAndActivateConnection2 method a{sa{sv}}ooa{sv} ooa{sv} - .CheckConnectivity method - u - .CheckpointAdjustRollbackTimeout method ou - - .CheckpointCreate method aouu o - .CheckpointDestroy method o - - .CheckpointRollback method o a{su} - .DeactivateConnection method o - - .Enable method b - - .GetAllDevices method - ao - .GetDeviceByIpIface method s o - .GetDevices method - ao - .GetLogging method - ss - .GetPermissions method - a{ss} - .Reload method u - - .SetLogging method ss - - .Sleep method b - - .state method - u - .ActivatingConnection property o "/" emits-change .ActiveConnections property ao 2 "/org/freedesktop/NetworkManager/Acti… emits-change .AllDevices property ao 4 "/org/freedesktop/NetworkManager/Devi… emits-change .Capabilities property au 1 1 emits-change .Checkpoints property ao 0 emits-change .Connectivity property u 4 emits-change .ConnectivityCheckAvailable property b false emits-change .ConnectivityCheckEnabled property b false emits-change writable .ConnectivityCheckUri property s "" emits-change .Devices property ao 4 "/org/freedesktop/NetworkManager/Devi… emits-change .GlobalDnsConfiguration property a{sv} 0 emits-change writable .Metered property u 4 emits-change .NetworkingEnabled property b true emits-change .PrimaryConnection property o "/org/freedesktop/NetworkManager/Active… emits-change .PrimaryConnectionType property s "802-11-wireless" emits-change .RadioFlags property u 1 emits-change .Startup property b false emits-change .State property u 70 emits-change .Version property s "1.42.4" emits-change .VersionInfo property au 1 76292 emits-change .WimaxEnabled property b false emits-change writable .WimaxHardwareEnabled property b false emits-change .WirelessEnabled property b true emits-change writable .WirelessHardwareEnabled property b true emits-change .WwanEnabled property b true emits-change writable .WwanHardwareEnabled property b true emits-change .CheckPermissions signal - - - .DeviceAdded signal o - - .DeviceRemoved signal o - - .StateChanged signal u - -

此时又发现问题,oo aouu ooo这些都是什么?

符号含义示例
sstring(字符串)"Hello world"
iint32(32位有符号整数)42
uuint32(32位无符号整数)123
bboolean(布尔值)true/false
oobject path(对象路径)/org/freedesktop/NetworkManager
vvariant(变体,能包裹任何类型)(比如一个字符串、或者整数)
aXarray(X 类型的数组)as 是字符串数组
{X Y}dict entry(键值对){s,i} 是字串到整数的字典
()struct(结构体)多个值打包一起

回到刚才,我们提取了部分dbus服务的信息

bash
root@momen-ASUS:/run/dbus# busctl introspect --system org.freedesktop.NetworkManager /org/freedesktop/NetworkManager NAME TYPE SIGNATURE调用的参数签名 RESULT/VALUE返回的结果的签名 FLAGS特殊标志 org.freedesktop.NetworkManager interface 接口 - - - .ActivateConnection method 方法 ooo o - .State method方法 - u - .State property属性 u 70 emits-change .StateChanged signal信号 u - -

本文作者:墨洺的文档

本文链接:

版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!