Le basi di systemd: lavorare con i servizi, le unità ed il journal

20 Aprile 2015 Utilità di sistema, Comandi Linux, Logging

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:

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.

Facebooktwitterredditpinterestlinkedinmail

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.

*