Systemd: Runlevels en Systemctl
door Peter Wittebol
Inhoud
- Inleiding
- Algemeen
- Runlevels
- Systemd commando’s
- Praktijk
- Samenvatting
- 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
- zoals gebruikelijk service starten nadat een prog is geïnstalleerd
- status van de service en stoppen of restart wanneer dit noodzakelijk is
- 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