โ๏ธ systemd
systemd is het centrale service- en initialisatiesysteem van Rocky Linux 10.
Binnen Tulpencraft wordt systemd gebruikt om onder andere de Minecraft-servers automatisch te starten, stoppen en beheren. Hierdoor zijn de servers niet afhankelijk van een handmatige java-start na een reboot.
Rocky Linux gebruikt systemd als standaard systeem- en servicebeheerder. Services worden beschreven met zogenaamde units, waaronder .service-units voor systeemdiensten.
๐ฏ Doel binnen Tulpencraft
Binnen Tulpencraft heeft systemd een aantal belangrijke functies:
- ๐ Minecraft-servers automatisch starten;
- ๐ services automatisch opnieuw starten wanneer dat nodig is;
- ๐ services gecontroleerd stoppen;
- ๐ logging via de systemd journal;
- ๐ afhankelijkheden tussen services beheren;
- ๐ services onder een specifieke Linux-gebruiker uitvoeren;
- ๐งฑ services verder hardenen;
- ๐ services automatisch laten starten na een reboot.
Hierdoor wordt een Minecraft-server een normale Linux-service in plaats van een proces dat handmatig vanuit een shell moet worden gestart.
๐๏ธ Opbouw
Een systemd-service bestaat uit een unit file.
Voorbeeld:
/etc/systemd/system/minecraft-lobby.service
Een service bevat doorgaans drie belangrijke secties:
[Unit] [Service] [Install]
`[Unit]`
Beschrijft de service en eventuele afhankelijkheden.
`[Service]`
Beschrijft hoe het programma wordt uitgevoerd.
`[Install]`
Beschrijft wanneer en hoe de service automatisch wordt geactiveerd.
๐ฎ Minecraft-services
Tulpencraft gebruikt systemd voor de Minecraft-services.
Voorbeelden zijn:
minecraft-lobby.service minecraft-survival.service minecraft-events.service
De exacte services kunnen veranderen naarmate het netwerk wordt uitgebreid.
De Velocity Proxy en de Minecraft-backends worden als afzonderlijke services beheerd wanneer zij op afzonderlijke processen of VM's draaien.
๐ Service starten
Een service kan handmatig worden gestart met:
sudo systemctl start minecraft-lobby
De status controleren:
sudo systemctl status minecraft-lobby
Een succesvolle service ziet er conceptueel uit als:
โ minecraft-lobby.service Loaded: loaded Active: active (running)
๐ Service stoppen
Een Minecraft-service gecontroleerd stoppen:
sudo systemctl stop minecraft-lobby
Dit verdient de voorkeur boven het hard beรซindigen van het Java-proces.
๐ Service herstarten
Na een configuratiewijziging kan een service worden herstart:
sudo systemctl restart minecraft-lobby
De status daarna controleren:
sudo systemctl status minecraft-lobby
๐ Automatisch starten
Een Minecraft-service wordt ingeschakeld met:
sudo systemctl enable minecraft-lobby
Hierdoor wordt de service automatisch gestart tijdens het opstarten van het systeem.
Controleren:
sudo systemctl is-enabled minecraft-lobby
Verwachte output:
enabled
systemd gebruikt hiervoor onder andere multi-user.target, de gebruikelijke target voor een server zonder grafische omgeving.
๐ Starten รฉn inschakelen
Wanneer een service zowel onmiddellijk moet worden gestart als na een reboot automatisch moet starten:
sudo systemctl enable --now minecraft-lobby
Dit is binnen Tulpencraft meestal de handigste methode bij het voor het eerst activeren van een nieuwe service.
๐ Automatisch opnieuw starten
Minecraft kan om verschillende redenen stoppen:
- Java-crash;
- pluginprobleem;
- onverwachte fout;
- Out Of Memory;
- handmatige beรซindiging;
- tijdelijke fout in een afhankelijk proces.
Daarom kan een Minecraft-service automatisch opnieuw worden gestart.
Een veelgebruikte instelling is:
[Service] Restart=on-failure RestartSec=5
Hiermee probeert systemd de service opnieuw te starten wanneer deze onverwacht stopt.
Een permanente crashloop moet uiteraard worden onderzocht in plaats van simpelweg te worden genegeerd.
๐ค Niet als root draaien
Minecraft-services worden bij voorkeur niet als root uitgevoerd.
Bijvoorbeeld:
[Service] User=minecraft Group=minecraft
Hierdoor draait het Java-proces onder een beperkte Linux-gebruiker.
Dit beperkt de impact wanneer de Minecraft-server of een plugin wordt gecompromitteerd.
Een systemd-service kan expliciet met User= en Group= onder een dedicated account worden uitgevoerd.
๐ Werkdirectory
Een Minecraft-service moet expliciet weten waar de serverbestanden staan.
Bijvoorbeeld:
[Service] WorkingDirectory=/srv/minecraft/lobby
Hierdoor worden relatieve paden vanuit de juiste Minecraft-directory geรฏnterpreteerd.
โ Java starten
Een Minecraft-service start Java rechtstreeks vanuit systemd.
Bijvoorbeeld:
[Service] ExecStart=/usr/bin/java -Xms2G -Xmx4G -jar paper.jar --nogui
De daadwerkelijke Java-versie en geheugeninstellingen verschillen per server.
Zie ook:
๐งฉ Voorbeeldservice
Een vereenvoudigd voorbeeld voor een Tulpencraft Minecraft-service:
[Unit] Description=Tulpencraft Lobby After=network-online.target Wants=network-online.target [Service] User=minecraft Group=minecraft WorkingDirectory=/srv/minecraft/lobby ExecStart=/usr/bin/java -Xms2G -Xmx4G -jar paper.jar --nogui Restart=on-failure RestartSec=5 [Install] WantedBy=multi-user.target
Dit is een voorbeeld. De daadwerkelijke productieconfiguratie kan aanvullende beveiligings- en runtime-instellingen bevatten.
๐ Netwerkafhankelijkheden
Minecraft-services hebben een werkende netwerkstack nodig.
Daarom kan een service bijvoorbeeld afhankelijk worden gemaakt van:
After=network-online.target Wants=network-online.target
Dit voorkomt dat de Minecraft-service onnodig vroeg tijdens de boot wordt gestart.
Bij de Tulpencraft Proxy is dit extra relevant omdat de proxy het centrale toegangspunt tot het netwerk vormt.
๐ Afhankelijkheden
systemd kan afhankelijkheden tussen services beheren.
Bijvoorbeeld:
network-online.target
โ
โผ
Velocity Proxy
โ
โผ
Lobby
โ
โโโโบ Survival
โโโโบ Events
In de praktijk worden Minecraft-backends niet noodzakelijk als harde systemd-afhankelijkheid van de proxy gemaakt.
De Minecraft-netwerkarchitectuur wordt namelijk door Velocity beheerd.
Een backend die tijdelijk niet beschikbaar is, moet niet automatisch voorkomen dat de Proxy zelf start.
๐ Logs
De output van systemd-services wordt standaard beschikbaar gemaakt via journald.
De logs van de lobby bekijken:
sudo journalctl -u minecraft-lobby
Alleen recente meldingen:
sudo journalctl -u minecraft-lobby --since "1 hour ago"
Live meekijken:
sudo journalctl -u minecraft-lobby -f
Dit is bijzonder handig bij het opstarten van Minecraft.
Bijvoorbeeld:
sudo journalctl -u minecraft-lobby --since "5 minutes ago" --no-pager
๐ Fouten zoeken
Een snelle controle:
sudo systemctl status minecraft-lobby
Daarna:
sudo journalctl -u minecraft-lobby -b --no-pager
De optie -b beperkt de resultaten tot de huidige boot.
Voor alleen fouten:
sudo journalctl -u minecraft-lobby -b -p err
๐งน Journal en Minecraft logs
systemd-journald en de Minecraft logging zijn twee verschillende zaken.
systemd
โ
โโโ journald
โ
โโโ service output
Minecraft
โ
โโโ logs/
โโโ latest.log
โโโ ...
Beide kunnen daarom nuttige informatie bevatten.
Bij een probleem wordt eerst gekeken naar:
sudo systemctl status minecraft-lobby
en:
sudo journalctl -u minecraft-lobby -b
Daarna kunnen de Minecraft-logs worden onderzocht.
๐ Configuratie wijzigen
Na het aanpassen van een systemd-unit moet systemd zijn configuratie opnieuw inlezen:
sudo systemctl daemon-reload
Daarna kan de service worden herstart:
sudo systemctl restart minecraft-lobby
Zonder daemon-reload kan systemd een oude versie van de unit blijven gebruiken.
๐ Unit bekijken
De daadwerkelijk gebruikte unit kan worden bekeken met:
sudo systemctl cat minecraft-lobby
Dit is vaak beter dan alleen het bestand bekijken, omdat hiermee ook relevante drop-ins zichtbaar kunnen zijn. Rocky Linux documenteert systemctl cat en systemctl edit als standaardmethoden voor het bekijken en aanpassen van units.
๐ ๏ธ Overrides
Bestaande systemd-services worden bij voorkeur niet rechtstreeks aangepast wanneer een override mogelijk is.
Een override openen:
sudo systemctl edit minecraft-lobby
systemd maakt hiervoor bijvoorbeeld:
/etc/systemd/system/minecraft-lobby.service.d/override.conf
Na een wijziging:
sudo systemctl daemon-reload sudo systemctl restart minecraft-lobby
Dit houdt de basisunit gescheiden van lokale aanpassingen.
๐ systemd hardening
Naast SELinux, firewalld en Linux-permissions kan systemd zelf worden gebruikt om services verder te beperken.
Mogelijke instellingen zijn bijvoorbeeld:
NoNewPrivileges=true PrivateTmp=true ProtectSystem=full ProtectHome=true RestrictSUIDSGID=true LockPersonality=true
Niet iedere instelling is zonder meer geschikt voor Minecraft.
Java en Minecraft/plugins kunnen namelijk specifieke toegang nodig hebben. Vooral instellingen zoals MemoryDenyWriteExecute= kunnen applicaties met JIT-compilers breken; Rocky Linux waarschuwt hier expliciet voor.
Daarom worden hardening-opties per service getest.
๐งช systemd-analyze security
De beveiliging van een systemd-service kan worden onderzocht met:
sudo systemd-analyze security minecraft-lobby
Hiermee kan worden bekeken welke systemd-sandboxingmaatregelen actief zijn en waar verdere beperking mogelijk is.
Het doel is niet om blind de hoogst mogelijke score te behalen.
Het doel is:
De service zo ver mogelijk beperken zonder Minecraft of benodigde plugins te breken.
๐ Resourcebeperking
systemd kan ook resources van een service beperken.
Denk bijvoorbeeld aan:
MemoryMax= CPUQuota= TasksMax=
Dit kan in bepaalde situaties voorkomen dat รฉรฉn service alle resources van een VM gebruikt.
Voor Minecraft moet hiermee voorzichtig worden omgegaan.
Minecraft kan tijdens wereldgeneratie, chunkloading of piekbelasting tijdelijk aanzienlijk meer CPU en RAM gebruiken.
Resource limits worden daarom alleen toegepast wanneer ze daadwerkelijk nodig en getest zijn.
๐ Servicebeheer
Alleen bevoegde beheerders mogen Tulpencraft-services beheren.
Voorbeelden:
sudo systemctl start minecraft-lobby sudo systemctl stop minecraft-lobby sudo systemctl restart minecraft-lobby
Toegang tot systemctl wordt daarmee onderdeel van de algemene Linux-beheerrechten.
๐จ Bij een serverprobleem
Bij een Minecraft-server die niet meer bereikbaar is:
1. Controleer systemd
sudo systemctl status minecraft-lobby
2. Controleer de laatste logs
sudo journalctl -u minecraft-lobby -n 100 --no-pager
3. Controleer of Java draait
pgrep -af java
4. Controleer de luisterende poorten
sudo ss -lntp
5. Controleer Minecraft zelf
/srv/minecraft/lobby/logs/latest.log
6. Herstart alleen wanneer nodig
sudo systemctl restart minecraft-lobby
Een restart is dus niet automatisch de eerste oplossing. Eerst wordt de oorzaak onderzocht.
๐ Na een reboot
Na een reboot moet een Tulpencraft-node zelfstandig kunnen herstellen.
De gewenste volgorde is:
๐ฅ๏ธ Rocky Linux boot
โ
โผ
โ๏ธ systemd
โ
โโโ ๐ฅ firewalld
โโโ ๐ก๏ธ overige systeemservices
โ
โผ
โ Java/Minecraft services
โ
โผ
๐ Tulpencraft netwerk beschikbaar
De Minecraft-services worden via systemd automatisch gestart wanneer ze met enable zijn geactiveerd.
๐งฐ Belangrijke commando's
| Commando | Functie |
|---|---|
systemctl status <service> | Status bekijken |
systemctl start <service> | Service starten |
systemctl stop <service> | Service stoppen |
systemctl restart <service> | Service herstarten |
systemctl reload <service> | Configuratie opnieuw laden |
systemctl enable <service> | Automatisch starten inschakelen |
systemctl disable <service> | Automatisch starten uitschakelen |
systemctl enable --now <service> | Inschakelen en direct starten |
systemctl is-enabled <service> | Autostart controleren |
systemctl cat <service> | Unit bekijken |
systemctl edit <service> | Override aanpassen |
systemctl daemon-reload | Units opnieuw inladen |
journalctl -u <service> | Service-log bekijken |
systemd-analyze security <service> | Service-hardening analyseren |
๐ท Tulpencraft uitgangspunten
Binnen Tulpencraft gelden voor systemd de volgende uitgangspunten:
- โ๏ธ Alle permanente Minecraft-services worden via systemd beheerd.
- ๐ Services starten automatisch na een reboot.
- ๐ค Minecraft draait niet als root.
- ๐ Onverwachte crashes kunnen automatisch worden herstart.
- ๐ Service-output is via journald beschikbaar.
- ๐ systemd-hardening wordt toegepast waar dit compatibel is met Minecraft.
- ๐ก๏ธ systemd vormt een aanvullende beveiligingslaag naast SELinux en firewalld.
- ๐งช Wijzigingen worden eerst getest voordat ze productie worden.
- ๐ Lokale systemd-aanpassingen worden waar mogelijk via overrides beheerd.
- ๐ Bij problemen wordt eerst de oorzaak onderzocht voordat services blind worden herstart.
๐ Gerelateerde documentatie
๐ Bronnen
De technische basis van deze pagina is gebaseerd op de Rocky Linux-documentatie over systemd, system services en system targets.