dbus-sesssion questions
Simon McVittie
smcv at debian.org
Mon Jul 6 12:09:35 BST 2026
Please send questions regarding D-Bus to dbus at packages.debian.org rather
than only to me personally: I don't want to be the single point of
failure for D-Bus on Debian.
Strictly speaking dbus is just the reference implementation of D-Bus
(there can be others, like dbus-broker) but its package address seems
like as good a coordination point as any other.
On Tue, 30 Jun 2026 at 16:21:41 +0200, Matthias Geiger wrote:
>What is the purpose of dbus-user-session? As far as I understand, this
>is *not* the plain dbus session
It was a new concept at the time it was introduced, but is now the
default and the setup that I would recommend. The other D-Bus session
bus implementation with OS-level integration is dbus-x11, which only
works for X11 sessions (not for Wayland, text consoles, ssh, etc.).
*Right now*, the dbus-user-session package only implements this design
for systemd systems (more precisely, systems with a working `systemd
--user`, which is a subset of systems with systemd as pid 1), but
there's nothing to stop non-systemd system designs from doing the same,
and I've seen that dbus-turnstile-user-session and
runit-dbus-user-session seem to work similarly. I'd recommend the same
"shape" that is used with systemd:
* XDG_RUNTIME_DIR set to /run/user/$(id -u) like systemd-logind does
(some software hard-codes this, even though in principle it shouldn't,
and the path chosen by systemd-logind is as good as any other)
* a PAM module runs on login/logout and starts or communicates with some
sort of service manager (in systemd-world this is libpam-systemd
and `systemd --user`, other service managers presumably have something
fairly similar)
* the service manager arranges for a dbus-daemon (or dbus-broker or some
other message bus implementation) to be listening on
$XDG_RUNTIME_DIR/bus, before the startup of anything else that needs it
(or it could listen on the socket itself, with an inetd-style arrangement
like the LISTEN_FDS protocol and start the dbus-daemon on a
just-in-time basis, which in fact is what systemd does)
* the PAM module sets DBUS_SESSION_BUS_ADDRESS to point to
unix:path=$XDG_RUNTIME_DIR/bus (with URI-style quoting/escaping as per
the D-Bus spec if necessary, but one of the reasons to reuse the path
chosen by systemd-logind is that it happens to be one that won't need
any quoting/escaping)
>but rather where a user session is
>assumed to start the first time after login, and it doesn't end
>until all login sessions have ended. It also provides dbus-services
>with XDG_RUNTIME_DIR
All of those are key features of dbus-user-session, yes.
More precisely, this is about D-Bus *session* services. D-Bus system
services are also a thing that exists (NetworkManager, etc.) but they're
orthogonal to all this session-level stuff.
dbus-user-session also (via /etc/X11/Xsession.d/20dbus_xdg-runtime)
provides activatable D-Bus session services with some other key
X11/freedesktop.org environment variables, notably $DISPLAY.
But, one thing that it *doesn't* do:
>and runs dbus-activation-enviroment --all
No, that's /etc/X11/Xsession.d/95dbus_update-activation-env in dbus-x11,
which I see as being a backward-compatibilty thing to cope with the fact
that older Xsession.d snippets might rely on merely doing `export FOO`
being sufficient to have FOO in the environment of D-Bus-activated
services like xdg-desktop-portal. (For example I think some non-Latin
input methods might still be relying on this, via im-config?)
I think that a high-quality Xsession.d snippet should either not need to
set environment variables at all (relying instead on components
discovering each other via $XDG_RUNTIME_DIR, $HOME, D-Bus, X11/Wayland
or similar), or if new environment variables are really needed, take
responsibility for uploading them to the D-Bus/systemd/etc. activation
environment itself.
Environment variables are not a great discovery/advertising mechanism
because of how they inherit between processes: an environment variable
can never be "instant-apply", because existing processes will already
have inherited its old value and are not notified when it gets a new
value. For example, this is why we can't have instant-apply locale
settings: with hindsight, the POSIX environment variables used for
locales are not a great design. Systems like $XDG_RUNTIME_DIR,
$DBUS_SESSION_BUS_ADDRESS and even $DISPLAY solve this by adding a layer
of indirection. The $XDG_RUNTIME_DIR doesn't need to change during a
program run, because it doesn't do anything particularly
human-meaningful on its own; but the sockets or files in the directory
that it points to, the information exposed by D-Bus services or
Xsettings, etc. are human-meaningful and *can* change at runtime.
On Tue, 30 Jun 2026 at 16:00:55 +0100, Mark Hindley wrote:
>Simon, for completeness, I am aware of at least 3 potential packages that now
>provide the systemd-style supervisor + unified dbus session:
>
> dbus-openrc-user-session (pending upload)
> dbus-turnstile-user-session
> runit-dbus-user-session
>
>Obviously they should Provides: dbus-session-bus. However should they also
>Provides/Conflicts: dbus-user-session?
The way I had originally anticipated that this would work, when I
introduced dbus-user-session, is that dbus-user-session could have
alternative dependencies on anything that will arrange for the desired
semantics to exist, so perhaps like this:
Depends:
libpam-systemd | dbus-openrc-user-session | dbus-turnstile-user-session | runit-dbus-user-session,
...
(This is a bit more complicated in reality because there are several
systemd-related dependencies, so those alternatives would need to be
added in more than one place, but you get the idea - and perhaps
dbus-user-session doesn't need to be so pedantic about its dependencies
anyway, now that systemd as pid 1 has been the default for several release
cycles and the only systems not using it will be those where a different
init was intentionally chosen.)
Or, if one of those alternative service managers becomes a widely-used,
cross-distro, de facto standard with a long-term-stable API and a
systemd-unit-equivalent that is low-maintenance over time (as systemd
itself did, and Upstart nearly did), then dbus upstream and
dbus-user-session could absorb those systemd-unit-equivalents and
install them alongside the systemd units that they currently ship, so
that systemd systems would run the systemd unit, OpenRC systems would
run whatever OpenRC's equivalent is, and so on, and everyone would be
happy. I'm not sure that any of the alternatives have that status yet,
though, so installing them in separate packages with an alternative
dependency is probably better at the moment - that gives the alternative
service managers' maintainers more control over the precise details of
how they start a D-Bus session bus, and more ability to experiment with
improving those details.
Having had this design in mind is why the package is called
dbus-user-session, and not dbus-systemd-user-session or something.
If that was implemented, then I'd expect "most" system designs to have
dbus-user-session installed: systemd users would have dbus-user-session
and libpam-systemd, resulting in `dbus-daemon --session` being started
as a `systemd --user` service, while OpenRC/turnstile/runit users would
instead have dbus-user-session and their appropriate service manager
glue, resulting in `dbus-daemon --session` being started as their
service manager's closest equivalent of a `systemd --user` service.
The other way this could potentially work would be for these other
implementations of a "user bus" to have a Provides for dbus-session-bus
and dbus-user-session, meaning that systemd users would have
dbus-user-session + libpam-systemd, but e.g. runit users would only have
runit-dbus-user-session (and *not* dbus-user-session). However, that
would mean that these other packages would need to duplicate what
/etc/X11/Xsession.d/20dbus_xdg-runtime does, unless we moved that file
into dbus-session-bus-common (which could be practically annoying,
because it's a dpkg conffile and I'm never sure what manipulations
are/aren't safe to be doing with conffiles).
I don't think a Conflicts with dbus-user-session is desirable or
necessary. The only thing in dbus-user-session that could cause a
problem for alternative service managers is its dependency on systemd,
which could be expanded into a set of alternative dependencies that
covers other implementations of the same "API": the actual systemd unit
files should be inert and useless-but-harmless on non-systemd systems,
similar to how (for example) the runit glue in openssh-server is
useless-but-harmless on systemd systems.
>It would be good to agree a naming convention as well.
I think a good rule of thumb is that if a package "belongs to" or "is
part of" a particular upstream, having that upstream project's name as
a prefix makes more sense than having it as an infix. So I like the
naming of runit-dbus-user-session better than dbus-openrc-user-session,
for a project that is maintained by runit/openrc developers and not by
the developers of dbus.
smcv
More information about the Debian-init-diversity
mailing list