D-Bus是desktop Bus缩写,针对桌面优化的IPC,用于进程间通讯IPC或内核通信。
D-Bus 是 Linux 下程序和服务之间用来“对话沟通”的公共通道。
D-Bus允许系统级进程(如:打印机和硬件驱动服务)和普通用户进程进行通信。
桌面环境需要通知音频服务“播放声音”
文件管理器需要让蓝牙服务“发送文件”
系统托盘的电池图标要读取电池状态
一个应用请求 systemd 管理服务状态 传统上,不同程序各搞各的,通信特别麻烦(得自己造 socket,造协议,非常繁琐)。
D-Bus 提供了一套统一又简单的通信机制:
可以让不同进程随时发消息
可以注册服务、方法,其他进程可以“远程调用”
D-Bus 总线(Bus)有两种:
名称 | 用途 | 举例 |
---|---|---|
System Bus | 系统范围的服务通信(管理员级) | 控制网络、蓝牙、电源管理 |
Session Bus | 单个用户登录会话里的通信 | 控制桌面、音量、通知栏等 |
NetworkManager:管理你的网络连接(Wi-Fi、以太网)
systemd:管理开机启动项、服务状态
udisks2:管理磁盘挂载/卸载
开启时由root启动
需要较高权限。
通常涉及硬件、系统资源访问。
通常在 /run/dbus/system_bus_socket 上通信。
作用是:在同一个用户登录会话里的程序们互相通信。
比如:
你打开一个 Deepin 应用,它想要调用托盘区通知图标
或者桌面环境要告诉音频服务音量变化了
每个用户登录一次,系统就启动一条 session bus。
特点:
只在你这个用户的登录会话里。
不涉及硬件,不需要 root 权限。
通常在 /run/user/$UID/bus
上通信($UID 是你的用户 ID)。
dbus-daemon 是 D-Bus 服务的后台守护进程。
它负责:
创建 system bus 和 session bus
中转消息、分发请求
每次开机启动时,都会自动启动 system bus 的 dbus-daemon
每次用户登录时,也会自动启动一个 session bus 的 dbus-daemon
你可以用这个命令看到它们:
ps aux | grep dbus-daemon
会看到有两个实例,一个是系统的,一个是你用户自己的。
bashroot@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
查看服务暴露的接口 (以下是输出,可以不必理会,看下文提取版)
bashroot@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这些都是什么?
符号 | 含义 | 示例 |
---|---|---|
s | string(字符串) | "Hello world" |
i | int32(32位有符号整数) | 42 |
u | uint32(32位无符号整数) | 123 |
b | boolean(布尔值) | true/false |
o | object path(对象路径) | /org/freedesktop/NetworkManager |
v | variant(变体,能包裹任何类型) | (比如一个字符串、或者整数) |
aX | array(X 类型的数组) | as 是字符串数组 |
{X Y} | dict entry(键值对) | {s,i} 是字串到整数的字典 |
() | struct(结构体) | 多个值打包一起 |
回到刚才,我们提取了部分dbus服务的信息
bashroot@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 许可协议。转载请注明出处!