- Senior schrijver
- Auteur
Systemd is de standaard systeem- en servicemanager die in de meeste moderne Linux-distributies wordt gebruikt. Het is verantwoordelijk voor het opstarten van het systeem tijdens het opstarten en het beheren van actieve services. Het neemt proces-ID 1 (PID 1) over, wat betekent dat het het allereerste gebruikersruimteproces is dat door de Linux-kernel wordt gestart en blijft draaien totdat het systeem wordt afgesloten.
In tegenstelling tot oudere init-systemen zoals SysV, gebruikt systemd units om systeembronnen te definiëren en te beheren. Elke unit wordt beschreven door een configuratiebestand, een zogenaamd unit-bestand, dat systemd vertelt hoe die bron moet worden beheerd. Units kunnen services, apparaten, koppelpunten of zelfs groepen units vertegenwoordigen, zogenaamde targets, die tijdens het opstartproces als controleposten fungeren.
Het belangrijkste hulpmiddel voor interactie met systemd is systemctl, waarmee u services en andere units kunt starten, stoppen, herstarten, in- en uitschakelen en de status ervan kunt controleren.
Om systeemlogboeken met betrekking tot systemd en zijn services te bekijken, kunt u journalctl gebruiken, een commando dat berichten uit het systemd-logboek weergeeft.
In deze handleiding zullen we bekijken hoe u het commando systemctl kunt gebruiken, een hulpmiddel voor het beheren van het initialisatiesysteem op Linux. We bespreken ook hoe u services kunt beheren, hun status kunt bekijken, systeemstatussen kunt aanpassen en kunt communiceren met configuratiebestanden.
Het is belangrijk om te vermelden dat systemd weliswaar het standaard init-systeem is in veel populaire Linux-distributies, maar dat niet elke distributie het gebruikt. Als u een foutmelding ziet zoals bash: systemctl: command not found, maakt uw systeem waarschijnlijk gebruik van een ander init-systeem en is systemctl niet beschikbaar.
Een van de belangrijkste taken van een init-systeem is het opstarten van essentiële componenten nadat de Linux-kernel is geladen. Deze componenten, vaak userland-processen genoemd, omvatten verschillende services en daemons die ervoor zorgen dat het systeem soepel blijft draaien. Een init-systeem speelt ook een voortdurende rol bij het beheren van deze services terwijl het systeem actief is.
In het geval van systemd worden de belangrijkste elementen die het beheert units genoemd. Units worden gedefinieerd in configuratiebestanden die unitbestanden worden genoemd, en elk bestand specificeert hoe een bepaalde bron moet worden behandeld. Het type bron wordt aangegeven door de extensie (achtervoegsel) van het bestand.
Voor het specifiek beheren van services gebruikt systemd service-units, waarvan de bestandsnamen eindigen op .service. Bij het gebruik van systemctl-commando's kunt u echter meestal de extensie .service weglaten. Systemd gaat er dan automatisch vanuit dat u naar een service verwijst.
Om een service handmatig te starten en de acties te activeren die in het unit-bestand zijn gedefinieerd, gebruikt u de volgende opdracht:
$ sudo systemctl start application.service
Aangezien systemd kan afleiden dat u met een service werkt, kunt u ook het volgende uitvoeren:
$ sudo systemctl start application
Beide formaten werken, maar voor de duidelijkheid zal deze handleiding consequent het achtervoegsel .service gebruiken bij het werken met service-units.
Om een service te stoppen die momenteel actief is, gebruikt u de volgende opdracht:
$ sudo systemctl stop application.service
Om een service volledig opnieuw te starten (d.w.z. te stoppen en vervolgens opnieuw te starten), gebruikt u:
$ sudo systemctl restart application.service
Sommige services ondersteunen het opnieuw laden van hun configuratiebestanden zonder dat ze volledig opnieuw hoeven te worden gestart. Om het opnieuw laden van de configuratie te activeren, voert u het volgende uit:
$ sudo systemctl reload application.service
Als u niet zeker weet of de service herladen ondersteunt, kunt u een veiliger, gecombineerd commando gebruiken:
$ sudo systemctl reload-or-restart application.service
Hiermee wordt geprobeerd de configuratie opnieuw te laden, indien ondersteund. Als dat niet het geval is, wordt de service opnieuw gestart.
De commando's die we tot nu toe hebben behandeld, helpen bij het beheren van services binnen de huidige sessie, maar als u wilt dat een service automatisch wordt gestart wanneer het systeem opstart, moet u deze inschakelen.
Systemctl Service inschakelen (systemd enable service)
Om een service te configureren zodat deze tijdens het opstarten wordt gestart, voert u het volgende uit:
$ sudo systemctl enable application.service
Dit commando maakt een symbolische link van het bestand van de service – meestal te vinden in /lib/systemd/system/ of /etc/systemd/system/ – naar een map die systemd bij het opstarten scant op automatisch startende services (meestal iets als /etc/systemd/system/some_target.target.wants).
Systemctl service uitschakelen
Om te voorkomen dat een service bij het opstarten wordt gestart, gebruikt u:
$ sudo systemctl disable application.service
Hiermee wordt de symbolische link verwijderd, zodat systemd de service niet langer automatisch start.
Houd er rekening mee dat het inschakelen van een service alleen betekent dat deze bij het opstarten wordt gestart – de service wordt niet onmiddellijk gestart in de huidige sessie. Als u de service wilt inschakelen en direct wilt starten, moet u zowel enable als start uitvoeren.
Om te controleren of een service actief is en om wat basisinformatie over de service te bekijken, kunt u het volgende gebruiken:
$ systemctl status application.service
Hiermee worden details weergegeven, zoals of de service actief is, hoe lang deze al actief is en de meest recente logboekvermeldingen met betrekking tot de service.
Als u bijvoorbeeld de status van docker controleert, ziet u mogelijk iets als:
Dit overzicht geeft u een snelle gezondheidscontrole van de service en wijst op eventuele problemen.
Als u alleen wilt controleren of een service actief is, kunt u het volgende gebruiken:
$ systemctl is-active application.service
Dit commando geeft ‘active’ of ‘inactive’ weer. Het geeft ook een exitcode weer: 0 betekent dat de service actief is, wat handig kan zijn als u controles in een script automatiseert.
Om te controleren of een service is ingesteld om bij het opstarten te starten, voert u het volgende uit:
$ systemctl is-enabled application.service
Dit geeft ‘enabled’ of ‘disabled’ weer en net als eerder kan de exitcode van de opdracht het resultaat aangeven.
Om ten slotte te controleren of een service is mislukt, wat betekent dat er een fout is opgetreden bij het starten of uitvoeren, gebruikt u:
$ systemctl is-failed application.service
Dit geeft ‘failed’ weer als er iets mis is gegaan, of ‘active’ als de service correct werkt. Als de service opzettelijk is gestopt, ziet u mogelijk inactive of unknown. Een exitcode van 0 duidt op een storing, terwijl 1 een andere status aangeeft.
Tot nu toe hebben we gekeken naar commando's die helpen bij het beheren van individuele services, maar als u een breder beeld van het systeem als geheel wilt krijgen, biedt systemctl daar ook commando's voor.
Om te zien welke eenheden momenteel actief zijn, kunt u de opdracht list-units gebruiken:
$ systemctl list-units
Hiermee worden alle eenheden weergegeven die op dit moment actief door systemd worden beheerd. De uitvoer ziet er ongeveer zo uit:
Dit is wat elke kolom betekent:
Standaard worden alleen units weergegeven die momenteel actief zijn. Als u systemctl zonder extra argumenten uitvoert, krijgt u dezelfde uitvoer.
$ systemctl
Als u alle eenheden wilt zien die systemd heeft geprobeerd te laden of momenteel in het geheugen heeft, zelfs als ze op dit moment niet actief zijn, kunt u de vlag --all toevoegen:
$ systemctl list-units --all
Dit omvat eenheden die zijn uitgevoerd en vervolgens zijn gestopt, of zelfs eenheden die systemd heeft geprobeerd te laden maar niet kon vinden.
Om dit te beperken, kunt u filteren op specifieke statussen. Als u bijvoorbeeld alleen inactieve eenheden wilt zien, kunt u het volgende uitvoeren:
$ systemctl list-units --all --state=inactive
U kunt ook filteren op type. Om bijvoorbeeld alleen services weer te geven:
$ systemctl list-units --type=service
De bovenstaande commando's tonen alleen units waarmee systemd interactie heeft gehad, door ze te laden of te proberen uit te voeren. Om alle beschikbare unitbestanden op het systeem te zien (ongeacht of systemd ze heeft aangeraakt), gebruikt u:
$ systemctl list-unit-files
Dit geeft een lijst van alle unitdefinitiebestanden die in de systemd-mappen zijn gevonden. Dit omvat ook bestanden die systemd nooit heeft geprobeerd te laden. De uitvoer ziet er als volgt uit:
Er zijn twee kolommen:
Dit is wat deze statussen betekenen:
Dit geeft u een volledig overzicht van alle units op het systeem, ongeacht of systemd daadwerkelijk heeft geprobeerd ze te gebruiken.
Tot nu toe hebben we ons vooral gericht op het starten en stoppen van services en het bekijken van basisgegevens over systemd-units en hun bestanden. Systemd biedt echter verschillende opdrachten om dieper in de unit-informatie te duiken en deze nauwkeuriger te beheren.
Om het daadwerkelijke unitbestand te zien dat systemd in het geheugen heeft geladen, kunt u de opdracht cat gebruiken (deze is geïntroduceerd in systemd versie 209). Om bijvoorbeeld het unitbestand voor de apache2-service te bekijken, voert u het volgende uit:
$ systemctl cat apache2.service
Dit commando geeft de inhoud weer van het unit-bestand dat momenteel bekend is bij systemd. Dit is vooral handig als het bestand recentelijk is gewijzigd of als er aangepaste overschrijvingen zijn toegepast. De weergegeven inhoud geeft de live status van het bestand weer zoals systemd die ziet.
Als u wilt controleren op welke andere units een bepaalde service vertrouwt, is het commando list-dependencies handig. Om bijvoorbeeld te zien waar de sshd-service van afhankelijk is, voert u het volgende uit:
$ systemctl list-dependencies sshd.service
Dit geeft een boomstructuur weer van units die sshd.service direct nodig heeft of wenst (optionele afhankelijkheden). Systemd-doelen, speciale groeperingen van units die systeemstatussen vertegenwoordigen, tonen ook hun eigen interne afhankelijkheden.
Om alle recursieve afhankelijkheden weer te geven, kunt u de optie --all toevoegen:
$ systemctl list-dependencies --all sshd.service
U kunt deze weergave ook omkeren om te zien welke units afhankelijk zijn van de opgegeven service. Voeg hiervoor de vlag --reverse toe:
systemctl list-dependencies --reverse sshd.service
Als u wilt controleren welke units zijn geconfigureerd om vóór of na de betreffende service te starten, kunt u deze opties gebruiken:
systemctl list-dependencies sshd.service --before
systemctl list-dependencies sshd.service --after
Elke unit heeft veel eigenschappen die bepalen hoe systemd ermee omgaat. Gebruik het commando show om al deze eigenschappen voor een bepaalde unit te bekijken. Dit geeft gedetailleerde unitgegevens weer in een key=value-formaat:
systemctl show sshd.service
Hierdoor worden tientallen eigenschappen weergegeven, waaronder tot welke doelen deze unit behoort, eventuele conflicten met andere units en de afhankelijkheidsrelaties.
Als u slechts één bepaalde eigenschap wilt zien, kunt u filteren met de optie -p. Om bijvoorbeeld te controleren met welke units de sshd-service conflicteert:
systemctl show sshd.service -p Conflicts
Soms is het niet voldoende om een service gewoon te stoppen of uit te schakelen. Misschien wilt u volledig voorkomen dat deze onder welke omstandigheden dan ook wordt gestart. Hier komt maskeren om de hoek kijken. Wanneer een eenheid wordt gemaskeerd, koppelt systemd deze aan /dev/null, waardoor deze effectief wordt geblokkeerd voor handmatig of automatisch starten.
Om een eenheid te maskeren, voert u het volgende uit:
$ sudo systemctl mask apache2.service
Als u daarna alle unitbestanden controleert, ziet u dat apache2.service is gemarkeerd als “gemaskeerd”:
$ systemctl list-unit-files
Als u probeert een gemaskeerde service te starten, weigert systemd dit en geeft het een foutmelding:
$ sudo systemctl start apache2.service
Om de service weer te kunnen starten, ontmasker u deze met:
$ sudo systemctl unmask apache2.service
Hiermee wordt de blokkering verwijderd en wordt de unit teruggezet naar de normale staat, waarin deze weer kan worden gestart of ingeschakeld zoals elke andere service.
Hoewel het buiten het bestek van deze handleiding valt om de exacte structuur en syntaxis van unitbestanden uit te leggen, biedt systemd ingebouwde tools waarmee u indien nodig direct wijzigingen kunt aanbrengen. Deze bewerkingsfuncties zijn geïntroduceerd in systemd versie 218.
Met het bewerkingscommando kunt u wijzigingen aanbrengen in een unitbestand via een eenvoudige interface. Standaard opent dit commando een leeg override-bestand dat specifiek is voor de unit die u wilt wijzigen. Om bijvoorbeeld een override voor nginx.service te maken, gebruikt u:
$ sudo systemctl edit nginx.service
Hiermee wordt een map aangemaakt onder /etc/systemd/system met de naam van de unit gevolgd door .d, bijvoorbeeld nginx.service.d. In die map plaatst systemd een bestand met de naam override.conf, waar u uw aangepaste configuratie kunt toevoegen.
Wanneer de service start, combineert systemd dit overschrijvingsbestand met het hoofdunitbestand, waarbij voorrang wordt gegeven aan alle instellingen die in de overschrijving zijn gedefinieerd. Dit maakt het gemakkelijk om specifieke opties aan te passen zonder het oorspronkelijke bestand rechtstreeks te bewerken.
Als u het volledige unitbestand wilt wijzigen in plaats van een kleine overschrijving te maken, kunt u de optie --full gebruiken:
$ sudo systemctl edit --full nginx.service
Met deze opdracht wordt het huidige volledige bestand in uw editor geladen, zodat u alle nodige wijzigingen kunt aanbrengen. Zodra u de editor opslaat en sluit, slaat systemd het gewijzigde bestand op in /etc/systemd/system, dat voorrang heeft op het standaardbestand in /lib/systemd/system.
Als u uw wijzigingen ooit ongedaan wilt maken, kunt u eenvoudigweg de overschrijvingsmap of het aangepaste unit-bestand zelf verwijderen.
Om een overschrijvingsmap te verwijderen:
$ sudo rm -r /etc/systemd/system/nginx.service.d
Om een volledig aangepast unit-bestand te verwijderen:
$ sudo rm /etc/systemd/system/nginx.service
Nadat de bestanden zijn verwijderd, moet u systemd opnieuw laden, zodat het de verwijderde bestanden vergeet en terugkeert naar het gebruik van het oorspronkelijke systeemeenheidsbestand:
sudo systemctl daemon-reload
Dit zorgt ervoor dat systemd niet langer zoekt naar of de wijzigingen toepast die u hebt verwijderd.
In systemd vertegenwoordigen doelen specifieke systeemstatussen, vergelijkbaar met traditionele runlevels in oudere init-systemen. Deze doelen worden gedefinieerd als speciale unitbestanden die eindigen op .target, en ze werken door andere units te groeperen om de gewenste status te bereiken.
Het systeem start op in een standaarddoel, dat de systeemstatus na het opstarten bepaalt. U kunt het huidige standaarddoel controleren met:
$ systemctl get-default
Om het standaarddoel te wijzigen, bijvoorbeeld naar een grafische desktopomgeving, gebruikt u:
$ sudo systemctl set-default graphical.target
Om alle beschikbare doelen op het systeem te zien:
$ systemctl list-unit-files --type=target
Om alleen de momenteel actieve doelen te bekijken:
$ systemctl list-units --type=target
U kunt het systeem naar een ander doel schakelen, waarbij alle niet-gerelateerde services worden gestopt en alleen de services worden gestart die nodig zijn voor het nieuwe doel. Dit doet u met het commando isolate.
Om bijvoorbeeld over te schakelen van een grafische desktop naar een omgeving met alleen een opdrachtregel:
$ sudo systemctl isolate multi-user.target
Voordat u gaat isoleren, is het handig om te controleren van welke services een doel afhankelijk is:
$ systemctl list-dependencies multi-user.target
Zo voorkomt u dat u per ongeluk belangrijke services stopt.
Systemd biedt speciale snelkoppelingen voor het afhandelen van essentiële systeemgebeurtenissen, zoals afsluiten, opnieuw opstarten of de reddingsmodus activeren. Deze snelkoppelingen activeren de juiste doelen en stellen alle aangemelde gebruikers op de hoogte van de gebeurtenis, waardoor een extra communicatielaag wordt toegevoegd.
Om de reddingsmodus (modus voor één gebruiker) te activeren, voert u het volgende uit:
$ sudo systemctl rescue
Dit werkt op dezelfde manier als het isoleren van rescue.target, maar met als bijkomend voordeel dat actieve gebruikers worden geïnformeerd.
Om het systeem te stoppen (alle processen stoppen zonder uit te schakelen):
$ sudo systemctl halt
Om het systeem volledig uit te schakelen, gebruikt u:
$ sudo systemctl poweroff
Om de machine opnieuw op te starten:
$ sudo systemctl reboot
De meeste Linux-systemen bieden ook traditionele commando's die rechtstreeks aan systemd zijn gekoppeld, dus u kunt vaak gewoon het volgende typen:
$ sudo reboot
Deze commando's integreren naadloos met systemd, waardoor een goede communicatie en een nette afhandeling van systeemgebeurtenissen worden gegarandeerd.
Het beveiligen van systemd-services is een cruciale stap om uw systeem te beschermen tegen aanvallen, ongeoorloofde toegang en onopzettelijke schade. Hieronder vindt u een gestroomlijnde aanpak voor het versterken van services met behulp van systemd.
Elke service die door systemd wordt beheerd, heeft een bijbehorend unit-bestand, dat bepaalt hoe de service wordt uitgevoerd, inclusief opstartprocessen, toegangsrechten en resourcebeperkingen. Deze bestanden worden meestal opgeslagen in /etc/systemd/system/ en kunnen worden aangepast om de beveiliging te verbeteren.
In dit artikel hebben we geleerd hoe we het commando systemctl kunnen gebruiken. Systemctl is het belangrijkste hulpmiddel voor het beheren van services en systeemstatussen in systemd. Het dient als de belangrijkste interface voor interactie met het kernproces van het systeem. Systemd bevat echter ook aanvullende hulpmiddelen, zoals journalctl voor het bekijken van logbestanden en loginctl voor het beheren van gebruikerssessies. Als u deze gerelateerde tools begrijpt, kunt u uw systeem effectiever beheren.
Is uw bedrijf de grenzen van VPS-hosting ontgroeid? Upgrade dan naar de kracht en prestaties van een dedicated server van BlueServers!
Til uw hosting naar een hoger niveau — Ontdek vandaag nog de dedicated servers van BlueServers!
Start for free and unlock high-performance infrastructure with instant setup.
Jouw mening helpt ons een betere service te bouwen.