domenica 26 aprile 2015

Guida a Systemd: strumenti, impostaziome e personalizzazione

Maria Susana Diaz | 18:05 |

Systemd è un sistema ed un manager di servizi per Linux, compatibile con SysV e LSB init scripts. systemd fornisce potenti capacità di parallelizzazionne, usa attivazioni socket e D-Bus per avviare i servizi, offre inizializzazioni di demoni su richiesta, tiene traccia dei processi usando Linux cgroups, supporta lo snapshotting ed il ripristino dello stato del sistema, mantiene il mount e l'automount ed implementa un servizio logico di controllo. Può lavorare come rimpiazzo per sysvinit. Per maggiori informazioni sono disponibili i video http://linuxconfau.blip.tv/file/4696791/ o http://www.youtube.com/watch?v=TyMLi8QF6sw

Per gli amministratori di sistema
Gli amministratori di sistema possono visitare questa pagina per sapere come usare systemctl che sostituisce il vecchio flusso di lavoro in SysVinit. Da notare che i comandi service e chkconfig continueranno a funzionare come previsto anche in systemd.

Strumenti.

  • systemctl: usato per esaminare e controllare lo stato di systemd e del service manager
  • systemd-cgls: ricorsivamente mostra il contenuto della gerarchia del control group selezionato nell'albero
  • systemadm: una interfaccia grafica per systemd e per il service manager. Fa parte del pacchetto systemd-gtk. Si tratta di una versione giovane ancora in lavorazione. Non usarla se non si è sviluppatori.

Systemd_components.svg

Boot Kernel Command Line.

All'avvìo systemd attiva (come predefinito), l'unità target default.target il cui compito è quello di attivare i servizi ed altre unità a seconda delle dipendenze richieste.

Per gestire l'unità da attivare, systemd analizza gli argomenti della propria linea di comando kernel attraverso l'opzione systemd.unit=. Quest'ultima può essere usata per avvii temporanei differenti. I classici run-level sono rimpiazzati come di seguito:

systemd.unit=rescue.target è uno speciale target per impostare un sistema base e la rescue shell (similli al run-level 1); systemd.unit=emergency.target è molto simile al init=/bin/sh ma con l'opzione d'avvìo per l'intero sistema; systemd.unit=multi-user.target per impostare un sistema multi utente non grafico; systemd.unit=graphical.target per impostare il login grafico.

Dettagli a riguardo si trovano alla pagina man systemd.special.

Tutti i file System V init sono stati convertiti in servizi systemd o equivalenti ?

Molti dei sevizi principali (/lib/systemd/system li ha e ne può essere controllato lo stato su http://fedoraproject.org/wiki/User:Johannbg/QA/Systemd/compatability) sono stati convertiti. La transizione è pianificata per Fedora 16. Per i dettagli: http://fedoraproject.org/wiki/Features/SysVtoSystemd. systemd è pienamente compatibile con i vecchi init script.

Quale strumento gestisce systemd ?

systemctl è lo strumento principale da usare. Combina le fuzionalità dei servizi e di chkconfig per abilitarli/disabilitarli permanentemente o solo per la connessione corrente.

Systemctl.

Far riferimento a man systemctl per maggiori dettagli. systemd-cgls lista i processi avviati con un formato ad albero. Può mostrare ricorsivamente il contenuto di ogni control group.

systemd-1

Come avviare/fermare o abilitare/disabilitare i servizi ?

Attiva un servizio immediatamente:

systemctl start foo.service

Disattiva un servizio immediatamente:

systemctl stop foo.service

Riavvia un servizio:

systemctl restart foo.service

Mostra lo stato di un servizio o se è avviato o meno:

systemctl status foo.service

Abilita un servizio per essere inizializzato all'avvìo:

systemctl enable foo.service

Disabilita un servizio per non essere inizializzato all'avvìo:

systemctl disable foo.service

Controlla se un servizio è già abilitato o meno:

systemctl is-enabled foo.service; echo $?

0 indica che è abilitato. 1 indica che è disabilitato. In Fedora 17, in aggiunta al codice di ritorno, "enabled" o "disabled" saranno stampati in output.

Far riferimento a man systemctl per maggiori dettagli.

Come si cambiano i run-level ?

systemd ha il concetto di target che è un rimpiazzo più flessibile rispetto ai runlevel in sysvinit.

Run-level3 è emulato dal multi-user.target. Run-level5 è emulato dal graphical.target. runlevel3.target è un link simbolico al multi-user.target e runlevel5.target è un link simbolico al graphical.target.

Si cambia al 'runlevel 3' con

systemctl isolate multi-user.target (oppure) systemctl isolate runlevel3.target

Si cambia al 'runlevel 5' con

systemctl isolate graphical.target (oppure) systemctl isolate runlevel5.target

Come si cambia il run-level predefinto?

I symlink possono essere ancora usati anche se ormai resi obsoleti, data l'introduzione di un comando integrato per impostare il target predefinito.

systemctl enable graphical.target --force

Symlink:

systemd può anche usare i symlink per puntare al runlevel predefinito. Bisogna cancellare il collegamento simbolico esistente prima di crearne uno nuovo

rm /etc/systemd/system/default.target

Cambio al runlevel 3 come predefinito

ln -sf /lib/systemd/system/multi-user.target /etc/systemd/system/default.target

Cambio al runlevel 5 come predefinito

ln -sf /lib/systemd/system/graphical.target /etc/systemd/system/default.target

systemd non usa il file /etc/inittab.

Come si controlla il run-level corrente?

Il comando runlevel funziona ancora con systemd. E' possibile continuare ad usarlo comunque, emulandolo attraverso i 'targets' anche contemporaneamente.

systemctl list-units --type=target

systemd

Come spegnere la macchina ?

E' possibile usare

poweroff

Altre possibilità sono: halt -p, init 0, shutdown -P now

Da notare che halt è usato per far funzionare lo stesso poweroff nelle versioni precedenti di Fedora, ma systemd li distingue, così halt senza parametri ora fa esattamente quello che dice - semplicemente ferma il sistema senza spegnere.

Il comando service funziona con systemd ?

Sì. E' stato modificato per richiamare systemctl automaticamente quando tratta i file systemd service. Così entrambi questi comandi fanno la stessa cosa

service NetworkManager stop

(oppure)

systemctl stop NetworkManager.service

Il comando chkconfig funziona con systemd?

Sì, per attivare/spegnere i servizi, c'é compatibilità per entrambi i metodi. chkconfig è stato modificato per richiamare systemctl quando si tratta di file systemd service. Inoltre systemctl richiama automaticamente chkconfig quando tratta i tradizionali file sysv init.

Così i seguenti comandi fanno la stessa cosa

chkconfig NetworkManager off

(oppure)

systemctl disable NetworkManager.service

chkconfig --list non lista i servizi systemd, ma solo quelli Sys V. Il suo output fornisce ulteriori informazioni.

system-config-services funziona con systemd?

La versione di system-config-services a partire da Fedora 15 può funzianare per i file systemd service. Se si hanno problemi, creare un bug report.

Come si cambia il numero di getty predefiniti avviati ?

Per aggiungere un altro getty:

Posizionare semplicemente un altro symlink per instanziare un getty nella directory getty.target.wants/ :

ln -sf /lib/systemd/system/getty@.service /etc/systemd/system/getty.target.wants/getty@tty9.service
systemctl daemon-reload
systemctl start getty@tty9.service

Per rimuovere un getty:

Rimuovere il symlink nella directory getty.target.wants/ :

rm /etc/systemd/system/getty.target.wants/getty@tty5.service /etc/systemd/system/getty.target.wants/getty@tty6.service
systemctl daemon-reload
systemctl stop getty@tty5.service getty@tty6.service

systemd non usa il file /etc/inittab.

Come impostare un login automatico su un virtual console terminal?

Prima creare un nuovo servizio simile a getty@.service:

# cp /lib/systemd/system/getty@.service \
     /etc/systemd/system/autologin@.service
# ln -s /etc/systemd/system/autologin@.service \
        /etc/systemd/system/getty.target.wants/getty@tty8.service

editare ExecStart, Restart e Alias values, come questo:

...
ExecStart=-/sbin/mingetty --autologin USERNAME %I
Restart=no
...
Alias=getty.target.wants/getty@tty8.service

riavviare finalmente il demone ed avviare il servizio:

systemctl daemon-reload
systemctl start getty@tty8.service

Da notare che se si esce dalla sessione tty8, è possibile usarlo fino al riavvio successivo o fino all'avvìo manuale da systemctl, a meno che non si impone Restart come ‘always’; è raccomandato comunque evitarlo per motivi di sicurezza.

Come personalizzare un file unit o aggiungerne uno?

I file unit in /etc/systemd/system hanno precedenza sugli unit in /lib/systemd/system. Copiarli dal secondo al primo e personalizzarli a piacimento.

Se una linea inizia con .include seguita da un nome di file, lo stesso file verrà analizzato. Assicurarsi che abbia un'appropriata sezione headers prima di qualsiasi direttiva.

Si dovrebbe usare .include invece di copiare l'intero unit file da /lib/systemd/system a /etc/systemd/system se possibile. Tutto ciò consentirà di aggiornare correttamente le direttive invariate durante i futuri aggiornamenti dei pacchetti.

Prestare attenzione quando si usa .include insieme a direttive che possono essere definite più volte (come EnvironmentFile=); poiché si possono solo aggiungerne delle nuove, senza rimuovere quelle già definite. Meglio copiare l'intero file da /lib/systemd/system a /etc/systemd/system in questo caso.

Se volessimo ad esempio usare un server lighttpd e volessimo abbassare il suo valore niceness. Si deve aggiungere Nice=-5 al file lighttpd.service. é possibile farlo o copiando l'intero file /lib/systemd/system/lighttpd.service in /etc/systemd/system/lighttpd.service o creando il seguente file in /etc/systemd/system/lighttpd.service:

.include /lib/systemd/system/lighttpd.service
[Service]
Nice=-5

Non dimenticarsi di riavviare il demone utilizzando systemctl daemon-reload dopo la modifica del file.

Note.png

Quando si modifica un file unit che ha un symlink che punta a questa unit come fa display-manager.service -> prefdm.service, lo stesso symlink dove essere copiato al posto dell'attuale unit come il display-manager.service dev'essere copiato nella directory /etc/systemd/system oppure una nuova unit creata con .includes che porta questo nome.

Readahead.

systemd ha una implementazione readahead incorporata non abilitata negli upgrades. Dovrebbe migliorare la velocità di avvio, ma può variare a seconda dell'hardware. Per abilitarla:

systemctl enable systemd-readahead-collect.service
systemctl enable systemd-readahead-replay.service

Systemd-on-fedora

Se ti è piaciuto l'articolo, iscriviti al feed per tenerti sempre aggiornato sui nuovi contenuti del blog:

ubuntu-Ubuntulandia-

Trovato questo articolo interessante? Condividilo sulla tua rete di contatti in Twitter, sulla tua bacheca su Facebook, in Linkedin, Instagram o Pinterest. Diffondere contenuti che trovi rilevanti aiuta questo blog a crescere. Grazie!

LINKEDIN