fbpx

systemd : il demone di sistema


22 Gen 2020 - Informatica, Software


systemd : il demone di sistema
Systemd è un demone di sistema che è stato sviluppato con lo scopo di parallelizzare il lavoro dei vari processi della macchina. Scopriamolo insieme.


Systemd un demone di sistema… ma cos’è un demone?


Come recita wikipedia:
” In informatica, nei sistemi Unix, e più in generale nei sistemi operativi multitasking, un demone (daemon in inglese) è un programma eseguito in background, cioè senza che sia sotto il controllo diretto dell’utente, tipicamente fornendo un servizio all’utente. Di solito i demoni hanno nomi che finiscono per “d”: per esempio, syslogd è il demone che gestisce i log di sistema, dhcpd è il demone che assegna l’indirizzo IP in maniera dinamica tramite DHCP, httpd è il demone che fa girare il servizio HTTP ecc…”

Inizializzazione ed avvio


All’accenzione del nostro computer con installata una distribuzione Linux parte un processo che si occupa di inizializzare e di avviare tutti i componenti necessari al funzionamento del sistema operativo.
Infatti è responsabile della corretta procedura di avvio di tutti gli altri processi principali.
Fino a qualche tempo fa si chiamava init. Tuttavia per molto tempo le distribuzioni linux non sfruttavano al meglio la parallelizzazione che offrono le moderne CPU e quindi rallentando i tempi di avvio.
Nel 2010 Lennart Poettering, Kay Sievers e “tanti altri” (“and many others come recita la documentazione alla voce “AUTHOR” : https://cgit.freedesktop.org/systemd/systemd/tree/README) hanno inventato e messo a punto un sistema di avvio più efficace ed efficiente.
Fedora 15 fu la prima distribuzione linux ad adottare ufficialmente systemd (scritto con la “s” iniziale minuscola – qui il manuale ufficiale).
In seguito divenne un componente fondamentale di moltissime distribuzioni rimpiazzando i predecessori.

systemd : cos’è e come funziona il demone di sistema


Cerchiamo di vedere insieme in questo articolo cosa offre systemd.
Vi inserirò anche alcuni utili comandi. Infine vedremo come sfruttarlo per gestire automaticamente dei servizi all’avvio del sistema.

Iniziamo con lo specificare che in ogni sistema Unix-Like ogni processo è identificato con un PID (Process IDID del processo per l’appunto).
Dev’esserci sempre un processo con PIS pari a 1. Cioè il primo a partire, il primo ad essere avviato dal kernel.
Come già detto tempo fa era init gestito dal processo di avvio chiamato SysV.
Aveva il difetto di essere lento!
Un sistema di avvio efficiente dovrebbe contemporaneamente eseguire il minor numero di servizi necessari all’avvio e parallelizzare il più possibile la loro esecuzione.
Sostanzialmente è necessario che vengano avviati prima i processi che gestiscono il bluetooth o è meglio dare priorità a processi che gestiscono i log del sistema?
Ecco!
Detta in maniera profana e spicciola SysV o Upstart davano questo tipo di priorità e avviavano uno alla volta i servizi, systemd li avvia in parallelo, li parallelizza appunto.

systemd : il demone di sistema

Comandi principali


A rigor del vero esistono molti tool grafici che permettono di compiere operazioni con systemd, anche con una GUI, cioè con una interfaccia grafica senza dover inserire alcun comando, come systemd-gtk oppure systemd-gui per le distribuzioni Debian.
Vedremo qui alcuno comandi nudi e crudi da terminale.
Per un approfondimento più tecnico vi lascio anche questa documentazione, basta cliccare qui.
Il primo comando fondamentale è systemctl.
Infatti con questo è possibile monitorare lo stato dei servizi, avviarne uno, fermarlo o riavviarlo.


Per visualizzare tutti i processi in esecuzione


systemctl


Per controllare lo stato, avviare, riavviare o fermare un servizio:


# Stato Servizio
systemctl status nomeservizio.service
# ad esempio:
systemctl status dummy.service

# Avvio
systemctl start nomeservizio.service
# ad esempio:
systemctl start dummy.service

# Riavvio
systemctl restart nomeservizio.service
# ad esempio:
systemctl restart dummy.service

# Arresto
systemctl stop nomeservizio.service
# ad esempio:
systemctl stop dummy.service

Inoltre è possibile abilitare/disabilitare l’avvio di un servizio in fase di boot:

# Abilitare l’avvio del servizio in fase di boot
systemctl enable nomeservizio
# ad esempio:
systemctl enable pptpd
# Disabilitare l'avvio del servizio in fase di boot
systemctl disable nomeservizio
# ad esempio:
systemctl disable pptpd

Questo comando serve a pre-caricare alcuni file in memoria cache, consentendo di velocizzare la fase di avvio del sistema. I più esperti la chiamando funzionalità di readahead.

sudo systemctl enable systemd-readahead-collect systemd-readahead-replay

systemd : il demone di sistema

Una utility di systemd è il journalctl (qui il manuale) che come ci suggerisce il nome stesso ci permette di leggere il journal di systemd.
Sostanzialmente ci mostra i log di sistema.

journalctl

Se vogliamo i messaggi di log di un solo programma:

journalctl /usr/bin/my_executable

oppure:

journalctl_PID=[numero_del_PID_del_programma_in_esecuzione]
# il PID è possibile visualizzarlo con il comando
top
# oppure utilizzando un tool molto utile ed intuitivo chiamato htop
sudo apt-get update
sudo apt-get install htop
sudo htop

systemd : i service file di questo demone di sistema

Una peculiarità molto utile di questo sistema è la possibilità di attivare dei processi o un servizio all’avvio della macchina.
E’ possibile farlo con i service file.
Un service file è un file che ha una struttura ben precisa come documentato nel manuale.
Sono molto schematici e semplici e servono sostanzialmente a dire alla macchina cosa dev’essere fatto… il come è preoccupazione del sistema stesso!

Per creare un service file è necessario spostarsi in questa directory:

/usr/lib/systemd/system

Creaiamo qui il nostro file con:

sudo nano ilmioservizio.service

modifichiamo il file come segue:

[Unit]
Description=Descrizione del servizio
[Service]
ExecStart=/usr/bin/esempio
[Install]
WantedBy=graphical.target

Abbiamo definito la descrizione del servizio, il comando che esso eseguirà e il WantedBy indicherà di eseguire il servizio in modalità grafica.

Non ci resta altro fa fare che abilitare il servizio al prossimo avvio della macchina con:

systemctl enable ilmioservizio

Se vogliamo avviarlo immediatamente senza riavviare la macchina:

systemctl start ilmioservizio

Un esempio pratico


Vi riporto nel pratico ciò che è servito a me!

Un esempio pratico : breve premessa



In ambienti linux le pennette usb, gli hard disk esterni e i cd-rom devono essere montati! Significa che il file system (da wikipedia : “Un file system (abbreviazione: FS), in informatica, indica informalmente un meccanismo con il quale i file sono posizionati e organizzati su dispositivi di archiviazione (memorie di massa come disco rigido, CD-ROM, etc. o in casi particolari anche nella RAM) o su dispositivi remoti tramite protocolli di rete.” Immaginatelo come una struttura ad albero ed ogni directory è un ramo! Non a caso si sente parlare di “root“,cioè “radice” quando si parla di filesystem! Da non confondere con l’utente root che è un’altra cosa) deve essere innestato, agganciato, montato appunto, ad una directory del filesystem già in uso.
Sostanzialmente bisogna creare una cartella vuota che si sfrutta come punto di montaggio (mountpoint).

Differenza mount desktop vs server


Soprattutto per rendere i sistemi linux più user-frindly, nelle distribuzioni desktop tutto ciò viene ormai fatto automaticamente e senza alcun tipo di operazione particolare.
Tuttavia nelle distribuzioni server ciò non avviene e il tutto dev’essere fatto a mano!
Cioè creare una directory vuota da qualche parte nel sistema e montare manualmente l’/gli hard-disk!
Non so se esiste qualche altro tipo di sistema ma personalmente ogni volta che mi salta il server che utilizzo mi si smontava l’hard-disk!
Quando ritornava online dovevo entrare in ssh per inserire i comandi per montare l’hard-disk.

systemd per montare automaticamente gli hard-disk all’avvio del server


Utilizza il comando blkid e segnati l’UUID del file system del tuo hard-disk.

sudo apt-get update
sudo apt-get install blkid
sudo blkid

/dev/sda2: LABEL="Srv2" UUID="94b11f2a-d165-42c6-a480-f14ff730a6a6" TYPE="ext4" 
/dev/sda3: LABEL="Srv3" UUID="2185621c-420b-4d21-8b49-3ef4aec85b6e" TYPE="ext4" 
/dev/sda5: LABEL="VM" UUID="1a7d707e-8845-47c1-af40-415a9101294c" TYPE="ext4" 
/dev/sda6: LABEL="Biblioteca" UUID="e76beb7e-a4cd-4cfd-aabb-a79c93752a53" TYPE="ext4" 
/dev/sda7: LABEL="Dati-Home" UUID="688ecf91-3263-4dbb-8050-94151efefdb1" TYPE="ext4" 
/dev/sda8: LABEL="Backup" UUID="632cdd72-cdf8-4386-9b7c-d5679adf5342" TYPE="ext4" 
/dev/sda1: UUID="905c7def-adfd-4904-8c22-b29761e37d3f" TYPE="ext4" 
/dev/sdc1: UUID="40b3b70c-c013-4518-b426-df31711fad71" TYPE="ext3" 
/dev/sdc2: UUID="0a6a1118-b4c4-41aa-8b48-412fb3bac216" TYPE="ext2"

Spostanti in /etc/systemd/system e crea un file con estensione .mount

[Unit]
Description=Additional drive

[Mount]
What=/dev/disk/by-uuid/[INSERISCI QUI L'UUID CHE TI SEI SEGNATO PRIMA CON TANTO DI TRATTINI]
Where=/mnt/driveone
Type=ext4
Options=defaults

[Install]
WantedBy=multi-user.target

Abilita con:

systemctl enable nomeFile.mount

Crea un altro file nella stessa directory con estensione .automount:

Description=Automount Additional Drive

[Automount]
Where=/mnt/driveone

[Install]
WantedBy=multi-user.target

Abilita con:

systemctl enable nomeFile.automount

Per qualsiasi dubbio o problema non esitare a contattarmi.

GiustinoRomano.IT – I do IT with my Heart.

Tag:, , ,


Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *