D-Bus Explained, and Why Distributions Are Switching to dbus-broker
You rarely see it, but almost everything on a modern Linux desktop talks over D-Bus. When you plug in a USB drive and a notification pops up, when the volume keys work, when systemctl talks to systemd, D-Bus carries the messages. Ubuntu 26.10 just replaced the program at its centre, dbus-daemon, with dbus-broker. Here is what D-Bus does and why that change happened.
What D-Bus is
D-Bus is a message bus. Instead of every program knowing how to contact every other program, they all connect to a bus daemon and address each other by well-known names:
| Concept | Example | Meaning |
|---|---|---|
| Bus name | org.freedesktop.NetworkManager | Which service |
| Object path | /org/freedesktop/NetworkManager | Which object inside it |
| Interface | org.freedesktop.NetworkManager | A group of methods and properties |
| Method | GetDevices | A call that returns a result |
| Signal | StateChanged | A broadcast that others can listen for |
| Property | Version | A value you can read or watch |
The bus daemon routes messages, starts services on demand when someone calls them (activation), and enforces policy: which users may call which methods.
Two buses
- The system bus is shared by the machine. systemd, NetworkManager, UDisks, logind, Bluetooth, and polkit live here. Policy decides which users can do what
- Each user gets a session bus for their desktop: notifications, media players (MPRIS), the screenshot portal, settings daemons
Looking at the bus
systemd’s busctl is the best tool for exploring:
busctl list # services on the system bus
busctl --user list # session bus
busctl tree org.freedesktop.login1 # objects in a service
busctl introspect org.freedesktop.login1 /org/freedesktop/login1
Read a property and call a method:
busctl get-property org.freedesktop.hostname1 /org/freedesktop/hostname1 \
org.freedesktop.hostname1 Hostname
busctl --user call org.freedesktop.Notifications /org/freedesktop/Notifications \
org.freedesktop.Notifications Notify susssasa{sv}i \
"test" 0 "" "Hello" "From busctl" 0 0 5000
To watch traffic live, which is excellent for debugging why something does not react:
sudo busctl monitor org.freedesktop.NetworkManager
Many familiar commands are D-Bus clients underneath: hostnamectl, timedatectl, loginctl, nmcli, and systemctl itself.
dbus-daemon vs dbus-broker
dbus-daemon is the reference implementation, written around 2003 and designed to work on many systems. dbus-broker, started in 2017, is a reimplementation with different priorities:
| dbus-daemon | dbus-broker | |
|---|---|---|
| Origin | Reference implementation, 2003 | Rewrite by systemd and BUS1 developers, 2017 |
| Design | Portable, many features | Linux-only, built around systemd |
| Service activation | Starts services itself | Delegates to systemd |
| Performance | Good | Faster, more predictable under load |
| Resource accounting | Limited | Per-user quotas prevent one client flooding the bus |
| Protocol | D-Bus | D-Bus (fully compatible for clients) |
The key design choice is delegation to systemd: dbus-broker does not launch services, it asks systemd to, so every bus-activated service is a proper systemd unit with logging, limits, and sandboxing. It also enforces fair resource accounting, so a misbehaving program cannot exhaust the bus for everyone.
Who uses it
- Fedora: default since Fedora 30 (2019)
- Arch Linux: default since 2024
- Ubuntu: default from 26.10, for both system and session buses
- Debian and many others: still
dbus-daemonby default, withdbus-brokeravailable
Check yours
systemctl status dbus.service | head -5
systemctl --user status dbus.service | head -5
The process line names either dbus-daemon or dbus-broker-launch.
Switching
On distributions that package both, switching usually means installing dbus-broker and enabling it in place of dbus-daemon, then rebooting:
sudo systemctl disable dbus-daemon.service
sudo systemctl enable dbus-broker.service
sudo systemctl --global enable dbus-broker.service
Check your distribution’s documentation first, as unit names vary. Problems are rare, but they come from custom bus configuration relying on dbus-daemon behaviour, or from software that spawns its own private dbus-daemon.
For how D-Bus fits into the wider system, see what systemd is and our explainer on desktop portals, which are D-Bus services themselves.
Frequently Asked Questions
What is D-Bus?
D-Bus is an inter-process communication system. Programs connect to a message bus and call methods, send signals, and read properties on other programs, without needing to know how to reach them directly. Desktops, systemd, NetworkManager, and many other components rely on it.
What is the difference between the system bus and the session bus?
The system bus is shared by the whole machine and connects system services such as systemd, NetworkManager, and UDisks. Each logged-in user also gets a session bus connecting their desktop applications, notifications, and media players.
What is dbus-broker?
A reimplementation of the D-Bus message bus daemon, designed for performance and reliability and built to integrate with systemd. It is compatible with the D-Bus protocol, so applications do not notice the switch; it replaces only the bus daemon, dbus-daemon.
Which distributions use dbus-broker?
Fedora has used it by default since Fedora 30 in 2019, Arch Linux switched in 2024, and Ubuntu 26.10 adopted it for both the system and session buses. Debian and others still default to the reference dbus-daemon but package dbus-broker.
How can I check which bus daemon I am running?
Run systemctl status dbus.service and look at the process name, or check whether dbus-broker.service is active with systemctl is-active dbus-broker. For the session bus, add —user to either command.
Do I need to change anything when switching?
Usually not. Applications speak the same protocol. Rare issues come from custom bus configuration that relied on dbus-daemon specific behaviour, or from software that launched its own private dbus-daemon. Policy files in /usr/share/dbus-1 continue to work.