systemd/User (Italiano)
Related articles
systemd offre agli utenti la possibilità di gestire i servizi sotto il controllo dell'utente tramite una istanza di systemd per singolo utente, che consente agli stessi di avviare, fermare, abilitare e disabilitare le proprie unità. Questa caratteristica è utile per demoni e altre operazioni automatiche come lo scaricamento della posta. È inoltre possibile, con alcune modifiche, avviare Xorg e il window manager in uso direttamente tramite i servizi utente.
Contents
Come funziona
Quando un utente effettua il login, systemd avvia automaticamente una istanza di systemd --user
, necessaria per la gestione dei servizi dell'utente. Tale processo rimarrà in esecuzione fin tanto che l'utente sarà coneesso, e verrà terminato quando l'utente effettua il logout. Quando l'#Avvio automatico delle istanze utente di systemd è abilitato, l'istanza viene avviata al boot e non più terminata. Il comportamento di default è quello di non eseguire alcun servizio utente. I servizi utente possono essere utilizzati per avviare demoni o compiere operazioni automatiche, disponendo comunque di tutti i benefici di systemd, come l'attivazione socket, timers, dipendenze e controllo processi tramite cgroups. Le unità utente sono situate nelle seguenti directory, similmente a quanto accade con i servizi di sistema (directory ordinate per preferenza crescente)
-
/usr/lib/systemd/user/
directory per i servizi forniti dai pacchetti. -
/etc/systemd/user/
directory per i servizi definiti dall'amministratore di sistema. -
~/.config/systemd/user/
directory per i servizi utenti.
All'avvio di una istanza utente di systemd, viene caricato il target default.target
; da questo punto è possibile controllare tale istanza tramite systemctl --user
.
Configurazione di base
Le istanze utente di systemd dovrebbero avviarsi automaticamente al primo login. Per verificare che siano effettivamente in esecuzione, utilizzare systemctl --user status
.
Tutti i servizi utenti devono essere inseriti in ~/.config/systemd/user
. Se si vuole avviare une servizio automaticamente al login, si esegua systemctl --user enable servizio
per ogni servizio.
D-Bus
Alcune applicazioni necessitano di un messagebus D-Bus, tradizionalmente avviato quando si esegue un desktop environment tramite dbus-launch
. Tuttavia, se si tenta di eseguire qualche applicazione che dipenda da D-Bus come servizio utente, sarà necessario avviare il server D-Bus come servizio di systemd per soddisfare la dipendenza.
Procedere come segue:
1. Si crei un servizio e delle unità socket per il server D-Bus in /etc/systemd/user
/etc/systemd/user/dbus.socket
[Unit] Description=D-Bus User Message Bus Socket [Socket] ListenStream=%t/bus [Install] WantedBy=sockets.target Also=dbus.service
/etc/systemd/user/dbus.service
[Unit] Description=D-Bus User Message Bus Documentation=man:dbus-daemon(1) Requires=dbus.socket [Service] ExecStart=/usr/bin/dbus-daemon --session --address=systemd: --nofork --nopidfile --systemd-activation ExecReload=/usr/bin/dbus-send --print-reply --session --type=method_call --dest=org.freedesktop.DBus / org.freedesktop.DBus.ReloadConfig [Install] Also=dbus.socket
2. Sarà necessario definire la variabile d'ambiente DBUS_SESSION_BUS_ADDRESS
. È possibile farlo tramite un file di configurazione per il servizio user@.service
, creando il file seguente:
/etc/systemd/system/user@.service.d/dbus.conf
[Service] Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%I/bus
3. Attivare il socket per tutti gli utenti eseguendo da root:
# systemctl --global enable dbus.socket
Variabili d'ambiente
L'istanza utente di systemd non eredita le variabili d'ambiente definite in .bashrc
e similari. Vi sono quattro modi per definire variabili d'ambiente per istanze utente di systemd:
- Per gli utenti che abbiano una propria home directory, si specifichi l'opzione
DefaultEnvironment
in~/.config/systemd/user.conf
. Viene applicata solo alle unità utente di un utente specifico. - Utilizzare l'opzione
DefaultEnvironment
in/etc/systemd/user.conf
. Viene applicata a tutti i servizi utente. - Creare un file di configurazione in
/etc/systemd/system/user@.service.d/
. Viene applicata a tutti i servizi utente. - In qualsiasi momento, tramite i comandi
systemctl --user set-environment
osystemctl --user import-environment
. Applicata a tutti i servizi avviati dopo l'esecuzione dei comandi di cui sopra, ma non a quelli già avviati.
Alcune delle variabili che si potrebbe voler definire sono DISPLAY
o PATH
DISPLAY
La variabile DISPLAY
viene utilizzata dalle applicazioni X11 per identificare lo schermo da utilizzare. Se si ha intenzione di eseguire applicazioni X11 come servizi utente, sarà necessario definire tale variabile. Ad esempio:
/etc/systemd/user.conf
... DefaultEnvironment=DISPLAY=:0 ...
In alternativa, è possibile installare uno script xinitrc per impostare le variabili d'ambiente in maniera corretta:
/etc/X11/xinit/xinitrc.d/import-display.sh
#!/bin/sh systemctl --user import-environment DISPLAY XAUTHORITY
PATH
Come tutte le variabili d'ambiente definite tramite .bashrc
o .bash_profile
, anche PATH
non è visibile a systemd. Se si modifica il valore di tale variabile e si intende avviare applicazioni che se ne avvalgano come servizi di systemd, sarà necessario notificare systemd della sua modifica. È consigliabile farlo aggiungendo la seguente riga al proprio .bash_profile
, dopo aver definito la variabile PATH
:
~/.bash_profile
systemctl --user import-environment PATH
Avvio automatico delle istanze utente di systemd
L'istanza utente di systemd viene avviata dopo il primo login di un utente, e fermata alla chiusura dell'ultima sessione di quell'utente. Potrebbe essere talvolta necesario avviarla subito dopo il boot, e mantenerla attiva alla chiusura dell'ultima sessione utente relativa, ad esempio per avere processi utente attivi senza alcuna sesione utente in corso. Si esegua a tal proposito il seguente comando per abilitare tale comportamento per un singolo utente:
# loginctl enable-linger nomeutente
Xorg e systemd
Vi sono diversi metodi per avviare Xorg tramite systemd. Di seguito due possibilità: l'avvio di una sessione utente con un processo di Xorg o l'avvio di quest'ultimo come servizio utente.
Login automatico in Xorg senza display manager
Quanto sotto avvierà una sessione utente ed il server Xorg come unità di sistema e provvederà poi a leggere il contenuto di ~/.xinitrc
, avviare il window manager, ecc.
Sarà necessario configurare #D-Bus nel modo corretto ed installare il pacchetto xlogin-gitAUR.
Si crei il proprio file xinitrc da quello di default, in modo che effettui il source dei files in /etc/X11/xinit/xinitrc.d/
. È necessario che l'esecuzione del priorio ~/.xinitrc
non ritorni, quindi si inserisca wait
come ultimo comando, o si aggiunga exec
all'ultimo comando (ad esempio, il proprio window manager).
Questa sessione utilizzerà il proprio demone D-Bus, ma varie utility di systemd si connetteranno automaticamente all'istanza avviata dal servizio dbus.service
Si abiliti infine (come root) il servizio xlogin per ottenere il login automatico al boot:
# systemctl enable xlogin@username
La sessione utente viene eseguita interamente in un ambiente systemd, quindi tutto dovrebbe funzionare nel modo corretto.
Avvio di Xorg come servizio utente
In alternativa, è possibile avviare xorg come servizio utente, avendo il vantaggio di poter definire il servizio in questione come dipendenza di altre unità che lo necessitino. Questo approccio, tuttavia, non è esente da difetti, elencati sotto:
A partire dalla versione 1.16, xorg-server si integra in modo migliore con systemd in due modi:
- Può essere avviato senza privilegi di root, delegando la gestione dei dispositivi a logind (si vedano i commit di Hans de Goede this qui).
- Può essere avviato come servizio attivato tramite socket (si veda questo commit).
Sfortunatamente, per avviare Xorg senza privilegi di amministratore, è necessario essere in una sessione, perciò, in questo momento, è necessario avviare Xorg come amministratore per poterlo gestire tramite i servizi utente (come per versioni precedenti la 1.16).
Di seguito le istruzioni per avviare Xorg come servizio utente
1. Assicurarsi che Xorg possa venire avviato con privilegi da amministratore da qualsiasi utente, modificando /etc/X11/Xwrapper.config
:
/etc/X11/Xwrapper.config
allowed_users=anybody needs_root_rights=yes
2. Creare le seguenti unità in ~/.config/systemd/user
:
~/.config/systemd/user/xorg@.socket
[Unit] Description=Socket for xorg at display %i [Socket] ListenStream=/tmp/.X11-unix/X%i
~/.config/systemd/user/xorg@.service
[Unit] Description=Xorg server at display %i Requires=xorg@%i.socket After=xorg@%i.socket [Service] Type=simple SuccessExitStatus=0 1 ExecStart=/usr/bin/Xorg :%i -nolisten tcp -noreset -verbose 2 "vt${XDG_VTNR}"
Dove ${XDG_VTNR
} è il terminale virtuale dove Xorg verrà eseguito, definito all'interno del servizio utente, o specificato come variabile d'ambiente in systemd tramite:
$ systemctl --user set-environment XDG_VTNR=1
3. Assicurarsi di definire la variabile d'ambiente DISPLAY
come spiegato sopra.
4. Per abilitare l'attivazione socket per Xorg sul display 0 e tty2, si procederebbe come segue:
$ systemctl --user set-environment XDG_VTNR=2 # Per dichiarare a xorg@.service quale terminale utilizzare $ systemctl --user start xorg@0.socket # Resta in ascolto sul socket del display 0
A questo punto, qualsiasi applicazione X11 verrà eseguita automaticamente sul terminale virtuale 2.
La variabile d'ambiente XDG_VTNR
può essere definita nell'ambiente di systemd partendo da .bash_profile
, cosa che renderebbe possibile avviare qualsiasi applicazione X11, compreso un window manager, come unità utente systemd, inserendo una dipendenza a xorg@0.socket
.
Scrivere servizi utente
Esempio
Di seguito un esempio per l'avvio di mpd come servizio utente:
~/.config/systemd/user/mpd.service
[Unit] Description=Music Player Daemon [Service] ExecStart=/usr/bin/mpd --no-daemon [Install] WantedBy=default.target
Esempio con variabili
Esempio di avvio di sickbeard
come servizio utente, con definizione di una variabile utente per la directory home dove Sickbeard reperisce alcuni file di configurazione:
~/.config/systemd/user/sickbeard.service
[Unit] Description=SickBeard Daemon [Service] ExecStart=/usr/bin/env python2 /opt/sickbeard/SickBeard.py --config %h/.sickbeard/config.ini --datadir %h/.sickbeard [Install] WantedBy=default.target
Come specificato in man systemd.unit
, la variabile %h
viene sostituita con la home directory dell'utente che esegue il servizio. Vi sono altre variabili disponibili, spiegate in dettaglio nelle pagine di manuale di systemd.
Nota per applicazioni X11
La maggior parte delle applicazioni X11, necessitano della variabile DISPLAY
per essere eseguite (causa principale del mancato avvio delle proprie unità utente). Si veda #DISPLAY per definire la variabile per l'intera istanza utente di systemd. In alternativa, è possibile definirla solo per il servizio corrente, come segue:
~/.config/systemd/user/parcellite.service
[Unit] Description=Parcellite clipboard manager [Service] ExecStart=/usr/bin/parcellite Environment=DISPLAY=:0 [Install] WantedBy=mystuff.target
Esempi d'uso
Multiplexer di terminale persistente
You may wish your user session to default to running a terminal multiplexer, such as GNU Screen or Tmux, in the background rather than logging you into a window manager session. Separating login from X login is most likely only useful for those who boot to a TTY instead of to a display manager (in which case you can simply bundle everything you start in with myStuff.target).
To create this type of user session, procede as above, but instead of creating wm.target, create multiplexer.target:
[Unit] Description=Terminal multiplexer Documentation=info:screen man:screen(1) man:tmux(1) After=cruft.target Wants=cruft.target [Install] Alias=default.target
cruft.target
, like mystuff.target
above, should start anything you think should run before tmux or screen starts (or which you want started at boot regardless of timing), such as a GnuPG daemon session.
You then need to create a service for your multiplexer session. Here is a sample service, using tmux as an example and sourcing a gpg-agent session which wrote its information to /tmp/gpg-agent-info
. This sample session, when you start X, will also be able to run X programs, since DISPLAY is set.
[Unit] Description=tmux: A terminal multiplixer Documentation=man:tmux(1) After=gpg-agent.service Wants=gpg-agent.service [Service] Type=forking ExecStart=/usr/bin/tmux start ExecStop=/usr/bin/tmux kill-server Environment=DISPLAY=:0 EnvironmentFile=/tmp/gpg-agent-info [Install] WantedBy=multiplexer.target
Once this is done, systemctl --user enable
tmux.service
, multiplexer.target
and any services you created to be run by cruft.target
and you should be set to go! Activated user-session@.service
as described above, but be sure to remove the Conflicts=getty@tty1.service
from user-session@.service
, since your user session will not be taking over a TTY. Congratulations! You have a running terminal multiplexer and some other useful programs ready to start at boot!
Window manager
Per eseguire un window manager come servizio di systemd, sarà necessario avviare Xorg come servizio utente. Di seguito, un esempio utilizzando awesome:
~/.config/systemd/user/awesome.service
[Unit] Description=Awesome window manager After=xorg.target Requires=xorg.target [Service] ExecStart=/usr/bin/awesome Restart=always RestartSec=10 [Install] WantedBy=wm.target