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 managersystemd-cgls
: ricorsivamente mostra il contenuto della gerarchia del control group selezionato nell'alberosystemadm
: 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.
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.
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
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.
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