Le Unit di systemd: cosa sono e come organizzano il sistema Linux
Nel precedente articolo abbiamo imparato a utilizzare systemctl per avviare, arrestare e controllare i servizi di sistema. A questo punto potrebbe sorgere una domanda naturale: che cosa sta realmente gestendo systemctl?
La risposta è semplice: le Unit di systemd.
Ogni elemento amministrato da systemd — un servizio, un timer, un punto di montaggio, un dispositivo o persino una fase dell’avvio del sistema — viene descritto attraverso una Unit.
Comprendere questo concetto è probabilmente il passo più importante per imparare davvero systemd. Una volta capito cosa rappresentano le Unit, sarà molto più semplice creare servizi personalizzati, automatizzare operazioni e interpretare il comportamento del sistema.
Che cos’è una Unit?
Possiamo immaginare una Unit come una scheda descrittiva.
Non contiene il programma vero e proprio, ma tutte le informazioni necessarie affinché systemd sappia come gestirlo.
Ad esempio:
- quale comando deve essere eseguito;
- quando deve essere avviato;
- da quali altri componenti dipende;
- quando deve essere terminato;
- come comportarsi in caso di errore.
In pratica, systemd non “conosce” direttamente Apache, MariaDB o SSH: conosce le rispettive Unit, che descrivono il comportamento di ciascun componente.
È proprio per questo motivo che quasi tutto ciò che viene amministrato da systemd è rappresentato da un file con un’estensione specifica.
Ogni tipo di Unit ha uno scopo preciso
Uno degli aspetti più eleganti di systemd è che ogni tipo di risorsa viene rappresentato da una Unit dedicata.
Le più comuni sono:
| Tipo | Descrizione |
|---|---|
.service |
Gestisce servizi e demoni in esecuzione |
.target |
Raggruppa altre Unit e definisce uno stato del sistema |
.timer |
Pianifica attività nel tempo, alternativa a cron |
.socket |
Avvia automaticamente un servizio quando arriva una connessione |
.mount |
Gestisce i punti di montaggio dei file system |
.automount |
Monta automaticamente una risorsa quando viene richiesta |
.path |
Controlla modifiche a file e directory |
.swap |
Gestisce lo spazio di swap |
.device |
Rappresenta i dispositivi rilevati dal kernel |
Non è necessario impararle tutte subito.
Nella pratica, un amministratore Linux utilizza soprattutto le Unit .service, .timer e .target, mentre le altre vengono incontrate in situazioni più specifiche.
Le Unit collaborano tra loro
Le Unit non lavorano in modo isolato.
Una delle caratteristiche più potenti di systemd è la gestione delle dipendenze.
Immaginiamo un server web.
Prima di poter essere avviato potrebbe essere necessario che:
- la rete sia attiva;
- il file system sia montato;
- un database sia già disponibile.
Queste relazioni vengono dichiarate direttamente nella Unit attraverso direttive come:
After=Before=Requires=Wants=
Grazie a queste informazioni, systemd costruisce automaticamente l’ordine corretto di avvio del sistema, evitando che un componente venga eseguito quando le sue dipendenze non sono ancora soddisfatte.
Non approfondiremo ora queste direttive: saranno l’argomento di una guida dedicata, quando inizieremo a creare i nostri servizi personalizzati.
Dove si trovano le Unit?
Una domanda frequente riguarda la posizione dei file.
Le Unit possono trovarsi in directory differenti, a seconda della loro origine.
Le più importanti sono:
| Percorso | Contenuto |
|---|---|
/usr/lib/systemd/system/ |
Unit installate dai pacchetti della distribuzione |
/etc/systemd/system/ |
Unit create o modificate dall’amministratore |
/run/systemd/system/ |
Unit generate dinamicamente durante l’esecuzione |
In generale è buona norma non modificare direttamente le Unit installate dalla distribuzione. Se si desidera personalizzarne il comportamento è preferibile utilizzare override oppure creare nuove Unit nella directory /etc/systemd/system/.
Questo approccio permette di mantenere le personalizzazioni anche dopo gli aggiornamenti del sistema.
Perché conoscere le Unit è così importante?
Molte operazioni di amministrazione ruotano attorno a questi file.
Quando in futuro creeremo un nostro servizio, in realtà non faremo altro che scrivere una nuova Unit di tipo .service.
Quando sostituiremo un’attività pianificata con un timer, creeremo una Unit .timer.
Quando analizzeremo l’avvio del sistema, scopriremo che anche i vari stati del boot sono rappresentati da Unit .target.
In altre parole, imparare il concetto di Unit significa comprendere il linguaggio con cui systemd descrive l’intero sistema operativo.
Conclusioni
Le Unit rappresentano uno degli elementi fondamentali di systemd e costituiscono il modello con cui vengono descritti servizi, dispositivi, punti di montaggio, timer e molte altre risorse del sistema.
Non è necessario ricordare subito tutte le tipologie disponibili. È sufficiente comprendere che ogni componente gestito da systemd è rappresentato da una Unit e che ciascun tipo svolge un ruolo ben preciso.
Nel prossimo articolo metteremo in pratica quanto appreso realizzando la nostra prima Unit di tipo .service. Vedremo come creare un servizio personalizzato, come installarlo nel sistema e come amministrarlo attraverso systemctl.
LICENZA E CONDIZIONI D’USO
Questo How-to è rilasciato sotto licenza Creative Commons Attribution-NonCommercial 3.0 Italy.
CONTATTI DELL’AUTORE
Marco Ciammella marco@orvietolinux.it
Orvieto Linux User Group info@orvietolinux.it