systemd/User (Italiano)

From ArchWiki
Revision as of 19:40, 10 January 2013 by Hilinus (Talk | contribs) (Created page with "{{Lowercase title}} Category:Daemons and system services (Italiano) Category:Boot process (Italiano) en:Systemd/User {{Article summary start|Sommario}} {{Article s...")

(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to: navigation, search

Sommario help replacing me
Come gestire le sessioni utente di systemd.
Articoli correlati
systemd (Italiano)

systemd offre agli utenti la possibilità di eseguire un'istanza di systemd per gestire i propri processi e servizi, consentendo di avviare, fermare, abilitare e disabilitare le unità che si trovano in certe directory quando systemd viene eseguito dall'utente. Ciò è utile per demoni e altri servizi che comunemente non vengono avviati da root oppure utilizzano un utente apposito, come avviene con mpd.

Setup

startx

Si faccia gestire la propria sessione da systemd-logind. Se systemd è stato eseguito come sistema di init, allora non è necessario compiere alcuna operazione.

L'utente dovrà ora lanciare un'istanza di systemd inserendo quanto segue nel proprio ~/.xinitrc, prima della riga che inizia con exec:

systemd --user &

Dopo l'avvio di X, è possibile controllare se la sessione è gestita da systemd-logind utilizzando il seguente comando:

$ loginctl --no-pager show-session $XDG_SESSION_ID | grep Active

Se l'output corrisponde a Active=yes, allora si sta utilizzando systemd-logind per gestire la sessione. Rimuovere eventuali occorrenze di ck-launch-session o dbus-launch dal proprio ~/.xinitrc, dal momento che tali comandi non sono più richiesti.

Display Managers

I principali Display Manager utilizzano systemd-logind di default, perciò il comando loginctl menzionato nella sezione precedente dovrebbe funzionare come previsto. Sarà semplicemente necessario aggiungere systemd --user all'elenco dei programmi che l'ambiente desktop avvia automaticamente.

Utilizzare systemd --user per gestire la propria sessione

Systemd ha molte caratteristiche utili, una delle quali è la capacità di tracciare i programmi utilizzando i cgroups (si esegua systemctl status). Benchè ciò sia veramente utile per un sistema di init il cui processo ha pid 1, anche la modalità utente può avvalersi di questa caratteristica per avviare automaticamente i programmi dello stesso, tracciando al tempo stesso il contenuto di ogni cgroup.

Tutte le units dell'utente andranno inserite in $HOME/.config/systemd/user ed avranno la precedenza sulle altre unità contenute nelle directory di sistema.

Sarà necessario installare due pacchetti per avvalersi di questa funzionalità, entrambi reperibili su AUR: xorg-launch-helperAUR e user-session-unitsAUR, se si desidera utilizzare l'autologin.

Inizializzare quindi i propri targets. È consigliabile crearne due: una per il window manager e l'altra come target di default. Il target del window manager dovrebbe essere simile al seguente:

$HOME/.config/systemd/user/wm.target
[Unit]
Description=Window manager target
Wants=xorg.target
Wants=myStuff.target
Requires=dbus.socket
AllowIsolate=true

[Install]
Alias=default.target

Si crei poi un secondo target chiamato mystuff.target, che andrà poi inserito nel campo WantedBy di tutti i servizi che si intende avviare ad eccezione del window manager:

$HOME/.config/systemd/user/mystuff.target
[Unit]
Description=Xinitrc Stuff
Wants=wm.target

[Install]
Alias=default.target

Si crei un link simbolico di nome default.target, che punta al target di cui sopra. Quando si esegue systemd --user, questo sarà il target avviato.

Infine, si scrivano i vari files .service corrispondenti ai servizi da avviare. Si inizi con quello del window manager:

$HOME/.config/systemd/user/mystuff.target
[Unit]
Description=your window manager service
Before=mystuff.target
After=xorg.target
 
[Service]
Requires=xorg.target
#Environment=PATH=decommentare:per:sovrascrivere:PATH
Environment=DISPLAY=:0
ExecStart=/percorso/assoluto/ad/eseguibile/wm
Restart=always
RestartSec=10
 
[Install]
WantedBy=wm.target
Nota: La sezione [Install] include il valore WantedBy, che permetterà al servizio di essere linkato come $HOME/.config/systemd/user/wm.target.wants/i3.service, quando si utilizza systemd --user enable, consentendone l'avvio al login. È consigliabile abilitare questo servizio con systemctl e non linkarlo manualmente.

È ora possibile riempire la directory delle unità con tutti i servizi di cui si potrebbe aver bisogno, come ad esempio mpd, gpg-agent, offlineimap, parcellite, pulse, tmux, urxvtd, xbindkeys e xmodmap.

Login automatico

Se si vuole utilizzare il login automatico al boot, è possibile utilizzare la relativa unit fornita dal pacchetto user-session-unitsAUR. Si consideri l'idea di abilitare uno screen locker per evitare che qualcuno possa avvalersi della sessione appena avviata.

Se si è installato il pacchetto user-session-unitsAUR, sarà necessario copiare user-session@service in /etc/systemd/system e modificarlo cambiando la seguente linea:

Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%I/dbus/user_bus_socket

In:

Environment=DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/%U/dbus/user_bus_socket
Nota: Si noti la modifica di %I in %U.

Si modifichi anche la sezione [Install]:

[Install]
WantedBy=graphical.target

Sarà necessario patchare systemd per utilizzare questa funzionalità, utilizzando systemd-git dopo il commit 067d851d o patchandolo direttamente utilizzando ABS. La modifica dovrebbe essere inclusa in systemd a partire dalla versione 197.

Si aggiunga questa linea ai files /etc/pam.d/login e /etc/pam.d/system-auth:

session    required    pam_systemd.so

Dal momento che user-session@.service viene avviato sulla tty1, sarà necessario aggiungere Conflicts=getty@tty1.service al .service in questione.

Una delle cose più importanti da aggiungere ai propri .service è l'utilizzo di Before= e After= nella sezione [Unit], che permettono di determinare l'ordine di avvio dei servizi. Si supponga di disporre di una applicazione grafica che si vuole avviare al boot: sarà possibile farlo aggiungendo After=xorg.target al proprio .service. Si supponga inoltre di voler avviare ncmpcpp che richiede mpd per funzionare: in tal caso si dovrà aggiungere After=mpd.service al .service di ncmpcpp.

Col tempo e l'esperienza si capirà come gestire l'ordine di avvio delle applicazioni, oppure leggendo le pagine di man di systemd. Iniziare con systemd.unit(5) è una buona idea.

Servizi Utente

Gli utenti possono ora interagire con le unità poste nelle seguenti directory proprio come farebbero con i servizi di sistema (ordinate in modo ascendente di preferenza):

  • /usr/lib/systemd/user/
  • /etc/systemd/user
  • ~/.config/systemd/user

Per controllare l'istanza di systemd, si utilizzi il comando systemctl --user.

Servizi installati da pacchetti

I pacchetti che forniscono servizi pensati per essere avviati dall'utente, possono installarli in /usr/lib/systemd/user/. L'amministratore di sistema può quindi modificare l'unità copiandola in /etc/systemd/user/ e quest'ultima potrà a sua volta essere modificata dall'utente copiandola in ~/.config/systemd/user.

Esempio

Quanto segue è una versione utente del servizio di mpd:

mpd.service
[Unit]
Description=Music Player Daemon

[Service]
ExecStart=/usr/bin/mpd --no-daemon

[Install]
WantedBy=default.targets

Esempio con variabili

Quanto segue è una versione utente del servizio sickbeard.service, che utilizza una variabile contenente il valore della home directory dell'utente che lo esegue, utilizzata da SickBeard per trovare alcuni files:

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 spiegato in man systemd.unit, la variabile %h contiene il valore della home directory dell'utente che esegue il servizio. È possibile utilizzare altre variabili, il cui elenco è disponibile nelle pagine di man di systemd.

Articoli correlati