Indice dei contenuti dell'articolo:
Systemd è un meccanismo di gestione e servizio, comunemente noto come “system daemon”. È diventato fondamentale in RHEL7 e versioni successive, assumendo la responsabilità di inizializzare e attivare risorse di sistema e daemon di server all’avvio e durante l’esecuzione del sistema. In parole semplici, systemd avvia e gestisce tutti i tipi di processi e servizi in Linux. Tecnicamente, è un programma inizializzatore che porta il sistema a uno stato definito attivando tutti i servizi e processi abilitati in quello stato, usando file di configurazione per conoscere quali servizi e processi sono abilitati in ogni stato.
Evoluzione dei sistemi di init fino a Systemd
Il systemd è il successore dei programmi inizializzatori SysVinit e Upstart. SysVinit, creato negli anni ’80 per i sistemi ‘UNIX System V’, è stato a lungo lo standard fino a RHEL5. Questo programma definiva sei stati di sistema, noti come livelli di esecuzione, e mappava tutti i processi e servizi a questi livelli. Tuttavia, SysVinit era pensato per un ambiente statico e non gestiva bene i dispositivi hot-plug, come le unità USB.
Upstart è stato sviluppato come sostituto di SysVinit per operare in un ambiente più flessibile. Offriva vantaggi come la gestione dei servizi basata su eventi, l’avvio asincrono dei servizi e il riavvio automatico dei servizi in crash. A differenza di SysVinit, Upstart non usava livelli di esecuzione, ma eventi di sistema per avviare e fermare i servizi.
SysVinit
La storia di SysVinit inizia negli anni ’80, quando fu introdotto per i sistemi ‘UNIX System V’. In quel periodo, rappresentava un grande passo avanti nella gestione dei sistemi operativi UNIX. SysVinit rimase lo standard per diversi sistemi operativi, inclusi quelli basati su Linux come Red Hat Enterprise Linux (RHEL) fino alla versione 5, rilasciata nel 2007. Il suo ruolo era di organizzare il processo di avvio del sistema in sei stati di sistema o livelli di esecuzione, ognuno dei quali rappresentava un diverso stato di operatività del sistema, da un avvio completo a uno stato di ripristino o manutenzione. Tuttavia, SysVinit aveva limitazioni significative: era progettato per un ambiente di sistema più statico e non gestiva efficacemente nuovi sviluppi come i dispositivi hot-plug.
Upstart
In risposta alle limitazioni di SysVinit, venne sviluppato Upstart, introdotto per la prima volta in Ubuntu nel 2006. Upstart era un tentativo di modernizzare il processo di avvio, introducendo concetti come la gestione dei servizi basata su eventi e l’avvio asincrono dei servizi. Questo significava che i servizi potevano essere avviati o fermati in risposta a eventi specifici, piuttosto che secondo un ordine prestabilito come in SysVinit. La capacità di Upstart di riavviare automaticamente i servizi in crash e di gestire meglio i dispositivi hot-plug rappresentava un netto miglioramento rispetto al suo predecessore. Tuttavia, anche Upstart aveva le sue limitazioni, in particolare nella gestione di complesse dipendenze tra servizi.
Systemd
Infine, systemd è emerso come il successore di Upstart e SysVinit. Sviluppato da Lennart Poettering e Kay Sievers di Red Hat, systemd è stato rilasciato per la prima volta nel 2010 e adottato da Fedora nel 2011. Rappresenta un cambiamento radicale nel modo in cui Linux gestisce il processo di avvio e la supervisione dei servizi. Systemd introduce un approccio più integrato e dinamico, gestendo non solo l’avvio dei servizi ma anche le sessioni utente, i mount point, i socket e altre risorse di sistema. Con funzionalità come l’avvio parallelo dei servizi, la risoluzione delle dipendenze, e una gestione avanzata tramite cgroups, systemd ha ridefinito l’efficienza e la flessibilità nella gestione dei sistemi Linux moderni.
Queste transizioni, da SysVinit a Upstart e poi a systemd, riflettono l’evoluzione continua dei sistemi operativi Linux e la ricerca di soluzioni sempre più efficienti e adatte alle esigenze di un ambiente in rapida evoluzione.
Caratteristiche e Vantaggi di Systemd
Systemd, il moderno programma inizializzatore, è utilizzato dalla maggior parte degli sviluppatori Linux, incluso RedHat (da versione 7) e Ubuntu (da versione 15.04). Questo sistema è più complesso e offre molte funzionalità e strumenti per gestire servizi, dispositivi, socket, punti di montaggio, aree di swap, tipi di unità, target e molto altro.
I vantaggi di systemd includono diverse caratteristiche significative:
- Avvio dei Servizi in Modalità Parallela: Systemd è in grado di avviare servizi simultaneamente invece di farlo in sequenza. Questo approccio parallelo riduce significativamente il tempo di avvio del sistema, migliorando le performance generali. Diversi servizi possono essere avviati contemporaneamente, a condizione che non abbiano dipendenze l’uno dall’altro, ottimizzando l’uso delle risorse del sistema.
- Risoluzione Automatica delle Dipendenze: Systemd gestisce in modo intelligente le dipendenze tra i vari servizi. Identifica e risolve automaticamente queste dipendenze, garantendo che i servizi vengano avviati nell’ordine corretto. Questo elimina la necessità di configurazioni manuali complesse, rendendo il processo di avvio più efficiente e meno soggetto a errori.
- Capacità di Riavviare Processi: Systemd ha la capacità di monitorare e riavviare automaticamente i servizi che si interrompono inaspettatamente. Questo garantisce una maggiore stabilità del sistema, poiché i servizi critici possono essere rapidamente ripristinati senza intervento umano, minimizzando i tempi di inattività.
- Tracciamento e Associazione di Processi tramite Gruppi di Controllo Linux (cgroups): Systemd utilizza i cgroups per organizzare e gestire i processi in modo efficiente. Questo permette di allocare risorse come CPU e memoria a specifici gruppi di processi, migliorando la gestione delle risorse e isolando i processi l’uno dall’altro, il che aumenta la sicurezza e la stabilità del sistema.
- Supporto per Hardware Moderno: Systemd offre un ampio supporto per hardware moderno, inclusi dispositivi hot-plug come unità USB e dischi esterni. Ciò significa che systemd è in grado di gestire dinamicamente questi dispositivi non appena vengono collegati o scollegati, migliorando l’usabilità e la flessibilità del sistema.
- Avvio di Daemon su Richiesta: Con systemd, i daemon possono essere avviati su richiesta, senza necessità di riavviare il servizio già in esecuzione. Questo è particolarmente utile per servizi che non devono essere eseguiti continuamente, ma solo quando necessario, riducendo così l’uso delle risorse del sistema.
- Creazione di Snapshot dello Stato di Sistema in Esecuzione: Systemd permette di creare snapshot dello stato attuale del sistema. Questi snapshot possono essere utilizzati per ripristinare lo stato del sistema a un punto precedente, una funzionalità utile in caso di errori o malfunzionamenti.
- Registrazione degli Eventi: Infine, systemd fornisce un meccanismo di registrazione avanzato, che permette di tracciare e analizzare tutti gli eventi relativi ai servizi e ai processi del sistema. Questo è fondamentale per il debugging e per mantenere il sistema sicuro e funzionante in modo ottimale.
Queste caratteristiche rendono systemd uno strumento versatile e potente per la gestione dei moderni sistemi operativi Linux, migliorando significativamente la gestione, la sicurezza e le prestazioni dei servizi e dei processi del sistema.
Il concetto di Unit in Systemd
In systemd, il concetto di “Unit” rappresenta uno dei pilastri fondamentali su cui si basa questa tecnologia. Una Unit in systemd è un oggetto che rappresenta un servizio, un processo, una risorsa o un punto di attivazione all’interno del sistema. Ogni Unit è descritta da un file di configurazione, che specifica come systemd deve gestire il servizio o la risorsa corrispondente. Questi file di configurazione sono chiari, strutturati e facilmente leggibili, e si trovano solitamente in /etc/systemd/system
o in /lib/systemd/system
.
Le Unit in systemd sono categorizzate in diversi tipi, ognuno dei quali ha uno scopo specifico. I tipi più comuni includono:
- Service Units: Gestiscono i servizi di sistema, come server web o database. Sono identificati dai file con estensione
.service
. - Socket Units: Utilizzati per la gestione dei socket di rete e IPC, consentono la comunicazione tra processi. Sono rappresentati dai file
.socket
. - Device Units: Rappresentano dispositivi hardware e vengono creati dinamicamente in risposta a dispositivi hardware rilevati dal sistema. Sono identificati dai file
.device
. - Mount Units: Gestiscono i punti di montaggio nel file system, corrispondenti ai file
.mount
. - Target Units: Forniscono un meccanismo per raggruppare diverse Unit, facilitando la gestione di set complessi di dipendenze e l’avvio coordinato di servizi. I file
.target
rappresentano questi gruppi.
Ogni Unit può avere una serie di direttive che definiscono come essa debba comportarsi. Queste direttive possono includere, ad esempio, l’ordine in cui i servizi devono essere avviati, le dipendenze tra i vari servizi, o le azioni da intraprendere in caso di errore di un servizio. Il sistema systemd analizza questi file di configurazione all’avvio del sistema o quando un amministratore richiede di avviare, fermare o riavviare una Unit.
L’introduzione delle Unit in systemd ha semplificato notevolmente la gestione dei servizi e delle risorse in Linux, rendendo il processo più scalabile, gestibile e comprensibile. Questo approccio modulare e unitario permette agli amministratori di avere un controllo più granulare sul comportamento dei servizi e sulle relazioni tra di essi, portando a una gestione del sistema più efficiente e flessibile.
Systemd come watchdog al posto di supervisord
Systemd offre una funzionalità integrata di watchdog, che consente agli amministratori di sistema di utilizzarlo come alternativa a strumenti esterni come Supervisord per il monitoraggio e la gestione dei servizi. Il concetto di watchdog in systemd si basa sulla capacità di monitorare attivamente i servizi e i processi, riavviandoli automaticamente in caso di malfunzionamento o arresto imprevisto. Questo si traduce in una maggiore resilienza e stabilità del sistema.
La caratteristica principale di systemd come watchdog è la sua integrazione nativa con l’ecosistema Linux. A differenza di Supervisord, che richiede una configurazione e gestione separate, systemd è già parte integrante della maggior parte delle moderne distribuzioni Linux, offrendo una soluzione unificata per l’avvio, la supervisione e la gestione dei servizi.
Per utilizzare systemd come watchdog, gli amministratori possono sfruttare diverse direttive nei file di configurazione delle unità di servizio. Queste includono opzioni come Restart=
, che definisce le condizioni e la frequenza con cui un servizio deve essere riavviato in caso di fallimento, e WatchdogSec=
, che imposta un timer per il watchdog. Quando un servizio non segnala attività entro il tempo specificato da WatchdogSec=
, systemd interviene automaticamente per tentare di ripristinare il servizio.
Questa funzionalità rende systemd non solo un inizializzatore di sistema, ma anche uno strumento potente per mantenere la stabilità e l’affidabilità dei servizi critici. Con systemd, gli amministratori possono configurare sistemi auto-riparanti, dove i servizi sono costantemente monitorati e mantenuti in uno stato funzionante senza la necessità di interventi manuali frequenti. In questo senso, systemd agisce come un sistema di salvaguardia incorporato, aumentando l’uptime del sistema e riducendo i potenziali downtime causati da crash o errori dei servizi.
Il Rifiuto Iniziale di Systemd da parte della comunità Linux
L’introduzione di systemd nel mondo Linux non è stata accolta unanimemente con entusiasmo. Al contrario, ha incontrato una resistenza significativa da parte di una porzione della comunità Linux. Questo rifiuto era in gran parte dovuto a preoccupazioni relative alla complessità e alla centralizzazione delle funzionalità che systemd introduceva, rompendo con il tradizionale approccio Unix di “fare una cosa e farla bene”. Alcuni utenti e sviluppatori hanno visto systemd come un’usurpazione dell’approccio tradizionale di Linux, con il suo sistema integrato che gestisce molti aspetti del sistema operativo, che in precedenza erano gestiti da una varietà di strumenti più piccoli e modulari. Inoltre, la rapida adozione di systemd da parte di molte delle principali distribuzioni Linux ha generato preoccupazioni sulla diminuzione della diversità e della scelta nel panorama Linux.
La Nascita di Devuan come Alternativa per i veterani.
In risposta al crescente dissenso nei confronti di systemd, è nata una nuova distribuzione Linux chiamata Devuan (di cui abbiamo parlato in questo articolo Devuan Linux: Alternativa Centrata sulla Libertà al Sistema Operativo Debian). Lanciata nel 2014, Devuan è emersa come una fork di Debian, una delle distribuzioni Linux più popolari, specificatamente per offrire un’alternativa senza systemd. L’obiettivo principale di Devuan era quello di mantenere l’eredità dell’inizializzazione tradizionale, offrendo agli utenti la libertà di scelta e un’esperienza meno complessa rispetto a systemd. Questa distribuzione ha attratto soprattutto gli utenti tradizionalisti di Linux, coloro che preferiscono l’approccio modulare e decentralizzato all’amministrazione del sistema. Devuan si è dimostrata particolarmente attraente per i neofiti di Linux, che cercano un sistema operativo semplice e meno intricato, e per coloro che desiderano avere un maggiore controllo manuale sui vari aspetti del loro sistema operativo.
Guida ai comandi da SysVinit a Systemd
La transizione da SysVinit a systemd ha portato a significativi cambiamenti nella gestione dei servizi e dei processi nei sistemi Linux. Per gli amministratori di sistema e gli utenti abituati ai comandi SysVinit, l’adattamento a systemd può sembrare inizialmente una sfida. Questa guida è progettata per facilitare questa transizione, fornendo una comparazione diretta tra i comandi SysVinit tradizionali e i loro equivalenti in systemd. Questo confronto aiuterà gli utenti a comprendere meglio come i comandi familiari siano stati trasformati e come possano essere utilizzati nel nuovo sistema. Di seguito è riportata una tabella che illustra la sintassi dei comandi SysVinit e i loro corrispettivi in systemd, facilitando l’aggiornamento delle competenze e la comprensione del nuovo paradigma di gestione dei sistemi.
Comandi Relativi ai Servizi
Commenti | SysVinit | Systemd |
---|---|---|
Avviare un servizio | service dummy start | systemctl start dummy.service |
Fermare un servizio | service dummy stop | systemctl stop dummy.service |
Riavviare un servizio | service dummy restart | systemctl restart dummy.service |
Ricaricare un servizio | service dummy reload | systemctl reload dummy.service |
Verificare lo stato di un servizio | service dummy status | systemctl status dummy.service |
Avviare un servizio all’avvio se già in esecuzione | service dummy condrestart | systemctl try-restart dummy.service |
Abilitare un servizio all’avvio | chkconfig dummy on | systemctl enable dummy.service |
Disabilitare un servizio all’avvio | chkconfig dummy off | systemctl disable dummy.service |
Verificare se un servizio è abilitato all’avvio | chkconfig dummy | systemctl is-enabled dummy.service |
Creare un nuovo file di servizio o modificare la configurazione | chkconfig dummy --add | systemctl daemon-reload |
Livelli di Esecuzione – Runlevels
Commenti | SysVinit | Systemd |
---|---|---|
Arresto del sistema | 0 | runlevel0.target, poweroff.target |
Modalità utente singolo | 1, s, single | runlevel1.target, rescue.target |
Multi utente | 2 | runlevel2.target, multi-user.target |
Multi utente con Network | 3 | runlevel3.target, multi-user.target |
Sperimentale | 4 | runlevel4.target, multi-user.target |
Multi utente, con network, modalità grafica | 5 | runlevel5.target, graphical.target |
Riavvio | 6 | runlevel6.target, reboot.target |
Shell di emergenza | emergency | emergency.target |
Cambiare al multi utente runlevel/target | telinit 3 | systemctl isolate multi-user.target (OR systemctl isolate runlevel3.target ) |
Impostare il target multi-utente al prossimo avvio | sed -i 's/id:3:initdefault:/id:5:initdefault:/' /etc/inittab | ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target |
Controllare il runlevel corrente | runlevel | systemctl get-default |
Cambiare il runlevel predefinito | sed -i 's/id:3:initdefault:/id:5:initdefault:/' /etc/inittab | systemctl set-default multi-user.target |
Comandi Vari
Commenti | SysVinit | Systemd |
---|---|---|
Arresto del sistema | halt | systemctl halt |
Spegnimento del sistema | poweroff | systemctl poweroff |
Riavvio del sistema | reboot | systemctl reboot |
Sospensione del sistema | pm-suspend | systemctl suspend |
Ibernazione | pm-hibernate | systemctl hibernate |
Seguire il file di log del sistema | tail -f /var/log/messages o tail -f /var/log/syslog | journalctl -f |
Nuovi Comandi di Systemd
Commenti | Systemd |
---|---|
Eseguire un comando systemd su un host remoto | systemctl -H user@host |
Verificare il tempo di avvio | systemd-analyze o systemd-analyze time |
Uccidere tutti i processi relativi a un servizio | systemctl kill dummy |
Ottenere i log degli eventi di oggi | journalctl --since=today |
Hostname e altre informazioni relative all’host | hostnamectl |
Data e ora del sistema con timezone e altre informazioni | timedatectl |
Questa tabella non è esaustiva, ma copre i comandi più comunemente utilizzati, fornendo un riferimento pratico per gli utenti che passano da SysVinit a systemd. Con questa guida, l’obiettivo è rendere il processo di transizione il più fluido e intuitivo possibile.
Conclusione e consigli
Nel vasto mondo in continua evoluzione dei sistemi operativi Linux, Systemd non è solo una tendenza, ma una trasformazione fondamentale che ha ridefinito la gestione dei servizi e dei processi in Linux. Per gli amministratori di sistema, l’apprendimento e la padronanza di Systemd non sono più opzioni, ma necessità imprescindibili.
Il distacco dal vecchio sysvinit al più moderno e versatile Systemd non è solo un passaggio tecnologico, ma anche un salto qualitativo nelle competenze richieste ai professionisti IT. La maggior parte delle distribuzioni Linux moderne, da Debian a Fedora, da Ubuntu a CentOS, si affidano ora a Systemd per la gestione dei servizi. Questo sposta l’ago della bilancia da un sistema di init tradizionale, che molti hanno conosciuto e utilizzato per anni, a un ecosistema più complesso e potente, dove le competenze su Systemd diventano essenziali.
Imparare Systemd non è solo un investimento nel mantenimento della propria rilevanza professionale; è anche un’opportunità per esplorare nuove modalità di ottimizzazione delle prestazioni, gestione delle risorse e automazione in ambienti Linux.