Linux concept: systemd
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:
| Suffix | Unit-type | Beheert |
|---|---|---|
.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.
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:
| Naam | Rol |
|---|---|
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.
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.
| Tijdvak | Mijlpaal |
|---|---|
| 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 boven4. 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 boven5. 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
| Sectie | Beantwoordt |
|---|---|
[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:
| Target | Oud runlevel | Betekenis |
|---|---|---|
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 boven6. 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:
| Directive | Effect |
|---|---|
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:
| Directive | Effect |
|---|---|
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.
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:
| Component | Vervangt 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.
7.3 Een dienst "enablen" is gewoon een symbolische link
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 metbusctl. systemctlis 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.
8. Beste praktijken
- Laat systemd je programma's beheren. Een kort
[Unit]/[Service]/[Install]-bestand metRestart=on-failurewint van een handmatig gedraaid script of eenrc.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 metsystemctl edit, zodat je wijzigingen blijven bestaan. - Draai
daemon-reloadna 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 metsystemctl list-timers. - Sandbox diensten die aan het internet blootstaan. Een paar regels zoals
ProtectSystem=strict,PrivateTmp=trueenNoNewPrivileges=truemaken van veel volledige-systeem-compromitteringen ingeperkte. Controleer het resultaat metsystemd-analyze security. - Stel resourcelimieten in op hongerige diensten.
MemoryMax=enTasksMax=voorkomen dat een op hol geslagen proces de hele machine neerhaalt. - Gebruik
systemd-analyzeom je opstarten te begrijpen.blameencritical-chaintonen wat traag is en waarom, in plaats van te gissen. - Lees de handleiding. systemd is grondig gedocumenteerd;
man systemd,man systemd.unitenman systemd.servicezijn 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 boven9. Veelgemaakte fouten
9.1 Mythe versus werkelijkheid
| Mythe | Werkelijkheid |
|---|---|
| "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-reloadvergeten 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/systemof een drop-in. - Een gebruikersdienst zoeken in het systeemoverzicht. Een unit die met
--useris gestart verschijnt niet in een gewonesystemctl status. Voeg--usertoe om hem te zien. - De unit-naam verwarren met de procesnaam. De unit kan
ssh.servicezijn terwijl het draaiende programmasshdis. Gebruik tab-aanvulling ofsystemctl list-unitsom de exacte unit te vinden. - Aannemen dat logs in
/var/log/*.logstaan. Op een standaard systemd-systeem is het journal de vastlegging; lees het metjournalctl, 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.
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
systemctlenjournalctlen helpers zoalssystemd-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
systemctlom units te besturen enjournalctlom 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 doorsystemd-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

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


