Systemd comandi utili
Contents
Esempi veloci
- Conoscere tutti i device su cui è possibile sincronizzarsi
systemctl -a -t device
- Alias utili
alias sc='systemctl --no-pager -l -a' alias sa='systemd-analyze' alias jc='journalctl --no-pager -l'
- Impostare un limite alla memoria usabile da un processo (CONFIG_CGROUP_MEM_RES_CTLR nel .config del kernel)
[Service] ExecStart=/usr/bin/processo MemoryAccounting=true MemoryLimit=100M
- Limitare la visibilità di un device a un processo (CONFIG_CGROUP_DEVICE nel .config del kernel)
[Service] ExecStart=/usr/bin/amixer DeviceAllow=/dev/null r oppure DeviceAllow=/dev/null rwm
- Creare un container per processi
Container.slice [Slice] DeviceAllow=/dev/null r MemoryAccounting=true MemoryLimit=100M Process.service [Service] Slice=Container.slice ExecStart=/usr/bin/amixer
Verificare il Boot
Systemd mette a disposizione il comando systemctl per interrogare il sistema sullo stato dei servizi nativi di systemd e quelli SysV/LSB. Senza parametri systemctl restituisce la lista di tutti i servizi con i relativi stati:
$systemctl UNIT LOAD ACTIVE SUB JOB DESCRIPTION dev-hugepages.automount loaded active running Huge Pages File System Automount Point boot.mount loaded active mounted /boot sys-devices-pc...0000:02:00.0-net-eth0.device loaded active plugged 82573L Gigabit Ethernet Controller sys-kernel-debug.automount loaded active waiting Debug File System Automount Point cpuspeed.service loaded active exited LSB: processor frequency scaling support ntpd.service loaded maintenance maintenance Network Time Service cups.socket loaded active listening CUPS Printing Service Sockets
Con il parametro status è possibile avere informazioni più dettagliate riguardo un determinato servizio. Inoltre systemctl status raccoglie informazioni riguardo le condizioni di errore e mostra run-time errors e start-up errors linkando se possibile i possibili crash dump di ABRT. Esempio:
$systemctl status ntpd.service ntpd.service - Network Time Service Loaded: loaded (/etc/systemd/system/ntpd.service) Active: maintenance Main: 953 (code=exited, status=255) CGroup: name=systemd:/systemd-1/ntpd.service
Servizi e processi
Spesso risulta utile avere una lista dei processi che un service di systemd fa partire o a quale service un processo appartiene. Poiché systemd utilizza i control groups (cgroups) per organizzare lo startup è possibile usare ps per avere una lista di tutti i processi del sistema e i relativi cgroups.
$ps xawf -eo pid,user,cgroup,args PID USER CGROUP COMMAND 1 root name=systemd:/systemd-1 /sbin/init 455 root name=systemd:/systemd-1/sysinit.service /sbin/udevd -d 1733 root name=systemd:/systemd-1/dbus.service /usr/libexec/udisks-daemon 4112 ntp name=systemd:/systemd-1/ntpd.service /usr/sbin/ntpd -n -u ntp:ntp -g
Un consiglio è quello di metterlo come alias: "alias psc='ps xawf -eo pid,user,cgroup,args'".
In alternativa è possibile usare il comando systemd-cgls, fornito con systemd, che fornisce un output grafico sulla gerarchia dei processi e dei servizi:
$systemd-cgls + user | \ lennart | \ 1 | + 1495 pam: gdm-password | + 1521 gnome-session \ systemd-1 + 1 /sbin/init + ntpd.service
Testare un nuovo service
Può capitare spesso di testare nuovi service o eseguire azioni come stop e start. Per evitare di modificare o agire direttamente sui file systemd mette a disposizione diversi comandi di systemctl. Premessa:
- "/lib/systemd/system/" contiene i file si service installati dai gestori dei pacchetti. Meglio non agire su questi file.
- "/etc/systemd/system/" contiene link ai service file contenuti nella precedente cartella. L'admin dovrebbe agire solamente su questa cartella.
- Aggiornare systemd dopo aver aggiunto, rimosso o modificato un service file:
systemctl daemon-reload
- Eseguire manualmente un service:
systemctl start abrtd.service
- Abilitare un nuovo service al boot (questo comando tiene conto del parametro WantedBy= dentro il file:
systemctl enable abrtd.service
Uccidere i service
Killall non è sempre la soluzione migliore per uccidere un processo specialmente per quelli che avviano altri processi come i demoni. systemctl kill ha una maggiore flessibilità e sicurezza perché agisce direttamente sui service.
- Killare tutti i processi avviati da un service (manda un SIGTERM a tutti e non solo al main):
$systemctl kill crond.service
- Killare con un diverso segnale (letteralmente il processo non può sfuggire nemmeno con double fork o fork bombing):
$systemctl kill -s SIGKILL crond.service
- Mandare uno specifico segnale al main di un service, magari per forzare un riavvio o un update:
systemctl kill -s HUP --kill-who=main crond.service
A differenza di stop, che esegue il parametro ExecStop= dentro il service file, il comando kill manda direttamente un segnale al processo. Come si nota dagli esempi il prefisso SIG non è obbligatorio.
I tre livelli di "Off"
In systemd esistono tre modi differenti per mettere in "Off" un service o qualsiasi altra unit.
- Fermare un service: questo metodo termina l'istanza del service correntemente in esecuzione. E' possibile in alcuni casi, anche automaticamente, che il service venga riavviato da systemd.
systemctl stop ntpd.service
- Disabilitare un service: questo metodo rimuove tutti i vincoli che possono permettere a systemd il riavvio automatico del service. E' ancora possibile avviarlo manualmente se non ci sono vincoli che lo proibiscono.
systemctl disable ntpd.service
Spesso la combinazione di disable e stop risulta molto utile.
- Mascherare un service: questo metodo è simile al disable con la differenza che il service non può essere più avviato nemmeno manualmente.
$ ln -s /dev/null /etc/systemd/system/ntpd.service $ systemctl daemon-reload
Per annullare queste operazioni si possono usare i comandi systemctl start per avviare il service, systemctl enable per abilitare il service e rm per rimuovere il link.
System halt
It is also possible to call systemd to terminate all processes and halt the whole system
$ systemctl halt
Chroot on steorid
Systemd fornisce un comando simile a chroot chiamato systemd-nspawn.
Cosa ha di figo?
- E' facile da usare;
- Non ha bisogno di montare /proc e /sys e il kernel ripulisce automaticamente l'ambiente quando il container termina;
- Isola meglio il sistema ospitante da modifiche proveniente dall'interno del conteiner;
- Permette l'avvio di un intero OS all'interno del container;
- E leggero e facilmente installabile.
Come si usa?
- Avviare una distro Debian dentro un container nspawn (avvia solamente una shell):
$apt-get install debootstrap $debootstrap --arch=amd64 unstable debian-tree/ $systemd-nspawn -D debian-tree
- Avviare una distro Debian dentro un container nspawn (avvia l'intero filesystem):
$systemd-nspawn -D debian-tree /sbin/init
Grafici e Statistiche
Questi comandi sono utili quando si cerca di migliorare le prestazioni al boot del sistema.
- Ottenere la lista dei tempi di avvio di ogni singolo service:
$systemd-analyze blame 6207ms udev-settle.service 396ms dbus.service 316ms cups.service
- Ottenere un grafico colorato di tutto il sistema di boot (bootchart):
$systemd-analyze plot > plot.svg $eog plot.svg
Il risultato è questo [1].