Le basi di systemd: lavorare con i servizi, le unità ed il journal
Introduzione
Negli ultimi anni, le distribuzioni Linux sono passate in misura crescente da altri sistemi di init a systemd
. La suite di strumenti systemd
fornisce un modello di init veloce e flessibile per la gestione di un’intero computer dall’avvio in poi.
In questa guida daremo una veloce scorsa ai più importanti comandi che si dovrebbero conoscere per poter operare con un server gestito da systemd
. Tali comandi dovrebbero funzionare su qualsiasi server che applica systemd
(qualsiasi versione dell’OS pari o superiore a Ubuntu 15.04, Debian 8, CentOS 7, Fedora 15). Cominciamo.
Gestione di base delle unità
L’oggetto base che systemd
gestisce e sul quale agisce è una “unità” (unit). Le unità possono essere di vari tipi, ma il tipo più comune è un “servizio” (indicato da un file di unità che termina in .service
). Per gestire i servizi su un server gestito da systemd
, il nostro strumento principale è il comando systemctl
.
Tutti gli usuali comandi di sistema di init trovano delle azioni equivalenti mediante il comando systemctl
. Per dimostrarlo useremo l’unità nginx.service
(per ottenere questo file di servizio dovrete installare Nginx con il vostro gestore di pacchetti).
Per esempio, possiamo avviare il servizio digitando:
$ sudo systemctl start nginx.service
Possiamo fermarlo nuovamente digitando:
$ sudo systemctl stop nginx.service
Per riavviare il servizio, possiamo digitare:
$ sudo systemctl restart nginx.service
Per tentare di fare il reload del servizio senza interromperne la normale funzionalità, possiamo digitare:
$ sudo systemctl reload nginx.service
Attivare o disattivare le unità
Di default, la maggior parte dei file di unità systemd
non vengono avviati automaticamente al boot. Per configurare questa funzionalità è necessario “attivare” l’unità. Questa attivazione collega l’unità ad un determinato “target” di boot, che ne provoca l’innesco nel momento in cui viene avviato tale target.
Per attivare un servizio che parta automaticamente al boot, digitate:
$ sudo systemctl enable nginx.service
Se si desidera disattivare nuovamente il servizio, digitate:
$ sudo systemctl disable nginx.service
Ottenere una panoramica dello stato del sistema
Per ottenere una visione d’insieme dello stato del sistema, da un server systemd
possiamo estrarre una grande mole di informazioni.
Ad esempio, per ottenere tutti i file di unità che systemd
ha elencato come “attivi”, digitate (in realtà si può omettere list-units
visto che questo è il comportamento di default di systemctl
):
$ systemctl list-units
Per elencare tutte le unità che systemd
ha caricato o tentato di caricare in memoria, comprese quelle che non sono al momento attive, aggiungete il flag --all
:
$ systemctl list-units --all
Per elencare tutte le unità installate sul sistema, comprese quelle che systemd
non ha cercato di caricare in memoria, digitate:
$ systemctl list-unit-files
Visualizzare le informazioni di base di log
Un componente di systemd
chiamato journald
raccoglie e gestisce le voci del journal da tutte le parti del sistema. In pratica sono le informazioni di log delle applicazioni e del kernel.
Per visualizzare tutte le voci del log, a partire dalla più vecchia, digitate:
$ journalctl
Se journald
è configurato per salvare i precedenti record di boot, ciò vi mostrerà, di default, le voci dal boot attuale e da quelli precedenti. Alcune distribuzioni lo abilitano di default, mentre altre non lo fanno (per abilitaro, o modificate il file /etc/systemd/journald.conf
e impostate l’opzione Storage=
a “persistent”, oppure create la directory persistente digitando sudo mkdir -p /var/log/journal
).
Se volete visualizzare solo le voci del journal dal boot corrente, aggiungete il flag -b
:
$ journalctl -b
Per vedere solo i messaggi del kernel, come quelli che sono in genere rappresentati da dmesg
, è possibile usare il flag -k
:
$ journalctl -k
Anche in questo caso, è possibile limitarlo solo al boot corrente aggiungendo il flag -b
:
$ journalctl -k -b
Interrogare gli stati delle unità ed i log
Mentre i comandi precedenti hanno dato accesso allo stato generale del sistema, è anche possibile ottenere informazioni sullo stato delle singole unità.
Per visualizzare una panoramica dello stato attuale di una unità è possibile utilizzare l’opzione status
con il comando systemctl
. Ciò vi mostrerà se l’unità è attiva, le informazioni sul processo e le ultime voci del journal:
$ systemctl status nginx.service
Per visualizzare tutte le voci di log per l’unità in questione, usate l’opzione -u
assieme al nome dell’unità con il comando journalctl
:
$ journalctl -u nginx.service
Come sempre, è possibile limitare le voci al boot corrente aggiungendo il flag -b
:
$ journalctl -b -u nginx.service
Ispezionare le unità ed i file di unità
A questo punto, sappiamo come modificare lo stato di una unità tramite il suo avvio o arresto e sappiamo come visualizzare lo stato e le informazioni del journal per avere un’idea di ciò che sta accadendo al processo. Tuttavia, non abbiamo ancora visto come esaminare altri aspetti delle unità e dei file di unità.
Un file di unità contiene i parametri che systemd
utilizza per gestire ed eseguire una unità. Per vedere l’intero contenuto di un file di unità, digitate:
$ systemctl cat nginx.service
Per visualizzare l’albero delle dipendenze di una unità (che le unità di systemd
tentano di attivare quando si avvia l’unità), digitate:
$ systemctl list-dependencies nginx.service
Ciò mostrerà le unità dipendenti, con le unità target
espanse ricorsivamente. Per espandere tutte le unità dipendenti in modo ricorsivo, passate a systemctl
il flag --all
:
$ systemctl list-dependencies --all nginx.service
Infine, per vedere i dettagli di basso livello delle impostazioni dell’unità sul sistema, è possibile utilizzare l’opzione show
:
$ systemctl show nginx.service
Ciò vi darà il valore di ciascun parametro che viene gestito da systemd
.
Modificare i file di unità
Se avete bisogno di apportare una modifica ad un file di unità, systemd
consente di apportare modifiche dal comando systemctl
stesso di modo che non ci sia bisogno di andare all’effettiva posizione del disco.
Per aggiungere un frammento di file di unità, che può essere utilizzato per aggiungere o sovrascrivere le impostazioni nel file di unità di default, è sufficiente fornire all’unità l’opzione edit
:
$ sudo systemctl edit nginx.service
Se si preferisce modificare l’intero contenuto del file di unità invece di crearne un frammento, passate il flag --full
:
$ sudo systemctl edit --full nginx.service
Dopo la modifica di un file di unità, affinché le modifiche siano operative è necessario ricaricare il processo systemd
stesso:
$ sudo systemctl daemon-reload
Usare i target (runlevel)
Un’altra funzione di un sistema di init è la transizione del server stesso tra diversi stati. In genere i sistemi di init tradizionali si riferiscono a questi stati come “runlevel”, che consentono al sistema di essere in un solo runlevel per volta.
In systemd
, al loro posto vengono usati i “targets”. I target sono fondamentalmente punti di sincronizzazione che il server può usare per portare il server in uno specifico stato. I servizi e altri file di unità possono essere legati ad un target e possono essere attivati contemporaneamente multipli target.
Per vedere tutti i target disponibili sul proprio sistema, digitate:
$ systemctl list-unit-files --type=target
Per visualizzare il target di default a cui systemd
tenta di arrivare al boot (che a sua volta fa partire tutti i file di unità che compongono l’albero delle dipendenze di tale target), digitate:
$ systemctl get-default
È possibile modificare il target di default che verrà usato al boot utilizzando l’opzione set-default
:
$ sudo systemctl set-default multi-user.target
Per vedere quali unità sono legate ad un target, è possibile digitare:
$ systemctl list-dependencies multi-user.target
Potete modificare lo stato del sistema per la transizione tra i target con l’opzione isolate
. Ciò fermerà tutte le unità che non sono legate al target specificato. Assicuratevi che il target che state isolando non fermi qualche servizio essenziale:
$ sudo systemctl isolate multi-user.target
Arrestare o riavviare il server
Per alcuni dei principali stati in cui può transitare un sistema, sono disponibili delle scorciatoie. Per esempio, per spegnere il server è possibile digitare:
$ sudo systemctl poweroff
Se si desidera invece riavviare il sistema, lo si può fare digitando:
$ sudo systemctl reboot
È possibile avviarlo in modalità di ripristino digitando:
$ sudo systemctl rescue
Si noti che la maggior parte dei sistemi operativi includono degli alias tipici per queste operazioni, di modo che si possa semplicemente digitare
sudo poweroff
o sudo reboot
senza il systemctl
. Tuttavia, non è garantito che ciò sia impostato in questo modo su tutti i sistemi.
I passi successivi
A questo punto dovreste conoscere i principi fondamentali su come gestire un server che utilizza systemd
. Tuttavia c’è molto di più da imparare quanto l’ampliamento delle vostre esigenze. Di seguito sono riportati i link alle guide che contengono informazioni più approfondite su alcuni degli elementi che abbiamo discusso in questa guida:
- Come usare systemctl per gestire i servizi di systemd e le unità
- Come utilizzare journalctl per visualizzare e manipolare i log di systemd
- Capire le unità di systemd ed i file delle unità
Nell’imparare come sfruttare i punti di forza del vostro sistema di init, è possibile controllare lo stato dei vostri computer e gestirne più facilmente i servizi e i processi.