Re: systemd-user, daemons, and ssh sessions

Simon McVittie <[email protected]> Sun, 26 Jul 2026 23:26:10 +0100
Newsgroups gmane.linux.debian.devel.general
Message-ID <[email protected]>
On Sun, 26 Jul 2026 at 16:23:06 +1000, Russell Coker wrote:
>Currently we have the X login programs (sddm, gdm3, and probably others) using
>systemd to create a session via /etc/pam.d/common-session which if there is a
>typical desktop environment installed includes pipewire and on a laptop it
>will include Bluetooth.  While it is easy to imagine some uncommon situations
>where those things could be useful for X login (bluetooth keyboard? audio
>screen reader?) in most cases it won't be needed.

In the cases where these things *are* needed (like a machine whose only 
keyboard/mouse/input devices happen to be connected via Bluetooth, or a 
machine whose main user needs a screen reader and therefore audio), they 
are not just useful, they are essential, so a universal operating system 
will tend to need to err on the side of them being enabled.

>For ssh on a system where you have a desktop environment installed all the
>desktop programs that are started by systemd-user are run on a ssh login by
>default.

By "desktop programs", do you mean per-user services that don't require 
a desktop environment or a graphical session? Like `dbus-daemon 
--session`, which is a communication mechanism that per-user things can 
use to talk to each other, and has nothing that inherently requires a 
GUI?

For some user-services (generally "infrastructure" ones like the 
dbus-daemon), it's intentional that they run in all login sessions, 
whether those sessions are graphical, ssh, getty/login or something 
else. Historically, the dbus-x11 package had the bug that D-Bus was only 
available in graphical sessions, because there was no good way to scope 
the `dbus-daemon --session` instance to the lifetime of a session. 
One of the purposes of dbus-user-session is to fix that bug.

For other user-services, if they genuinely only make sense to run inside 
a graphical session, ideally they could have 
WantedBy=graphical-session.target or 
WantedBy=graphical-session-pre.target instead of WantedBy=default.target 
in the "[Install]" sections of their systemd service files. Some 
services like gnome-keyring already do this. (But beware of assuming 
that something is never useful for non-graphical sessions just because 
*you* don't use it in non-graphical sessions!)

Unfortunately, many of our graphical desktop environments don't interact 
with graphical-session{,-pre}.target - I know that GNOME and KDE Plasma 
do, but many others don't - and so far I haven't been able to find good 
documentation with practical advice on a minimal level of integration 
for desktop environment implementors. As a result, there is no 
particularly good way for the systemd infrastructure to choose different 
sets of services for a non-graphical session (ssh or getty/login), vs. a 
graphical session like e.g. MATE that doesn't start 
graphical-session.target. This leads many developers of 
non-desktop-environment-specific services to connect them to 
default.target instead, because that's the only thing that'll work in 
all GUI environments. If someone wants to work on addressing that 
(documenting what's expected better, and/or implementing that in other 
desktop environments) then that would be very useful, and would also fix 
some issues seen in e.g. xdg-desktop-portal.

Other user-services are started on-demand when first used, by D-Bus 
activation or socket activation or some similar protocol. If those are 
starting unexpectedly, it means something in your session is trying to 
interact with them, and the route to follow would be to find out what is 
interacting with those services, and if appropriate, make it not do 
that. For example, for D-Bus services, the reference dbus-daemon logs a 
message to the systemd Journal every time it carries out activation 
(starting a service on-demand), which mentions which program sent the 
message that requested activation.

     smcv