Systemd comandi utili

From Ability
Jump to: navigation, search

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].