Hallo, systemd.

Fabian Deutsch, Mai 2015

Ein Init-Daemon

… zum booten des Systems

… und vielen weiteren Funktiönchen

  • Verwaltung von Dienste, Geräte, Mounts, Sockets, Timer
  • Zeit
  • I18N
  • Hostname
  • Container
  • Netzwerk
  • Boot-Prozess

HALLO!?!? Warum nur!?!?

  • Notwendigkeit
    • Dynamische Systeme (hotplug, …)
  • Erwartungshaltung
    • Z.B. Suspend/Resume
  • Zweckmäßigkeit
    • Z.B. Slices
  • Klarheit/Verbindlichkeit
    • Z.B. "Welche LANG= ist beim boot gesetzt?"
    • "Welche Prozesse gehören darthvader?"

Dem prozessbaum entfleuchen


$ exec gnome-terminal -e "vim $@" &> /dev/null &

Geht's noch? Und das in einer binary!

  • systemctl
  • journalctl
  • hostnamectl
  • timedatectl
  • bootctl
  • machinectl
  • loginctl

Nun gut… Aber der Preis!?!?

  • Mehr Konzepte
  • Mehr Tools
  • Mehr Dokumentation
  • Mehr Verbindlichkeiten
  • Komplexer.

Aha. Und der Benefit?

  • Mehr Konzepte
  • Mehr Tools
  • Mehr Dokumentation
  • Mehr Verbindlichkeiten
  • Komplexer.

Nun,

Zur Praxis.

$ systemctl

  • Für Dienste
    • start, stop, restart, enable, disable von Diensten
  • Für alle "Units"
    • Mounts, Geräte, Slices, Sockets, …
$ systemctl status --all
$ systemctl status gdm.service
$ service gdm status

systemd.unit

# cat /usr/lib/systemd/system/redis.service
$ systemctl cat redis.service
[Unit]
Description=A persistent key-value database
After=syslog.target network.target

[Service]
ExecStart=/usr/sbin/redis-server /etc/redis.conf
User=redis
Group=redis

[Install]
WantedBy=multi-user.target

Warum 'Unit'?

  • Abstraktionseinheit für "dynamische" Teile des Systems
  • Abstraktion um Abhängigkeiten zwischen den Teilen spezifizieren zu können
    • NFS hängt von Netzwerk ab
    • Ein Mountpoint benötigt seine Quelle
    • strongswan muss auf syslogd warten, da es eine direkte Abhängigkeit gibt
  • Formalisierung der vormals impliziten Beziehungen

Ein Vergleich - Statistik

$ wc -l /etc/init.d/* | sort -n
   27 /etc/init.d/README
   52 /etc/init.d/livesys-late
   88 /etc/init.d/redis
…
  458 /etc/init.d/ceph
  594 /etc/init.d/functions

$ wc -l /usr/lib/systemd/system/*.service | sort -n
     6 /usr/lib/systemd/system/tftp.service
     7 /usr/lib/systemd/system/apg@.service
…
    49 /usr/lib/systemd/system/getty@.service
    59 /usr/lib/systemd/system/postgresql.service

Units überall

  • /etc/systemd/system/*

  • /run/systemd/system/*

  • /usr/lib/systemd/system/*

$ systemctl daemon-reload

$ systemd-analyze

  • Warum bootet meine Maschine so langsam?
  • Wie schauen die Abhängigkeiten aus?
$ systemd-analyze
$ systemd-analyze plot > boot.svg
$ systemd-analyze dot > deps.dot ; \
  dot -T png deps.dot

$ journalctl

  • Bullet One
  • Bullet Two
  • Bullet Three
$ journalctl -k  # dmesg
$ journalctl -u cron.service

Runlevel!

  • Gibt's noch: Targets
  • Targets definieren welche Dienste gestartet sein sollen
    • 3: multi-user.target
    • 5: graphical.target
$ systemctl set-default multi-user.target 
$ systemctl get-default

rc.local

  • Kleine Skripts am Ende des Bootvorgangs
$ systemctl status rc-local
rc-local.service - /etc/rc.d/rc.local Compatibility
   Loaded: loaded (/usr/lib/systemd/system/rc-local.service; static)
   Active: inactive (dead)

Mehr / Links

fabiand@fedoraproject.org

dummdida.tumblr.com

@dummdida

 

CC Share-Alike

Made with Slides.com