systemd unit
systemd unit
systemd is een init-systeem en systeem- en servicebeheerder dat sinds 2010 centraal staat in de opstart en het beheer van moderne Linux-distributies. Het is ontwikkeld door Lennart Poettering en Kay Sievers, toen beiden werkzaam waren bij Red Hat. De eerste versie werd in maart 2010 aangekondigd en had als doel om het verouderde SysV init-systeem te vervangen. Een van de kernconcepten van systemd is de unit. Units zijn de fundamentele bouwstenen waarmee systemd systemen beheert, van het opstarten van diensten tot het monteren van bestandssystemen en het plannen van taken.
Een unit in systemd is een abstractie die een bepaald systeemcomponent of -resource vertegenwoordigt. Elke unit heeft een specifieke rol en wordt beschreven door een configuratiebestand, bekend als een unit file. Deze unit files zijn de manier waarop systemd weet wat het moet doen met een bepaalde resource. Units zijn gestandaardiseerd en vormen de basis van de systemd-architectuur. Ze worden gebruikt om bijvoorbeeld services te starten, bestandssystemen te monteren, sockets te openen, timers in te stellen of hardwaretoestellen te beheren. De terminologie van units is consistent en centraal in de officiële documentatie van systemd.
Er zijn verschillende typen units, elk met een eigen functie. De meest gebruikte zijn service-units, socket-units, mount-units, target-units, timer-units, device-units en slice-units. Elk type unit heeft een specifieke extensie in de bestandsnaam van de bijbehorende unit file. Bijvoorbeeld: een service-unit heeft de extensie `.service`, een mount-unit gebruikt `.mount`, een timer-unit `.timer`, enzovoort. Deze eenheid in benaming en structuur maakt het eenvoudiger om systemen te begrijpen en te beheren, omdat de naam van het bestand direct aangeeft welk type resource het betreft.
Een service-unit is verantwoordelijk voor het starten, stoppen en beheren van een systeemdienst of applicatie. Denk aan de webserver Apache of de database MySQL. De unit file bevat instructies over hoe en wanneer de service moet worden gestart, of deze moet worden herstart bij een crash, en welke andere units afhankelijk zijn van deze service. Service-units worden vaak gekoppeld aan andere units, zoals socket-units, om lazy loading mogelijk te maken — de service start pas wanneer er daadwerkelijk een verzoek wordt gedaan via de socket.
Een socket-unit stelt systemd in staat om sockets (netwerk- of lokale communicatiekanalen) te beheren onafhankelijk van de bijbehorende service. Dit betekent dat de socket al actief kan zijn voordat de service die hem gebruikt wordt gestart. Wanneer er verkeer binnenkomt, kan systemd automatisch de bijbehorende service starten. Dit vermindert de opstarttijd en verbruikt minder resources, omdat services pas worden geladen wanneer ze daadwerkelijk nodig zijn.
Mount-units worden gebruikt om bestandssystemen te monteren. In plaats van alles via het klassieke `/etc/fstab`-bestand te doen, kan systemd deze taken overnemen via mount-units. Er bestaat een speciale generator, `systemd-fstab-generator`, die de regels in `/etc/fstab` omzet in systemd mount- en swap-units tijdens het opstarten. Dit zorgt voor een consistente manier van monteren binnen het systemd-ecosysteem. De mount-unit definieert bijvoorbeeld welk apparaat wordt gemonteerd, waar, met welke opties en in welke volgorde.
Target-units vervangen in feite het oude concept van SysV runlevels, maar zijn flexibeler. Een target is geen vast nummer zoals runlevel 3 of 5, maar een groep van units die samen een bepaalde systeemtoestand definiëren. Bijvoorbeeld: `multi-user.target` staat voor een systeem met meerdere gebruikers, zonder grafische interface, terwijl `graphical.target` ook de grafische omgeving omvat. Targets worden gebruikt om de gewenste opstartmodus te activeren, en ze bevatten vaak verwijzingen naar andere units die moeten worden gestart. Belangrijk om te weten is dat een target geen runlevel is, maar een verzameling van services die gestart moeten worden — een onderscheid dat in Nederlandstalige documentatie expliciet wordt gemaakt.
Timer-units zijn vergelijkbaar met cron-taken, maar met meer functionaliteit. Ze kunnen worden gebruikt om een service of een andere unit op een bepaald tijdstip of interval uit te voeren. Timer-units ondersteunen zowel absolute tijden (bijv. "elke dag om 03:00") als relatieve intervallen ("elke 10 minuten na opstart"). Ze zijn nauwkeuriger en beter geïntegreerd met het systemd-systeem dan traditionele cronjobs, en kunnen bijvoorbeeld worden gebruikt om logbestanden te rotateren of back-ups te maken.
Device-units representeren hardwaretoestellen die door de kernel zijn herkend. systemd kan reageren op het verschijnen of verdwijnen van apparaten, bijvoorbeeld een USB-stick die wordt aangesloten. Device-units worden automatisch gecreëerd op basis van udev-gebeurtenissen en kunnen worden gebruikt om acties te koppelen aan hardwareveranderingen.
Slice-units worden gebruikt voor resourcebeheer. Ze organiseren processen in hiërarchische groepen (zoals in cgroups) om CPU-, geheugen- en I/O-gebruik te beperken of te prioriteren. Slice-units maken deel uit van het bredere resource management-systeem van systemd en zijn belangrijk in omgevingen met veel processen of containers.
Alle unit files worden opgeslagen in bepaalde mappen, afhankelijk van hun oorsprong en prioriteit. `/usr/lib/systemd/system/` bevat de standaard unit files die door de distributie of pakketbeheerder worden geïnstalleerd. `/etc/systemd/system/` is bedoeld voor systeembeheerders die unit files willen aanpassen of toevoegen — bestanden hier hebben een hogere prioriteit en overschrijven die in `/usr/lib/`. Daarnaast bestaat `/run/systemd/system/` voor tijdelijke unit files die tijdens runtime worden aangemaakt. Het prioriteitssysteem is belangrijk: bestanden in `/etc/` hebben de hoogste prioriteit, gevolgd door `/run/`, en `/usr/lib/` heeft de laagste. Dit mechanisme wordt gebruikt door tools zoals `systemd-delta`, die kan worden ingezet om te zien welke configuratiebestanden andere overschrijven.
De opname van systemd in grote Linux-distributies vond geleidelijk plaats. De eerste distributie die systemd adopteerde was Fedora 15. Daarna volgden openSUSE 12.2, CentOS 7, RHEL 7, SUSE 12, Debian 8 en uiteindelijk Ubuntu 15.04. Deze migratie markeerde een keerpunt in het Linux-ecosysteem, waarbij het oude SysV init-systeem steeds meer werd verdrongen. Ondanks kritiek op de complexiteit en de omvang van systemd, is het inmiddels de standaard geworden.
Naast de standaard units bestaan er ook generators die tijdens het opstarten unit files dynamisch kunnen aanmaken. Voorbeelden zijn `systemd-fstab-generator`, die uit `/etc/fstab` mount-units genereert, en `systemd-gpt-auto-generator`, die automatisch partities herkent op basis van GPT-partitietypen (zoals de root-partitie of /home) en daarvan units maakt. Deze generators zorgen voor een soepele integratie tussen traditionele Linux-configuraties en het moderne systemd-model.
Verder zijn er hulpprogramma’s die specifiek met units werken. `systemd-escape` kan strings omzetten naar een veilig formaat voor gebruik in unit-namen, wat handig is bij dynamische unit creatie. `systemd-firstboot` helpt bij de eerste opstart van een systeem of image door basisinstellingen in te stellen, zoals tijdzone, hostnaam en taal, voordat de reguliere units worden gestart.
Ook bij het afsluiten van het systeem spelen units een rol. Services zoals `systemd-poweroff.service`, `systemd-halt.service` en `systemd-reboot.service` worden ingeladen via de bijbehorende targets (`poweroff.target`, `halt.target`, `reboot.target`) en zorgen voor een gecontroleerde shutdown. Het daadwerkelijke afsluitproces wordt uitgevoerd door `/usr/lib/systemd/systemd-shutdown`.
Samenvattend: de systemd unit is de kern van het moderne Linux-systeembeheer. Het is een krachtig, flexibel en gestandaardiseerd model dat het beheer van systemen vereenvoudigt en versnelt. Door het gebruik van verschillende unit types en een duidelijke hiërarchie in configuratiebestanden, biedt systemd een robuuste basis voor zowel desktop- als serversystemen. Het concept van de unit is niet alleen technisch, maar ook filosofisch: alles is een unit, en alles is beheersbaar.