# D-Bus

D-Bus (von englisch Desktop-Bus) ist eine freie Programmbibliothek zur Interprozesskommunikation. Sie orientiert sich insbesondere an den Bedürfnissen von Desktop-Umgebungen.
Es ist Bestandteil des freedesktop.org-Projektes und wird bei nahezu jeder modernen Linux-Distribution eingesetzt. In seiner Gesamtheit stellt D-Bus mit all seinen Komponenten allgemein eine leichtgewichtige Middleware (Daemon zur Unterstützung der Interprozesskommunikation) sowie im Speziellen einen Object Request Broker (ORB; eine Art Kommunikations-Vermittler für Objekte) dar.

## Grundlagen

Über D-Bus können Programme miteinander kommunizieren. Im rechts gezeigten Beispiel meldet sich ein Dateimanager bei einem systemweiten Programm an, das über die Hardware, die am Computer angeschlossen ist, informiert (in diesem Beispiel der Hardware-Abstraction-Layer-Daemon, kurz hal-Daemon). Der hal-Daemon informiert den Dateimanager nun bei Änderungen an der Hardware, sodass dieser z. B. beim Einstecken eines USB-Sticks diesen automatisch einhängen und die Inhalte anzeigen kann.

## Funktionsweise

Einzelne Programme bekommen über die Programmbibliothek libdbus die Möglichkeit, sich paarweise gegenseitig zu kontaktieren und Nachrichten auszutauschen. Angesprochen werden jeweils Objekte, deren Benennung an Dateisystempfade erinnert, etwa /org/kde/kspread/sheets/3/cells/4/5. Um sicherzustellen, dass verschiedene Programme auseinandergehalten werden können, sind die D-Bus-Objekte in einem Namensraum zusammengefasst. Diese Namensräume enthalten meist die Domains der Entwickler (zum Beispiel /org/kde für die Programme von kde.org).
Daneben existiert ein ausführbarer Nachrichtenbusdaemon dbus, mit dem sich mehrere Anwendungen verbinden können. Der Daemon kann Nachrichten von einer Anwendung an eine oder mehrere Anwendungen weiterleiten.
Gedacht ist D-Bus zum einen für die Kommunikation zwischen Desktopanwendungen derselben Sitzung (der sogenannte Session-Bus) und zum anderen für die Kommunikation zwischen der Desktopsitzung und Teilen des Betriebssystems wie dem Kernel, den verschiedenen Systemdaemonen oder Systemprozessen (System-Bus).

## Geschichte

Bereits vor der Einführung eines standardisierten Nachrichtensystems für Desktop-Anwendungen durch freedesktop.org haben die beiden beliebtesten Desktop Environments KDE und Gnome jeweils unterschiedliche, zueinander inkompatible Implementierungen des gleichen Konzepts verwendet, und zwar DCOP (Desktop Communication Protocol) für KDE und eine CORBA-ähnliche Architektur (Common Object Request Broker Architecture) für GNOME.
D-Bus verfügt über mehr Funktionen und wurde nach der Standardisierung von den Desktop-Environment-Projekten schnell angenommen und die Implementierungen der eigenen Systeme zugunsten des Standards fallengelassen. Das Standardprotokoll wurde damit zu einem maßgeblichen Faktor für den Linux-Desktop, da die Diskrepanzen zwischen den Benutzeroberflächen damit zunehmend fallen.

## Komponenten

Die D-Bus-Spezifikation besteht aus drei Teilen, und zwar im Einzelnen dem D-Bus-Daemon, der D-Bus-Bibliothek libdbus sowie dem eigentlichen D-Bus-Protokoll.

### D-Bus-Daemon

Der D-Bus-Daemon implementiert einen sogenannten Nachrichtenbus (message bus), der in seiner Funktion einem Object Request Broker gleichkommt. Eine beliebige Anzahl von Clients verbindet sich mit dem daemon, basierend auf dem D-Bus-Protokoll und in der Regel unter Zuhilfenahme von libdbus. Einzelne (L)RPC-Aufrufe werden vom daemon entgegengenommen und an den zuständigen Client vermittelt, der daemon ist somit ein Broker. Die (L)RPC-Aufrufe agieren auf abstrakten Objekten und stellen in Anlehnung an das OOP-Objektmodell demnach Methodenaufrufe dar. Ferner bietet der daemon noch Dienste wie Activation an. Zuletzt stellt der daemon natürlich zeitgleich, basierend auf den Einzelverbindungen, eine eins-zu-viele-Kommunikation (Broadcast) zur Verfügung.

### D-Bus-Bibliothek (libdbus)

Die D-Bus-Bibliothek stellt eine Referenzimplementierung des D-Bus-Protokolls bzw. der D-Bus-Spezifikation als Ganzes dar. Sie bietet eine API in der Programmiersprache C, mit der zwei Prozesse eine Verbindung eingehen können, um danach via LRPC/RPC zu kommunizieren. Sie stellt weiterhin das nötige Marshalling zur Verfügung, also das Ausrichten und korrekte Anordnen der Bytes für den Transport. Letztlich bietet die API alle Dienste für eine einfach abstrahierte Punkt-zu-Punkt-(Prozess-zu-Prozess-)Interprozesskommunikation.
Aufbauend auf libdbus haben sich Implementierungen für alle verbreiteten Programmiersprachen und Frameworks entwickelt, bei letzterem insbesondere auf Qt und GLib (GTK+) zugeschnittene Implementierungen. So verwendet Gnome GDBus und KDE4 QtDBus.

### D-Bus-Protokoll

Das D-Bus-Protokoll ist ein binäres IPC-Protokoll. Spezifiziert sind sowohl Primitivtypen als auch zulässige Nachrichtentypen sowie die Kodierung für den Transport. Grundlegend basiert das Protokoll auf dem Prinzip des Nachrichtentauschs und spezifiziert darauf basierende entfernte Aufrufe (LRPCs/RPCs).

## Kdbus, bus1 und dbus-broker

Dbus ist funktionell limitiert und langsamer als alternative Ansätze für Interprozesskommunikation, weshalb beispielsweise Android statt auf Dbus auf das eigene System Binder setzt. Um dies zu beheben, entwickelten Greg Kroah-Hartman und andere Linux-Entwickler mit Kdbus (Kernel D-Bus) eine D-Bus-Implementierung für den Linux-Kernel. Kdbus ist deutlich schneller als die bisherige Userspace-Lösung. Außerdem können durch die effizientere Architektur (≤ 2 statt 10 Kopien) auch große Datenmengen (im GiB-Bereich) zwischen Prozessen ausgetauscht werden. Kdbus scheiterte jedoch aus technischen Gründen und wurde nicht in den Linux-Kernel aufgenommen. Als neue Alternative wurde im August 2016 Bus1 vorgeschlagen. Im August 2017 wurde von denselben Entwicklern mit dbus-broker ein dritter Ansatz für die Lösung der Probleme von dbus vorgeschlagen, der kompatibel zur DBus-Spezifikation sein soll.