Английская Википедия:D-Bus

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Short description Шаблон:Redirect Шаблон:Infobox software

D-Bus (short for "Desktop Bus"[1]) is a message-oriented middleware mechanism that allows communication between multiple processes running concurrently on the same machine.Шаблон:RШаблон:R D-Bus was developed as part of the freedesktop.org project, initiated by GNOME developer Havoc Pennington to standardize services provided by Linux desktop environments such as GNOME and KDE.Шаблон:RШаблон:RШаблон:Dead link

The freedesktop.org project also developed a free and open-source software library called libdbus, as a reference implementation of the specification. This library should not be confused with D-Bus itself, as other implementations of the D-Bus specification also exist, such as GDBus (GNOME),Шаблон:R QtDBus (Qt/KDE),Шаблон:R dbus-javaШаблон:R and sd-bus (part of systemd).Шаблон:R

Overview

D-Bus is an inter-process communication (IPC) mechanism initially designed to replace the software component communications systems used by the GNOME and KDE Linux desktop environments (CORBA and DCOP respectively).Шаблон:RШаблон:R The components of these desktop environments are normally distributed in many processes, each one providing only a few—usually one—services. These services may be used by regular client applications or by other components of the desktop environment to perform their tasks.[2]Шаблон:Multiple image

Due to the large number of processes involved—adding up processes providing the services and clients accessing them—establishing one-to-one IPC between all of them becomes an inefficient and quite unreliableШаблон:Citation needed approach. Instead, D-Bus provides a software-bus abstraction that gathers all the communications between a group of processes over a single shared virtual channel.Шаблон:R Processes connected to a bus do not know how it is internally implemented, but D-Bus specification guarantees that all processes connected to the bus can communicate with each other through it.

Linux desktop environments take advantage of the D-Bus facilities by instantiating multiple buses, notably:Шаблон:RШаблон:RШаблон:R

  • a single system bus, available to all users and processes of the system, that provides access to system services (i.e. services provided by the operating system and also by any system daemons)
  • a session bus for each user login session, that provides desktop services to user applications in the same desktop session, and allows the integration of the desktop session as a whole

A process can connect to any number of buses, provided that it has been granted access to them. In practice, this means that any user process can connect to the system bus and to its current session bus, but not to another user's session buses, or even to a different session bus owned by the same user. The latter restriction may change in the future if all user sessions are combined into a single user bus.Шаблон:R

D-Bus provides additional or simplifies existing functionality to the applications, including information-sharing, modularity and privilege separation. For example, information on an incoming voice-call received through Bluetooth or Skype can be propagated and interpreted by any currently-running music player, which can react by muting the volume or by pausing playback until the call is finished.Шаблон:R

D-Bus can also be used as a framework to integrate different components of a user application. For instance, an office suite can communicate through the session bus to share data between a word processor and a spreadsheet.

D-Bus specification

Bus model

Every connection to a bus is identified in the context of D-Bus by what is called a bus name.Шаблон:R A bus name consists of two or more dot-separated strings of letters, digits, dashes, and underscores. An example of a valid bus name is Шаблон:Code.Шаблон:R

When a process sets up a connection to a bus, the bus assigns to the connection a special bus name called unique connection name.Шаблон:RШаблон:R Bus names of this type are immutable—it is guaranteed they will not change as long as the connection exists—and, more importantly, they cannot be reused during the bus lifetime.Шаблон:RШаблон:RШаблон:R This means that no other connection to that bus will ever have assigned such unique connection name, even if the same process closes down the connection to the bus and creates a new one. Unique connection names are easily recognizable because they start with the otherwise forbidden colon character.Шаблон:RШаблон:R An example of a unique connection name is Шаблон:Code (the characters after the colon have no particular meaningШаблон:R).

A process can ask for additional bus names for its connection,Шаблон:R provided that any requested name is not already being used by another connection to the bus. In D-Bus parlance, when a bus name is assigned to a connection, it is said the connection owns the bus name.Шаблон:RШаблон:R In that sense, a bus name cannot be owned by two connections at the same time, but, unlike unique connection names, these names can be reused if they are available: a process may reclaim a bus name released—purposely or not—by another process.Шаблон:RШаблон:R

The idea behind these additional bus names, commonly called well-known names, is to provide a way to refer to a service using a prearranged bus name.Шаблон:RШаблон:R For instance, the service that reports the current time and date in the system bus lies in the process whose connection owns the Шаблон:Mono bus name, regardless of which process it is.

Bus names can be used as a simple way to implement single-instance applications (second instances detect that the bus name is already taken).Шаблон:R It can also be used to track a service process lifecycle, since the bus sends a notification when a bus name is released due to a process termination.Шаблон:R

Object model

Because of its original conception as a replacement for several component oriented communications systems, D-Bus shares with its predecessors an object model in which to express the semantics of the communications between clients and services. The terms used in the D-Bus object model mimic those used by some object oriented programming languages. That does not mean that D-Bus is somehow limited to OOP languages—in fact, the most used implementation (Шаблон:Mono) is written in C, a procedural programming language.

Файл:D-Feet.png
Browsing the existing bus names, objects, interfaces, methods and signals in a D-Bus bus using D-Feet

In D-Bus, a process offers its services by exposing objects. These objects have methods that can be invoked, and signals that the object can emit.Шаблон:R Methods and signals are collectively referred to as the members of the object.Шаблон:R Any client connected to the bus can interact with an object by using its methods, making requests or commanding the object to perform actions.Шаблон:R For instance, an object representing a time service can be queried by a client using a method that returns the current date and time. A client can also listen to signals that an object emits when its state changes due to certain events, usually related to the underlying service. An example would be when a service that manages hardware devices—such as USB or network drivers—signals a "new hardware device added" event. Clients should instruct the bus that they are interested in receiving certain signals from a particular object, since a D-Bus bus only passes signals to those processes with a registered interest in them.Шаблон:R

A process connected to a D-Bus bus can request it to export as many D-Bus objects as it wants. Each object is identified by an object path, a string of numbers, letters and underscores separated and prefixed by the slash character, called that because of their resemblance to Unix filesystem paths.Шаблон:RШаблон:R The object path is selected by the requesting process, and must be unique in the context of that bus connection. An example of a valid object path is Шаблон:Code.Шаблон:R However, it is not enforced—but also not discouraged—to form hierarchies within object paths.Шаблон:R The particular naming convention for the objects of a service is entirely up to the developers of such service, but many developers choose to namespace them using the reserved domain name of the project as a prefix (e.g. Шаблон:Mono).Шаблон:R

Every object is inextricably associated to the particular bus connection where it was exported, and, from the D-Bus point of view, only lives in the context of such connection. Therefore, in order to be able to use a certain service, a client must indicate not only the object path providing the desired service, but also the bus name under which the service process is connected to the bus.Шаблон:R This in turn allows that several processes connected to the bus can export different objects with identical object paths unambiguously.

An interface specifies members—methods and signals—that can be used with an object.Шаблон:R It is a set of declarations of methods (including its passing and returning parameters) and signals (including its parameters) identified by a dot-separated name resembling the Java language interfaces notation.Шаблон:RШаблон:R An example of a valid interface name is Шаблон:Code.Шаблон:R Despite their similarity, interface names and bus names should not be mistaken. A D-Bus object can implement several interfaces, but at least must implement one, providing support for every method and signal defined by it. The combination of all interfaces implemented by an object is called the object type.Шаблон:RШаблон:R

When using an object, it is a good practice for the client process to provide the member's interface name besides the member's name, but is only mandatory when there is an ambiguity caused by duplicated member names available from different interfaces implemented by the objectШаблон:RШаблон:R—otherwise, the selected member is undefined or erroneous. An emitted signal, on the other hand, must always indicate to which interface it belongs.

The D-Bus specification also defines several standard interfaces that objects may want to implement in addition to its own interfaces.Шаблон:R Although technically optional, most D-Bus service developers choose to support them in their exported objects since they offer important additional features to D-Bus clients, such as introspection.Шаблон:R These standard interfaces are:Шаблон:RШаблон:R

The D-Bus specification defines a number of administrative bus operations (called "bus services") to be performed using the Шаблон:Mono object that resides in the Шаблон:Mono bus name.Шаблон:R Each bus reserves this special bus name for itself, and manages any requests made specifically to this combination of bus name and object path. The administrative operations provided by the bus are those defined by the object's interface Шаблон:Mono. These operations are used for example to provide information about the status of the bus,Шаблон:R or to manage the request and release of additional well-known bus names.Шаблон:RШаблон:R

Communications model

D-Bus was conceived as a generic, high-level inter-process communication system. To accomplish such goals, D-Bus communications are based on the exchange of messages between processes instead of "raw bytes".Шаблон:RШаблон:R D-Bus messages are high-level discrete items that a process can send through the bus to another connected process. Messages have a well-defined structure (even the types of the data carried in their payload are defined), allowing the bus to validate them and to reject any ill-formed message. In this regard, D-Bus is closer to an RPC mechanism than to a classic IPC mechanism, with its own type definition system and its own marshaling.Шаблон:R

Файл:D-Bus method invocation.svg
Example of one-to-one request-response message exchange to invoke a method over D-Bus. Here the client process invokes the Шаблон:Mono method of the Шаблон:Mono object from the service process named Шаблон:Mono (or Шаблон:Code) in the bus.

The bus supports two modes of interchanging messages between a client and a service processШаблон:R:

  • One-to-one request-response: This is the way for a client to invoke an object's method. The client sends a message to the service process exporting the object, and the service in turn replies with a message back to the client process.Шаблон:R The message sent by the client must contain the object path, the name of the invoked method (and optionally the name of its interface), and the values of the input parameters (if any) as defined by the object's selected interface. The reply message carries the result of the request, including the values of the output parameters returned by the object's method invocation, or exception information if there was an error.Шаблон:RШаблон:R
  • Publish/subscribe: This is the way for an object to announce the occurrence of a signal to the interested parties. The object's service process broadcasts a message that the bus passes only to the connected clients subscribed to the object's signal.Шаблон:R The message carries the object path, the name of the signal, the interface to which the signal belongs, and also the values of the signal's parameters (if any). The communication is one-way: there are no response messages to the original message from any client process, since the sender knows neither the identities nor the number of the recipients.Шаблон:RШаблон:R

Every D-Bus message consists of a header and a body.Шаблон:R The header is formed by several fields that identify the type of message, the sender, as well as information required to deliver the message to its recipient (destination bus name, object path, method or signal name, interface name, etc.).Шаблон:RШаблон:R The body contains the data payload that the receiver process interprets—for instance the input or output arguments. All the data is encoded in a well known binary format called the wire format which supports the serialization of various types, such as integers and floating-point numbers, strings, compound types, and so on,Шаблон:R also referred to as marshaling.

The D-Bus specification defines the wire protocol: how to build the D-Bus messages to be exchanged between processes within a D-Bus connection. However, it does not define the underlying transport method for delivering these messages.

Internals

Most existing D-Bus implementations follow the architecture of the reference implementation. This architecture consists of two main components:Шаблон:R

  • a point-to-point communications library that implements the D-Bus wire protocol in order to exchange messages between two processes. In the reference implementation this library is Шаблон:Mono. In other implementations Шаблон:Mono may be wrapped by another higher-level library, language binding, or entirely replaced by a different standalone implementation that serves the same purpose.Шаблон:R This library only supports one-to-one communications between two processes.Шаблон:R
  • Файл:Dbus-daemon.svg
    A Шаблон:Mono process acting as a D-Bus message bus daemon. Every process connected to the bus keeps one D-Bus connection with it.
    a special daemon process that plays the bus role and to which the rest of the processes connect using any D-Bus point-to-point communications library. This process is also known as the message bus daemon,Шаблон:R since it is responsible for routing messages from any process connected to the bus to another. In the reference implementation this role is performed by Шаблон:Mono, which itself is built on top of Шаблон:Mono. Another implementation of the message bus daemon is Шаблон:Mono, which is built on top of Шаблон:Mono.

Шаблон:Multiple image The Шаблон:Mono library (or its equivalent) internally uses a native lower-level IPC mechanism to transport the required D-Bus messages between the two processes in both ends of the D-Bus connection. D-Bus specification does not mandate which particular IPC transport mechanisms should be available to use, as it is the communications library that decides what transport methods it supports. For instance, in Unix-like operating systems such as Linux Шаблон:Mono typically uses Unix domain sockets as the underlying transport method, but it also supports TCP sockets.Шаблон:RШаблон:R

The communications libraries of both processes must agree on the selected transport method and also on the particular channel used for their communication. This information is defined by what D-Bus calls an address.Шаблон:RШаблон:R Unix-domain sockets are filesystem objects, and therefore they can be identified by a filename, so a valid address would be unix:path=/tmp/.hiddensocket.Шаблон:RШаблон:R Both processes must pass the same address to their respective communications libraries to establish the D-Bus connection between them. An address can also provide additional data to the communications library in the form of comma-separated key=value pairs.Шаблон:RШаблон:R This way, for example, it can provide authentication information to a specific type of connection that supports it.

When a message bus daemon like Шаблон:Mono is used to implement a D-Bus bus, all processes that want to connect to the bus must know the bus address, the address by which a process can establish a D-Bus connection to the central message bus process.Шаблон:RШаблон:R In this scenario, the message bus daemon selects the bus address and the remainder processes must pass that value to their corresponding Шаблон:Mono or equivalent libraries. Шаблон:Mono defines a different bus address for every bus instance it provides. These addresses are defined in the daemon's configuration files.

Two processes can use a D-Bus connection to exchange messages directly between them,Шаблон:R but this is not the way in which D-Bus is normally intended to be used. The usual way is to always use a message bus daemon (i.e. Шаблон:Mono) as a communications central point to which each process should establish its point-to-point D-Bus connection. When a process—client or service—sends a D-Bus message, the message bus process receives it in the first instance and delivers it to the appropriate recipient. The message bus daemon may be seen as a hub or router in charge of getting each message to its destination by repeating it through the D-Bus connection to the recipient process.Шаблон:R The recipient process is determined by the destination bus name in the message's header field,Шаблон:R or by the subscription information to signals maintained by the message bus daemon in the case of signal propagation messages.Шаблон:R The message bus daemon can also produce its own messages as a response to certain conditions, such as an error message to a process that sent a message to a nonexistent bus name.Шаблон:R

Шаблон:Mono improves the feature set already provided by D-Bus itself with additional functionality. For example, service activation allows automatic starting of services when needed—when the first request to any bus name of such service arrives at the message bus daemon.Шаблон:R This way, service processes neither need to be launched during the system initialization or user initialization stage nor need they consume memory or other resources when not being used. This feature was originally implemented using setuid helpers,Шаблон:R but nowadays it can also be provided by systemd's service activation framework.Шаблон:Citation needed Service activation is an important feature that facilitates the management of the process lifecycle of services (for example when a desktop component should start or stop).Шаблон:R

History and adoption

D-Bus was started in 2002 by Havoc Pennington, Alex Larsson (Red Hat) and Anders Carlsson.Шаблон:R The version 1.0—considered API stable—was released in November 2006.Шаблон:RШаблон:R

Файл:Free and open-source-software display servers and UI toolkits.svg
The Шаблон:Mono plays a significant role in modern Linux graphical desktop environments.

Heavily influenced by the DCOP system used by versions 2 and 3 of KDE, D-Bus has replaced DCOP in the KDE 4 release.Шаблон:RШаблон:R An implementation of D-Bus supports most POSIX operating systems, and a port for Windows exists. It is used by Qt 4 and later by GNOME. In GNOME it has gradually replaced most parts of the earlier Bonobo mechanism. It is also used by Xfce.

One of the earlier adopters was the (nowadays deprecated) Hardware Abstraction Layer. HAL used D-Bus to export information about hardware that has been added to or removed from the computer.Шаблон:R

The usage of D-Bus is steadily expanding beyond the initial scope of desktop environments to cover an increasing amount of system services. For instance, the NetworkManager network daemon, BlueZ bluetooth stack and PulseAudio sound server use D-Bus to provide part or all of their services. systemd uses the D-Bus wire protocol for communication between [[Systemd#Core_components_and_libraries|Шаблон:Mono]] and systemd, and is also promoting traditional system daemons to D-Bus services, such as logind.Шаблон:R Another heavy user of D-Bus is Polkit, whose policy authority daemon is implemented as a service connected to the system bus.Шаблон:R

Implementations

Шаблон:Anchor libdbus

Although there are several implementations of D-Bus, the most widely used is the reference implementation libdbus, developed by the same freedesktop.org project that designed the specification. However, libdbus is a low-level implementation that was never meant to be used directly by application developers, but as a reference guide for other reimplementations of D-Bus (such as those included in standard libraries of desktop environments, or in programming language bindings). The freedesktop.org project itself recommends applications authors to "use one of the higher level bindings or implementations" instead.Шаблон:R The predominance of libdbus as the most used D-Bus implementation caused the terms "D-Bus" and "libdbus" to be often used interchangeably, leading to confusion.Шаблон:Citation needed

GDBus

GDBusШаблон:R is an implementation of D-Bus based on GIO streams included in GLib, aiming to be used by GTK+ and GNOME. GDBus is not a wrapper of libdbus, but a complete and independent reimplementation of the D-Bus specification and protocol.Шаблон:R MATE Desktop[3] and Xfce (version 4.14), which are also based on GTK+ 3, also use GDBus.Шаблон:Citation needed

sd-bus

In 2013, the systemd project rewrote libdbus in an effort to simplify the code,Шаблон:R but it also resulted in a significant increase of the overall D-Bus performance. In preliminary benchmarks, BMW found that the systemd's D-Bus library increased performance by 360%.Шаблон:R By version 221 of systemd, the sd-bus API was declared stable.Шаблон:R

Шаблон:Anchor kdbus

Файл:Simplified Structure of the Linux Kernel.svg
kdbus is implemented as a character device driver.[4][5] All communication between processes take place over special character device nodes in /dev/kdbus (cf. devfs).

kdbus was a project that aimed to reimplement D-Bus as a kernel-mediated peer-to-peer inter-process communication mechanism. Beside performance improvements, kdbus would have advantages arising from other Linux kernel features such as namespaces and auditing,Шаблон:RШаблон:R security from the kernel mediating, closing race conditions, and allowing D-Bus to be used during boot and shutdown (as needed by systemd).Шаблон:R kdbus inclusion in the Linux kernel proved controversial,Шаблон:R and was dropped in favor of BUS1, as a more generic inter-process communication.[6]

Language bindings

Several programming language bindings for D-Bus have been developed,Шаблон:R such as those for Java, C#, Ruby, Rust and Perl.Шаблон:Citation needed

See also

Шаблон:Portal

Шаблон:Div col

Шаблон:Div col end

References

Шаблон:Reflist

External links

Шаблон:Freedesktop.org Шаблон:Inter-process communication