Zoek:

Systemd: Runlevels en Systemctl

door Peter Wittebol

Inhoud

  1. Inleiding
  2. Algemeen
  3. Runlevels
  4. Systemd commando’s
  5. Praktijk
  6. Samenvatting
  7. Links

De hoofdontwikkelaar van systemd is Lennart Poettering, developer en programmeur in dienst bij Red Hat.
Systemd is controversieel. Er zijn voor- en tegenstanders, soms met (te) felle discussies.
We gaan ons hier niet bezig houden met deze discussie, maar met de werking van systemd.
Feit is dat Redhat, Suse, Debian en veel afgeleiden van Debian systemd als standaard hebben geaccepteerd.
Eén voordeel is in ieder geval evident: systemd is universeel voor alle Linux distributies.
Er zijn alleen wat verschillen in welke directories de systemd bestanden zich bevinden (een gebruikelijk verschil).
De systemd commando’s zijn echter overal hetzelfde.
Systemd is alleen voor Linux ontwikkeld.
De enige Linux distributie zonder systemd, die ik ken is Devuan zie devuan.org.

Om een goed begrip te krijgen van systemd is het noodzakelijk om de onderliggende zaken te bestuderen.
Laten we het vooralsnog beperken tot runlevels en systemctl.

Ik zal kort de achterliggende directories en de andere commando’s van systemd laten zien.
Daarna komen de oefeningen m.b.t. ‘runlevel’, (re)start, stop enable en disable van services.

Algemeen

Systemd runs als een daemon met PID 1.
Systemd laadt de services wanneer dat noodzakelijk: ‘spawnding on demand’ dus is Systemd ‘event-driven’.
Daardoor worden er standaard minder resources gebruikt, waardoor het systeem dus beter presteert en sneller opstart.

Hieronder een voorbeeld m.b.t. het laden van tty’s.
Voor Systemd werden alle tty’s geladen, ook als ze niet gebruikt worden.
Nu alleen één tty en pas wanneer er een tweede wordt aangeroepen, wordt deze ook daadwerkelijk gestart.


Twee belangrijke directories voor systemd

Debian:

/etc/systemd/system
bestanden kunnen geëdit worden (wees voorzichtig!)
/lib/systemd/system
systeembestanden, niet veranderen!

CentOS / SUSE:
/etc/systemd/system
bestanden kunnen geëdit worden (wees voorzichtig!)
/usr/lib/systemd/system
systeembestanden, niet veranderen!

Je kunt bestanden uit (/usr)/lib/systemd/system editen door deze naar /etc/systemd/system te kopiëren en een andere naam te geven.
Onderstaande printscreens zijn gemaakt van het commando ls -la in de /etc/systemd/system directory.
Geeft een beeld van /etc/systemd/system en de systeembestanden in (/usr)/lib/systemd/system

Debian

cd /etc/systemd/system
ls -la

CentOS / Suse

cd /etc/systemd/system
ls -la


'Runlevels'

init 0 – 6 commando werkt nog steeds.
Init is een symlink naar een systemd .target. multi-user.target omvat de voormalige runlevels 2 t/m 4 zijn.

  • poweroff.target (vgl met init 0)
  • rescue.target (vgl met init 1)
  • multi-user.target (vgl met init 2 / 3 / 4)
  • graphical.target (vgl met init 5)
  • reboot.target (vgl met init 6)
  • emergency.target (nvt)

rescue.target en emergency.target worden uiteraard gebruikt voor troubleshooting.

recue.target en emergency.target kan je alleen opstarten na een reboot:
Type e als grub start en verander multi-user.target in rescue.target of emergency.target

NB: Het is goed om te benadrukken dat er geen runlevels meer zijn.

In een systemd systeem zijn er targets. De oude init commando’s hebben een symlink naar een systemd target.

Een target is geen runlevel, maar een groep van services die gestart moeten worden.
De targets poweroff, rescue.target,multi-user, graphical en reboot hebben een groep van services die lijken op een runlevel, men kan daarom geneigd zijn deze een runlevel te noemen.

Systemd commando’s

  • busctl Bus data
  • journalctl Journal Data (rsyslog)
  • localectl Locale control
  • hostnamectl Dynamic hostname
  • loginctl Logged-in users
  • systemctl (re)start/stop, enable/disable services, ‘runlevels’
  • timedatectl Time information

systemctl

  • systemctl status
  • systemctl list-dependencies Show a unit’s dependencies
  • systemctl list-sockets List sockets and what activates
  • systemctl list-jobs View active systemd jobs
  • systemctl list-unit-files See unit files and their states
  • systemctl list-units Show if units are loaded/active
  • systemctl get-default List default target (like run level)
  • systemctl is-active <service-name>
  • systemctl list-units --type service –all

Naast deze functies wordt systemd verder ontwikkeld voor mount en unmout, zodat fstab niet meer nodig is, en nog meer zaken.
Vooralsnog houden we ons hier niet mee bezig, dat volgt later.

Enable disable services

(re)start en stop services

  1. zoals gebruikelijk service starten nadat een prog is geïnstalleerd
  2. status van de service en stoppen of restart wanneer dit noodzakelijk is
  3. bv ssh alleen starten wanneer noodzakelijks, scheelt resources
  • systemctl stop <service-name> Stop a running service [1]
  • systemctl start <service-name> Start a service
  • systemctl restart <service-name> Restart a running service
  • systemctl reload <service-name> Reload all config files in service
  • systemctl status <service-name> See if service is running/enabled
  • systemctl status <service-name> -l With info from the right logfiles [2]
  • systemctl enable <service-name> Enable a service to start on boot
  • systemctl disable <service-name> Disable service, won’t start at boot
  • systemctl show <service-name> Show properties of a service (or other unit)
  • systemctl -H host status network Run any systemctl command remotely

[1] Zie het verschil met voorheen: nu eerst het commando (re)start, stop, enz. en dan de service
[2] systemd staat in contact met journald, met de -l optie heb je gelijk de goede log informatie.

Je hoeft dus niet meer naar de juiste logfile en de juiste regel in dat bestand te zoeken.

Een service die disabled is kan gewoon gestart worden. Disabled betekent dat de service niet automatisch wordt gestart bij boot.

Praktijk

commando’s

bekijk kort de commando’s, behalve systemctl daar ga we zo meteen verder op in:

  • busctl
  • journalctl
  • localectl
  • hostnamectl
  • loginctl
  • timedatectl

tty1

ps -ef | grep tty

‘runlevels’

which init
ls -la <dir>
which runlevel
ls -la <dir>
cd /etc/systemd/system
ls -la | grep default.target

runlevel waarschijnlijk 5 (vanwege laptop) dus default.target heeft een symlink naar /lib/systemd/system/graphical.target

systemctl get-default
runlevel
N5
systemctl set-default multi-user.target (denk aan tab-completion)
runlevel
5
systemctl isolate multi-user.target
alt+ctrl F1
login
systemctl get-default
runlevel
5 3

We gaan nu weer terug naar de grafische interface, maar niet met het systemctl commando.
Om een beter begrip te krijgen wat er gebeurt doen we het handmatig:

rm /etc/systemd/system/default.target
ln -s /lib/systemd/system/graphical.target /etc/systemd/system/default.target
systemctl isolate multi-user.target
login
open terminal
systemctl get-default
runlevel
35

.target

cd (/usr)/lib/systemd/system
ls -la | grep .target
ls -la | grep runlevel

Bekijk de symlinks runlevel 0 – 6

cat graphical.target
   Requires=multi-user.target
cat multi-user.target
   Requires=basic.target
cat rescue.target
   Requires= sysinit.target rescue.service
cat poweroff.target
   Requires=systemd-poweroff.service
cat reboot.target
   Requires=systemd-reboot.service

Al deze bestanden hebben dezelfde opbouw

# Beschrijving
[Unit]
[Install] niet altijd nodig

Zoals je ziet zijn er ook .wants directories. Daar komen een volgende keer op terug.

Andere manieren om de Requires te bekijken

  • systemctl show -p Requires <target-name>.target
  • systemctl list-dependencies <target-name>.target
  • systemctl list-dependencies <target-name>.target | grep target

Bekijk alle targets op deze manier.

systemctl list-units --type=target --all

systemctl

Bekijk onderstaande commando’s

systemctl -t help
systemctl
systemctl dubbel tab
systemctl list- dubbel tab
systemctl status
systemctl list-dependencies
systemctl list-sockets
systemctl list-jobs
systemctl list-unit-files
systemctl list-units
systemctl is-active
systemctl list-units --type service –all

(re)start stop services

Wanneer niet aanwezig installeer ssh, altijd handig:

  • apt install openssh-server openssh-client

of

  • yum install openssh-server openssh-client
systemctl show ssh.service
systemctl is-active ssh.service
   active
systemctl stop ssh.service
systemctl is-active ssh.service
   inactive
systemctl start ssh.service
systemctl is-active ssh.service
   active
systemctl restart ssh.service
   active
systemctl status ssh.service
systemctl stop ssh.service
systemctl status ssh.servic
systemctl start ssh.service

enable disable services

(wel of niet programma automatisch starten na boot)

  • systemctl disable ssh.service kijk naar de meldingen
  • systemctl status ssh.service zie het verschil met de vorige keer

na reboot is server niet meer bereikbaar met ssh

  • systemctl enable ssh.service
  • systemctl status ssh.service

server is uiteraard nog steeds bereikbaar met ssh, wel na reboot

  • systemctl start ssh.service
  • systemctl status ssh.service weer hetzelfde als de eerste keer
  • systemctl status ssh.service -l met informatie van de logfiles

Je hoeft geen .service achter de service, in dit geval ssh, te typen.
Systemd snapt dat het een .service betreft.
Na tab completion komt de volledige naam naar voren.

Samenvatting

Systemd is een grote vernieuwing binnen Linux en is (was inmiddels?) controversieel.
Systemd is echter inmiddels door alle belangrijke distributies geaccepteerd en geïmplementeerd.

Systemd bestanden bevinden zich in diverse directories.
De twee belangrijkste zijn:

  • /etc/systemd/system
  • (/usr)/lib/systemd/system

Er is een klein verschil m.b.t. de directories, verder is systemd universeel. Systemd is alleen onwikkeld voor Linux.

In de workshop hebben we diverse commando’s bekeken met name betreffende ‘runlevel’ en het (automatisch) starten en stoppen van services.

Er bestaan geen runlevels meer.
Vergelijkbaar zijn de .targets in (/usr)/lib/systemd/system.
/etc/systemd/system/default.target is een symlink naar een target in (/usr)/lib/systemd/system.

Bij een verandering van bv graphical.target naar mult-user.target wordt default.target in /etc/systemd/system verwijderd daarna wordt een nieuwe default.target gemaakt met een ander symlink.

  • systemctl set-default doet deze handelingen voor je.
  • systemctl isolate effectueert deze verandering.

Met systemctl (re)start, stop, reload wordt de service gestart, enz.
systemctl enable, disable zorgt ervoor dat de service al dan niet automatisch wordt gestart.

Een service die is gestopt en ge-disabled, kan dus gewoon gestart worden.

systemd links

Korte introductie van Sander van Vugt in Linux Magazine

Tutorials van Sander van Vugt

Diverse tutorials

Zie ook de pdf ‘systemd-cheat-sheet’ van LinuxTrainingAcademy.com

Peter Wittebol, voorjaar 2018  

Pagina laatst gewijzigd op 7 september 2018 om 08:40