Terug naar hoofdinhoud

Linux concept: systemd

21 juli 2026

Druk op de aan-knop van vrijwel elke moderne Linux-machine en, zodra de kernel is geladen, neemt een enkel programma het over en brengt het hele systeem tot leven. Het koppelt je schijven aan, start je netwerk, start je SSH-server en je database, en houdt ze allemaal onder toezicht tot je afsluit. Dat programma is systemd. Het is het eerste dat de kernel draait, het stopt nooit zolang de machine aanstaat, en het is de beheerder waaraan elke dienst op het systeem verantwoording aflegt. systemd begrijpen is begrijpen hoe een Linux-machine echt leeft.

1. De basis

De taak van systemd is de systeem- en dienstbeheerder voor Linux zijn. Wanneer je machine opstart, start de kernel precies een programma rechtstreeks, en geeft het proces-ID 1 (PID 1). Op vrijwel elke gangbare distributie is dat programma systemd. Al het andere dat je ziet draaien, van een webserver tot een achtergrond-timer tot het aankoppelen van een schijf, is een kind dat systemd heeft gestart, volgt en weer kan stoppen.

Omdat het PID 1 is, is systemd bijzonder. Het is de voorouder van elk ander proces, het stopt nooit zolang het systeem draait, en als het zou crashen zou de kernel in paniek raken. Dus systemd moet voorzichtig zijn, klein in zijn kern, en betrouwbaar. Het doet zijn werk door een reeks beschrijvingsbestanden genaamd units te lezen en erop te handelen.

Het kernidee is de unit. Systemd denkt niet in termen van "programma's" of "scripts". Het denkt in units: kleine declaratieve bestanden die iets beschrijven wat het moet beheren en hoe. De meest voorkomende soort is de service, maar er zijn units voor koppelpunten, timers, sockets, netwerkapparaten en hele systeemtoestanden. Elke unit heeft een naam die eindigt op een typesuffix, zoals ssh.service of graphical.target.

Het juiste mentale model: systemd is de ene beheerder die de hele machine draait, van de eerste seconde van het opstarten tot het afsluiten, en alles wat beheerbaar is op het systeem, een dienst, een koppeling, een timer, een target, wordt eraan beschreven als een unit.

Je praat meestal niet rechtstreeks met systemd. Je gebruikt zijn familie van commandoregel-gereedschappen, bovenal systemctl om units te besturen en journalctl om logs te lezen. Dit artikel gaat over de beheerder zelf: wat het is, hoe het je machine opstart, hoe units en targets samenhangen, hoe het processen volgt met control groups, en de verrassende hoeveelheid van een modern Linux-systeem die eigenlijk systemd met een andere pet op is. Het is geverifieerd tegen systemd versie 255.

1.1 Zien dat systemd PID 1 is

Je kunt met een commando bevestigen dat systemd de leiding heeft. Proces 1 is de beheerder, en het opstartprogramma /sbin/init is slechts een link ernaartoe:

$ ps -p 1 -o comm=
systemd

$ ls -l /sbin/init
/sbin/init → /lib/systemd/systemd

Decennialang was /sbin/init het echte eerste programma. Vandaag wijst het naar systemd, dat oude gewoonten en bootloaders laat werken terwijl systemd het eigenlijke werk doet.

1.2 De eerste blik: wat draait er

Om te zien wat systemd nu beheert, vraag je het zijn units op te sommen. Toestand lezen vereist geen speciale rechten:

$ systemctl                       # every unit currently loaded
$ systemctl status                # a tree of the whole system
$ systemctl list-units --type=service --state=running

De uitvoer toont elke unit, of systemd hem correct heeft ingelezen, en of hij actief is. Dat ene overzicht, alles op de machine in een lijst, is het praktische voordeel van een beheerder in plaats van een stapel losse scripts.

1.3 De belangrijkste unit-typen

Omdat "unit" het ene idee is dat systemd bindt, helpt het om de gangbare typen in een oogopslag te zien. De suffix op de naam van een unit vertelt je welk soort het is, en dezelfde werkwoorden (start, stop, enable, status) werken op allemaal:

SuffixUnit-typeBeheert
.service Service Een daemon of programma, de meest voorkomende unit
.socket Socket Een poort of socket die een dienst start bij eerste gebruik
.timer Timer Een geplande taak, een moderne vervanging voor cron
.mount Mount Een koppelpunt van een bestandssysteem
.automount Automount Een koppelpunt dat aankoppelt bij eerste toegang
.path Path Bewaakt een bestand of map en start een unit bij wijziging
.target Target Een groep units en een hele systeemtoestand
.slice Slice Een tak van de boom voor resourcebeheer (cgroup)
.scope Scope Een groep processen die systemd niet zelf heeft gestart
.device Device Een hardwareapparaat waarvan systemd weet

De meeste dagen raak je alleen .service- en .target-units aan, maar de rest gebruikt exact hetzelfde gereedschap, wat een groot deel van de aantrekkingskracht van systemd is.

Naar boven

2. Waar komt de naam vandaan?

De naam bestaat uit twee delen die aan elkaar zitten: system plus d.

systemd  =  SYSTEM + d (for daemon)

Een daemon is het klassieke Unix-woord voor een programma dat stilletjes op de achtergrond draait in plaats van voor een gebruiker. Volgens lange traditie krijgen zulke programma's een naam die eindigt op de letter d: de SSH-server is sshd, de webserver is httpd, de cron-planner is crond. Dus systemd leest als "de system daemon", het achtergrondprogramma dat het systeem zelf beheert.

De auteurs schrijven het met kleine letters, altijd als systemd, nooit "System D" of "SystemD". Dat is een bewuste stijlkeuze, passend bij de Unix-daemons die het onder zijn hoede neemt.

Zodra systemd bestond, groeide er een hele familie van gereedschappen omheen, en die delen een naampatroon. Commandogereedschappen die een deel van het systeem besturen eindigen op ctl; achtergrondhelpers die systemd draait behouden de systemd--prefix en de d-uitgang:

NaamRol
systemd De beheerder zelf, draaiend als PID 1
systemctl Het gereedschap waarmee je units bestuurt
journalctl Het gereedschap waarmee je het log-journal leest
systemd-journald De daemon die alle logs verzamelt
systemd-logind De daemon die gebruikersaanmeldingen bijhoudt
systemd-networkd De daemon die het netwerk kan beheren

Het patroon is de moeite waard om te leren, want wanneer je een nieuwe systemd-iets tegenkomt kun je meteen raden dat het een achtergrondhelper is, en een nieuwe ietsctl is het commando waarmee je hem aanstuurt.

Naar boven

3. Een korte geschiedenis

Om systemd te begrijpen moet je weten wat het verving, want het veranderde hoe Linux opstart meer dan enig ander project in de laatste twintig jaar.

Het grootste deel van de Unix-geschiedenis was het eerste programma dat de kernel startte init, en het traditionele ontwerp was SysV init, genoemd naar AT&T's UNIX System V. Het was een reeks shellscripts onder /etc/init.d, in een vaste volgorde gedraaid door genummerde "runlevels". Het werkte, maar het was traag, omdat het diensten strikt na elkaar startte, en broos, omdat elke dienst een handgeschreven script was dat zijn eigen proces moest bijhouden. Een grote server opstarten kon minuten duren.

Pogingen om init te moderniseren kwamen eerst. Ubuntu leverde in 2006 Upstart, een gebeurtenisgestuurd systeem dat reageerde op dingen die gebeurden in plaats van op een vaste scriptvolgorde. Het was een echte verbetering, maar het behield de scriptzware stijl.

systemd, voor het eerst uitgebracht in 2010 door Lennart Poettering en Kay Sievers bij Red Hat, wilde init volledig vervangen met een nieuw ontwerp. De grote ideeen waren:

  • Diensten beschrijven als kleine declaratieve unit-bestanden in plaats van shellscripts, zodat de beheerder, niet elk script, het zware werk doet.
  • Onafhankelijke diensten parallel starten, en afhankelijkheden gebruiken om de volgorde uit te werken, voor een veel sneller opstarten.
  • Elk dienstproces betrouwbaar volgen met kernel-control groups (cgroups), zodat een dienst en al zijn kinderen altijd te vinden en te stoppen zijn.
  • Alle logs verzamelen in een gestructureerd journal in plaats van verspreide tekstbestanden.
TijdvakMijlpaal
1983 UNIX System V zet het init-en-runlevels-patroon dat Linux later kopieert
2006 Ubuntu levert Upstart, een vroege gebeurtenisgestuurde vervanging voor init
2010 systemd wordt uitgebracht, met declaratieve units, parallel opstarten en cgroups
2014-2015 Debian, Ubuntu, Fedora, RHEL, Arch en SUSE nemen systemd als standaard
Vandaag systemd is de standaard-init op vrijwel alle gangbare Linux-distributies

De overstap ging niet zonder discussie. systemd is groot en doet veel meer dan de oude init, en neemt taken op zich zoals logging, netwerkinstellingen en apparaatbeheer die vroeger bij losse programma's hoorden. Sommige beheerders houden niet van deze reikwijdte, en een paar distributies (zoals Devuan, een systemd-vrije fork van Debian) vermijden het bewust. Maar op een standaard moderne installatie is systemd wat je machine opstart en draait, en het leren ervan is niet langer optioneel.

Naar boven

4. Eenvoudige gebruiksgevallen

Je komt systemd vooral tegen via systemctl. Een handvol alledaagse handelingen dekt bijna al het vroege contact ermee, en geen ervan vereist dat je een bestand schrijft.

4.1 Controleren of iets draait

Het commando dat je het vaakst zult draaien is status. Het vraagt systemd naar een unit en toont of hij actief is, of hij bij het opstarten start, zijn hoofdproces, en de laatste paar logregels, allemaal tegelijk:

$ systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
     Loaded: loaded (/lib/systemd/system/ssh.service; enabled)
     Active: active (running) since Sun 2026-07-12 09:14:02 CEST; 2h ago
   Main PID: 812 (sshd)
     CGroup: /system.slice/ssh.service
             └─812 sshd: /usr/sbin/sshd -D [listener]

Twee woorden zijn het belangrijkst. active (running) betekent dat hij nu draait. Het woord enabled op de Loaded:-regel betekent dat hij ook bij de volgende herstart start. Dat zijn twee losse feiten, en ze uit elkaar houden is het nuttigste om te leren over draaiende diensten.

4.2 Starten, stoppen en enablen

De toestand van een dienst veranderen vereist beheerdersrechten, dus deze commando's nemen sudo:

$ sudo systemctl start nginx        # run it now
$ sudo systemctl stop nginx         # shut it down now
$ sudo systemctl restart nginx      # stop then start, to apply new config
$ sudo systemctl enable --now nginx # start now AND at every boot

De --now-vlag is de brug tussen "draai het nu meteen" en "draai het na elke herstart". Het volledige verhaal, en het belangrijke verschil tussen start en enable, hoort in het systemctl-artikel; hier volstaat het te weten dat systemd het ding is dat elk verzoek uitvoert.

4.3 Vragen hoe het opstarten ging

Omdat systemd het hele opstarten uitvoert, kan het je precies vertellen hoe lang dat opstarten duurde en wat het vertraagde. Het gereedschap is systemd-analyze:

$ systemd-analyze                 # total boot time, split by phase
Startup finished in 3.1s (kernel) + 8.4s (userspace) = 11.6s

$ systemd-analyze blame           # slowest units, worst first
$ systemd-analyze critical-chain  # the ordered chain that gated boot

Geen enkele andere init kon deze vragen zo direct beantwoorden. Het is een goed eerste teken dat systemd tot in detail weet wat het startte en wanneer.

Naar boven

5. Gemiddelde gebruiksgevallen

Zodra de basis routine voelt, is de volgende stap om je eigen werk aan systemd te beschrijven. Hier houden units op iets te zijn wat de distributie levert en worden ze iets wat je zelf schrijft.

5.1 De anatomie van een unit-bestand

Een unit-bestand is een gewoon tekstbestand in "INI"-stijl: benoemde secties tussen vierkante haken, elk met Sleutel=Waarde-regels. Een service-unit gebruikt drie secties, en elk heeft een duidelijke taak:

[Unit]
Description=My Application
After=network.target

[Service]
ExecStart=/opt/myapp/app.sh
Restart=on-failure
User=myapp

[Install]
WantedBy=multi-user.target
SectieBeantwoordt
[Unit] Wat is het, en wanneer moet het starten ten opzichte van andere units
[Service] Wat te draaien (ExecStart), als welke gebruiker, en hoe het te herstarten
[Install] Welke target het binnenhaalt wanneer je de unit enablet

Je bewaart dit als /etc/systemd/system/myapp.service, vertelt systemd zijn bestanden opnieuw in te lezen, en enablet het dan:

$ sudo systemctl daemon-reload       # systemd notices the new file
$ sudo systemctl enable --now myapp   # start it now and at every boot

De regel Restart=on-failure is een van de sterkste redenen om een echte unit te verkiezen boven een handmatig gedraaid script: als je programma crasht, brengt systemd het automatisch terug.

5.2 Targets: units groeperen tot systeemtoestanden

Een target is een bijzondere unit die geen programma draait. In plaats daarvan groepeert het andere units en staat het voor een hele systeemtoestand. Targets zijn systemd's vervanging voor de oude genummerde runlevels:

TargetOud runlevelBetekenis
multi-user.target 3 Volledig systeem met netwerk, geen grafische aanmelding
graphical.target 5 Alles in multi-user, plus een bureaublad
rescue.target 1 Single-user reddingsshell, minimale diensten
emergency.target - Kaalste shell, vrijwel niets gestart

Het systeem start op naar waar default.target naar wijst. Je kunt het lezen, wijzigen, of de draaiende machine in een andere toestand schakelen:

$ systemctl get-default                         # e.g. graphical.target
$ sudo systemctl set-default multi-user.target  # boot without a desktop
$ sudo systemctl isolate rescue.target          # switch to rescue mode now

5.3 Timers: een moderne vervanging voor cron

Decennialang betekenden geplande taken cron. systemd biedt zijn eigen planner in de vorm van timer-units. Een timer is een kleine unit die zegt wanneer, gekoppeld aan een dienst die zegt wat. Het paar ziet er zo uit:

# backup.timer
[Unit]
Description=Nightly backup

[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true

[Install]
WantedBy=timers.target

De bijbehorende backup.service bevat de ExecStart= die het werk doet. Timers hebben echte voordelen boven cron: ze loggen naar het journal net als elke dienst, ze kunnen een gemiste run inhalen met Persistent=true, en je kunt ze allemaal met een commando opsommen:

$ systemctl list-timers            # every timer, next and last run time
Naar boven

6. Gevorderde gebruiksgevallen

De mogelijkheden in deze sectie zijn waar systemd ver voorbij "start mijn programma" gaat. Ze zijn de reden dat het project zo groot werd, en elk lost een probleem op dat de oude init niet kon.

6.1 Socket-activering: starten bij eerste gebruik

Een socket-unit laat systemd een netwerkpoort of lokale socket openen namens een dienst, voordat de dienst zelf draait. Wanneer de eerste verbinding binnenkomt, start systemd de echte dienst en geeft de verbinding door. De dienst kan gestopt blijven tot iets hem echt nodig heeft, wat geheugen bespaart:

$ systemctl status ssh.socket      # the listener, even if sshd is idle

Socket-activering verwijdert ook een hele klasse van opstartvolgorde-bugs: een client kan verbinden zodra systemd draait, omdat de socket meteen bestaat, en de verbinding wacht simpelweg terwijl de dienst start. Het is hetzelfde idee dat de klassieke inetd ooit nuttig maakte, ingebouwd in de beheerder.

6.2 Resourcebeheer met control groups

Elke dienst die systemd start wordt in zijn eigen control group (cgroup) geplaatst, een kernelfunctie die processen groepeert en kan meten en begrenzen wat ze gebruiken. Omdat een dienst en alle processen die hij aanmaakt in een cgroup leven, kan systemd ze altijd samen verantwoorden en, cruciaal, ze allemaal stoppen. Je stelt limieten in met gewone directives in de [Service]-sectie:

DirectiveEffect
MemoryMax=512M Hard geheugenplafond; de dienst wordt gedood als hij eroverheen gaat
CPUQuota=50% Gebruik nooit meer dan de helft van een CPU-kern
TasksMax=100 Begrens het aantal processen en threads
IOWeight=10 Verlaag het aandeel van deze dienst in schijfbandbreedte

Je kunt live gebruik bekijken als een boom die de cgroup-indeling weerspiegelt:

$ systemctl status nginx           # shows the service's cgroup and memory
$ systemd-cgls                     # the full control-group tree
$ systemd-cgtop                    # live per-service CPU, memory, and I/O

6.3 Sandboxing: een dienst vastzetten

De [Service]-sectie kan een dienst ook inperken, en verkleinen wat een gecompromitteerd programma zou kunnen bereiken, zonder container. Dit zijn enkele van systemd's meest onderbenutte instellingen:

DirectiveEffect
ProtectSystem=strict Koppel het hele bestandssysteem alleen-lezen aan voor de dienst
ProtectHome=true Verberg /home en /root voor de dienst
PrivateTmp=true Geef de dienst zijn eigen prive-/tmp
NoNewPrivileges=true Voorkom dat de dienst ooit meer privileges krijgt

Een ingebouwde scanner scoort hoe blootgesteld elke dienst is en stelt voor wat toe te voegen:

$ systemd-analyze security nginx   # exposure score and per-setting advice

6.4 Het journal: een log voor alles

systemd draait een logging-daemon, systemd-journald, die de uitvoer van elke unit, de berichten van de kernel, en zijn eigen gebeurtenissen vastlegt in een gestructureerde opslag. Er is niets extra's nodig om een dienst te loggen: wat het ook afdrukt wordt automatisch opgevangen. Je leest het met journalctl:

$ journalctl -u nginx              # all logs for one unit
$ journalctl -b                    # everything since the last boot
$ journalctl -f                    # follow new messages live

Omdat het journal gestructureerd is, kun je filteren op unit, op tijd, op prioriteit, of op boot, op manieren die verspreide tekstbestanden in /var/log nooit toestonden. Het journalctl-artikel behandelt dit diepgaand.

6.5 Je eigen persoonlijke systemd

Naast de systeembeheerder die als PID 1 draait, start systemd een tweede, aparte instantie voor elke aangemelde gebruiker: de gebruikersbeheerder. Die beheert diensten die van jou zijn en geen root nodig hebben, zoals een bureaubladcomponent of een persoonlijke backup-timer. Je bereikt hem door --user aan elk commando toe te voegen:

$ systemctl --user status          # your own units, no sudo
$ systemctl --user enable --now myapp
$ systemctl --user list-timers

Gebruikersunits leven onder ~/.config/systemd/user/. Dit verklaart een veelvoorkomende verrassing: een dienst die je met --user startte verschijnt niet in een gewone systemctl status, omdat die de systeembeheerder vraagt, niet de jouwe. Om een gebruikersdienst te laten doordraaien nadat je bent afgemeld, schakel je lingering in met loginctl enable-linger.

6.6 Transiente units: beheerde runs zonder een bestand

Soms wil je dat systemd een eenmalig commando onder toezicht houdt zonder helemaal een unit-bestand te schrijven. systemd-run maakt ter plekke een transiente unit aan: systemd draait het commando in zijn eigen cgroup, logt het naar het journal, en vergeet het wanneer het eindigt. Het is de snelle manier om systemd's functies voor een enkele taak te lenen:

$ sudo systemd-run --unit=backup-now /opt/backup.sh    # run it now as a managed service
$ sudo systemd-run --on-active=10min /opt/backup.sh    # run it once, 10 minutes from now
$ sudo systemd-run -p MemoryMax=200M ./import.sh        # run it under a memory cap

Dit is ideaal voor een zware taak die je begrensd en gelogd wilt, of een uitgestelde eenmalige zonder een permanente timer. Omdat de unit transient is, laat het niets achter op schijf; terwijl het draait kun je het bekijken met systemctl status backup-now als elke andere dienst.

Naar boven

7. Wat de meeste gebruikers niet weten

7.1 systemd is niet een programma, het is een hele vloot

Mensen zeggen "systemd" alsof het een enkele binary is, maar het is een grote verzameling programma's die samenwerken. De beheerder op PID 1 is slechts de kern; eromheen zitten tientallen gespecialiseerde daemons en gereedschappen. Een snelle blik onder /lib/systemd/ toont de schaal:

$ ls /lib/systemd/systemd-*
systemd-journald   systemd-logind    systemd-udevd
systemd-networkd   systemd-resolved  systemd-timesyncd
systemd-oomd       systemd-homed     ... (dozens more)

Elk neemt een taak op zich die vroeger bij een apart, onafhankelijk project hoorde:

ComponentVervangt de oude
systemd-journald syslog tekstbestand-logging
systemd-logind ConsoleKit sessiebeheer
systemd-networkd ifupdown / netwerkscripts
systemd-resolved handmatig ingestelde DNS-resolver
systemd-timesyncd een volledige NTP-daemon voor eenvoudige kloksynchronisatie
systemd-udevd de losstaande udev-apparaatbeheerder

Dit is precies wat de critici bedoelen met "systemd doet te veel" en de fans met "het is eindelijk consistent". Hoe dan ook, het verklaart waarom het project zo groot aanvoelt: het is niet een gereedschap, het is een samenhangende suite die veel taken tegelijk overnam.

7.2 Waar systemd zit in het hele opstarten

systemd start de machine niet vanaf niets; het neemt het halverwege een langere keten over. De volledige volgorde kennen vertelt je welk deel systemd's taak is en welk deel gebeurt voordat het uberhaupt laadt:

1. Firmware (UEFI or BIOS)   powers up and finds a boot device
2. Bootloader (GRUB)         loads the kernel and initramfs
3. Linux kernel              starts and detects hardware
4. initramfs                 tiny temporary root, mounts the real disk
5. systemd (PID 1)           takes over as the first real process
6. Targets reached           services started up to the default target
7. Login prompt or desktop   the system is ready

Alles tot en met stap 4 gebeurt voordat systemd bestaat, dus een fout daar, zoals een ontbrekende kernel of een kapotte bootloader, is niets wat systemd kan melden. Vanaf stap 5 is de machine systemd's verantwoordelijkheid, en het werkt omhoog door een keten van targets, elk een mijlpaal:

local-fs.target      →  filesystems mounted
       ↓
sysinit.target       →  early one-time setup done
       ↓
basic.target         →  sockets, timers, and paths ready
       ↓
multi-user.target    →  all normal services running
       ↓
graphical.target     →  desktop login on top

Elke target zegt dat hij After= de vorige moet komen en Wants= de diensten in zijn groep. systemd start alles wat het veilig kan parallel binnen elke fase, en dat is waarom een systemd-opstart zoveel sneller is dan de strikte een-voor-een volgorde van SysV init. Je kunt de exacte keten zien die je eigen opstarten begrensde met systemd-analyze critical-chain.

Het woord enable klinkt alsof het een verborgen schakelaar omzet. Het doet iets veel eenvoudigers: het maakt een symbolische link. De [Install]-sectie van een unit noemt de target die hem wil, zoals WantedBy=multi-user.target. De unit enablen maakt een symlink ernaartoe in de .wants-map van die target:

$ sudo systemctl enable nginx
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service
               → /lib/systemd/system/nginx.service.

Bij het opstarten bereikt systemd multi-user.target, ziet de symlinks in zijn .wants-map, en start elke gelinkte unit. Dat is het hele mechanisme. Disablen verwijdert simpelweg de link, en een dienst maskeren linkt zijn naam naar /dev/null zodat niets hem kan starten. Zodra je dit weet, houdt enablen op magie te zijn en wordt het bestanden die je met ls kunt opsommen.

7.4 systemd praat met je over D-Bus

Wanneer je systemctl restart nginx draait, raakt het systemctl-programma nginx helemaal niet aan. Het stuurt een bericht naar systemd (PID 1) over D-Bus, de standaard berichtenbus die Linux-programma's gebruiken om met elkaar te praten. systemd ontvangt het verzoek, controleert of je het mag doen, doet het werk, en legt het resultaat vast. Dit ontwerp verklaart meerdere dingen:

  • Een polkit-wachtwoordvenster kan verschijnen op een bureaublad, omdat D-Bus systemd laat vragen aan een autorisatiedienst of de actie is toegestaan.
  • Elk programma kan diensten beheren door dezelfde bus te spreken, niet alleen systemctl; je kunt dat verkeer bekijken met busctl.
  • systemctl is een dunne client. De intelligentie zit in de beheerder waarmee het praat, niet in het commando.

7.5 Het volgt processen per cgroup, zodat niets ontsnapt

Oude init-systemen volgden een dienst via zijn PID-bestand, en een programma dat slim forkte kon zich losmaken en als wees blijven draaien. systemd dicht dat gat: omdat elke dienst in zijn eigen cgroup leeft, blijft een verdwaald kind binnen dezelfde groep hoe het ook forkt. Wanneer systemd de dienst stopt, stopt het de hele cgroup, dus er blijven geen processen achter. Dit is waarom een moderne systemctl stop zoveel betrouwbaarder is dan de oude "dood de PID en hoop"-aanpak, en het is dezelfde verantwoording die systemd het exacte geheugengebruik van een dienst laat rapporteren.

7.6 Je kunt rechtstreeks naar een shell opstarten

Omdat targets gewoon systeemtoestanden zijn, kun je systemd bij het opstarten om een minimale toestand vragen door de kernel-commandoregel te bewerken. systemd.unit=rescue.target toevoegen start op naar een single-user reddingsshell; emergency.target geeft je de kaalste shell van allemaal, nuttig wanneer een kapotte /etc/fstab een normale opstart tegenhoudt. Dit is systemd's equivalent van de oude truc om single of een runlevelnummer toe te voegen, en het verandert "de machine start niet op" in een probleem dat je vaak vanaf dezelfde console kunt oplossen.

Naar boven

8. Beste praktijken

  • Laat systemd je programma's beheren. Een kort [Unit]/[Service]/[Install]-bestand met Restart=on-failure wint van een handmatig gedraaid script of een rc.local-regel: het start bij het opstarten, herstart bij een crash, en logt automatisch.
  • Bewerk nooit vendor-unit-bestanden onder /lib/systemd/system. Een pakketupdate overschrijft ze. Voeg in plaats daarvan een drop-in toe met systemctl edit, zodat je wijzigingen blijven bestaan.
  • Draai daemon-reload na elke unit-wijziging. systemd cachet unit-bestanden in het geheugen; tot je herlaadt gebruikt het de oude versie en lijken je bewerkingen niets te doen.
  • Verkies timers boven cron voor nieuwe taken. Timer-units loggen naar het journal, kunnen gemiste runs inhalen met Persistent=true, en tonen hun schema met systemctl list-timers.
  • Sandbox diensten die aan het internet blootstaan. Een paar regels zoals ProtectSystem=strict, PrivateTmp=true en NoNewPrivileges=true maken van veel volledige-systeem-compromitteringen ingeperkte. Controleer het resultaat met systemd-analyze security.
  • Stel resourcelimieten in op hongerige diensten. MemoryMax= en TasksMax= voorkomen dat een op hol geslagen proces de hele machine neerhaalt.
  • Gebruik systemd-analyze om je opstarten te begrijpen. blame en critical-chain tonen wat traag is en waarom, in plaats van te gissen.
  • Lees de handleiding. systemd is grondig gedocumenteerd; man systemd, man systemd.unit en man systemd.service zijn de referentie.
$ man systemd            # the manager and its concepts
$ man systemd.unit       # options common to all units
$ man systemd.service    # how to write a service unit
$ man systemd.timer      # how to write a timer
Naar boven

9. Veelgemaakte fouten

9.1 Mythe versus werkelijkheid

MytheWerkelijkheid
"systemd is een enkel programma." Het is een suite. De PID 1-beheerder is de kern, maar journald, logind, networkd, udevd en veel meer horen er allemaal bij.
"systemd en systemctl zijn hetzelfde." systemd is de beheerder die draait; systemctl is alleen het commando waarmee je ertegen praat.
"Een unit bewerken heeft meteen effect." systemd cachet unit-bestanden. Je moet daemon-reload draaien, en dan de dienst herstarten, voordat een wijziging ingaat.
"Een target is als een programma dat draait." Een target draait zelf niets. Het is een benoemde groep units en een systeemtoestand, de vervanging voor runlevels.
"Een dienst disablen garandeert dat hij nooit kan draaien." Een gedisabelde unit kan nog met de hand worden gestart of als afhankelijkheid worden binnengehaald. Gebruik mask voor een absolute blokkade.

9.2 Andere valkuilen om te vermijden

  • daemon-reload vergeten na het bewerken van een unit. Dit is de nummer-een oorzaak van "mijn wijziging deed niets". systemd gebruikt nog de gecachte kopie.
  • Bestanden bewerken in /lib/systemd/system. De volgende pakketupdate overschrijft ze stilletjes. Houd je wijzigingen in /etc/systemd/system of een drop-in.
  • Een gebruikersdienst zoeken in het systeemoverzicht. Een unit die met --user is gestart verschijnt niet in een gewone systemctl status. Voeg --user toe om hem te zien.
  • De unit-naam verwarren met de procesnaam. De unit kan ssh.service zijn terwijl het draaiende programma sshd is. Gebruik tab-aanvulling of systemctl list-units om de exacte unit te vinden.
  • Aannemen dat logs in /var/log/*.log staan. Op een standaard systemd-systeem is het journal de vastlegging; lees het met journalctl, niet door tekstbestanden te openen.
  • Ordenen zonder vereisen, of andersom. After= stelt volgorde in maar geen afhankelijkheid; Requires= stelt afhankelijkheid in maar geen volgorde. Echte afhankelijkheden hebben meestal beide nodig.
Naar boven

10. Samenvatting

systemd is het programma dat een moderne Linux-machine opstart en draait. Het is het eerste proces dat de kernel start, het beheert al het andere als een unit, en het blijft de leiding houden tot het afsluiten. Leer hoe het denkt, in units, targets en control groups, en het hele systeem wordt iets waarover je kunt redeneren in plaats van een mysterie dat "gewoon opstart".

  • systemd is de systeem- en dienstbeheerder, draaiend als PID 1, de voorouder van elk ander proces op de machine.
  • De naam betekent "system daemon"; het staat aan het hoofd van een familie gereedschappen zoals systemctl en journalctl en helpers zoals systemd-journald.
  • Het verving SysV init's trage, script-gebaseerde, een-voor-een opstart door declaratieve unit-bestanden, parallel opstarten en cgroup-tracking, en verscheen in 2010.
  • Alles wat het beheert is een unit: services, sockets, timers, mounts, en targets die units groeperen tot systeemtoestanden (de vervanging voor runlevels).
  • Je stuurt het aan met systemctl om units te besturen en journalctl om het ene verenigde journal te lezen.
  • Je kunt je eigen [Unit]/[Service]/[Install]-bestand schrijven, taken plannen met timer-units in plaats van cron, en diensten op aanvraag starten met socket-activering.
  • Het kan resources begrenzen (MemoryMax=, CPUQuota=) en diensten sandboxen (ProtectSystem=, PrivateTmp=, NoNewPrivileges=), gescoord door systemd-analyze security.
  • Onder de motorkap is opstarten een keten van targets, is enablen een symlink in een .wants-map, gebeurt besturing over D-Bus, en zorgen cgroups dat geen proces ontsnapt.
  • Het is niet een binary maar een hele suite die ook logging, sessies, netwerk, DNS, kloksynchronisatie en apparaatbeheer overnam.

Dit is de snelle referentie die het bewaren waard is:

ps -p 1 -o comm=                 confirm systemd is PID 1
systemctl status                 a tree of the whole running system
systemctl status nginx           is one service running and enabled
systemctl list-units             every unit loaded now
systemctl list-unit-files        every installed unit and its state
systemctl list-timers            scheduled timer units
systemctl get-default            the target the system boots into
systemctl daemon-reload          re-read unit files after editing
systemctl --user status          your own per-user services
systemd-analyze                  how long the last boot took
systemd-analyze blame            slowest units at boot
systemd-analyze critical-chain   the chain that gated boot
systemd-analyze security nginx   score a service's sandboxing
systemd-cgls                     the control-group tree
systemd-cgtop                    live CPU, memory, and I/O per service
journalctl -u nginx              all logs for one unit
journalctl -b                    everything since the last boot
man systemd.unit                 the reference for unit options

Een server die schoon opstart, zijn eigen gecrashte diensten herstart, zijn taken betrouwbaar plant, en elke log op een doorzoekbare plek houdt is geen geluk: het is systemd met opzet ingericht. Als je machines diensten hebben die stilletjes niet terugkomen na een herstart, taken die in cron draaien zonder spoor van wat er gebeurde, of een opstart die niemand in het team volledig begrijpt, loont het om systemd correct in te richten voor het volgende incident, zodat het systeem zich precies gedraagt zoals je verwacht, elke keer.

Naar boven
Linux concept: systemd
Peter Martin
Peter Martin
Joomla Specialist

Peter is Joomla specialist en Linux admin voor snelle, veilige en schaalbare websites.