---
title:  "Systemd ctl-applicaties"
excerpt: "Systemd is een fantastisch grote tool en biedt heel wat tooling. Daarbij ook verschillende ctl-applicaties die helpen bij de dagdagelijkse taken."
coverImage: "/Systemd/cover_systemd.png"
date:   "2023-07-28T23:00:00.000Z"
author: Eli Winderickx
hero_image: /cover_systemd.png
category: Systemd,Linux,Expert Tip
---
## Systemd
Systemd is al even oud en heeft al veel negatieve commentaar moeten lijden onder de Linux gemeenschappen. Voornamelijk omdat systemd zich diep in het systeem nestelt en in héél veel onderdelen betrokken is. Ik zet hier graag een aantal tools op een rij!

## Systemctl
Dit moet de bekendste tool zijn. Ongetwijfeld is dit ook de meestgebruikte tool. Voornamelijk is dit de tool die systemd gebruikt om bij opstart er voor te zorgen dat de juiste target bereikt wordt.

### Targets
Die targets zijn vergelijkbaar met de init-niveau's maar bieden ook wat extra mogelijkheden. Hier enkele belangrijke om te onthouden:
- graphical: (default) Deze zal een grafisch login venster laten zien
- multi-user: Alles behalve de grafische interface wordt geladen
- emergency: Dit is een heel beperkte omgeving waar niet veel ingeladen wordt; zelfs geen systemd!
- rescue: Vergelijkbaar met emergency maar hier laten we wel al systemd in

Je kan het eenvoudigste naar deze modus gaan via het GRUB opstart menu. Druk hier op `e` om een geselecteerde kernel tijdelijk te wijzigen. Op de `Linux` regel ga je helemaal achteraan nog een beetje toevoegen; `systemd.unit=<target>.target`

### Services
De targets zoals we hierboven al vermeldde zijn afhankelijk van services en sockets die een bepaalde status bereiken. De Services worden in een systeembeheerder rol vaak gebruikt. Hier nog enkele interessante opties om jouw kennis te verbreden:  
```bash
# Lijst all unit files op
systemctl list-unit-fils -at service
# Bekijk het service bestand
systemctl cat <service>
# Krijg in 1 woord terug of een service actief of enabled is
systemctl is-active <service>
systemctl is-enabled <service>
# Vraag alle services op die degraded zijn
systemctl status --state=degraded
```

### Mount
Jawel, ook mounts kunnen gebeuren met systemd. Alles staat omschreven in `/etc/fstab` maar dat wordt allemaal vertaalt door systemd naar mount files om dan door systemd ook gemount te worden. Het kan dus interessant zijn om ook te weten hoe dat in z'n werk gaat. Zoals je hieronder merkt, ga je exact dezelfde items terugvinden als in `/etc/fstab`. Naast het `.mount` bestand is er ook een `.automount` nodig als die map automatisch gemount moet worden.

Hier een `voorbeeld.mount`
```
[Unit]
Description=Test map (/tmp_dir)
DefaultDependencies=no
Conflicts=umount.target
Before=local-fs.target umount.target
After=swap.target

[Mount]
What=/dev/disk/by-uuid/<uid>
Where=/tmp_dir
Type=ext4
Options=defaults

[Install]
WantedBy=multi-user.target
```

Met bijhorende `voorbeeld.automount`
```
[Unit]
Description=Voorbeeld automount partition
ConditionPathExists=/tmp_dir

[Automount]
Where=/tmp_dir
TimeoutIdleSec=10

[Install]
WantedBy=multi-user.target
```

### Timers
Alhoewel Cron heel goed werkt, biedt Systemd ook timers aan. Deze brengen een kleine leercurve mee maar daarnaast werken deze ook wel degelijk en kunnen deze per timer eenvoudig gedeactiveerd worden. Een ander groot voordeel is dat je een timer afhankelijk kan maken van andere timers of services en zo een complexere setup kan bereiken.

De grote vereiste is dat er een service file met dezelfde naam als de timer moet bestaan om aan te spreken.{lees: uit te voeren} Daarnaast kan je dan een `.timer`-bestand aanmaken in `/etc/systemd/system/` op systeem niveau ofwel in `$HOME/.config/systemd/user/`.

Voorbeeld service file; `foo.service`
```
[Unit]
Description=Dummy service foo die een script uitvoert om een programma in de achtergrond uit te voeren.

[Service]
ExecStart=/opt/foo/start.sh

[Install]
WantedBy=graphical.target
```

Voorbeeld timer file; `foo.timer`
```
[Unit]
Description=Voer wekelijks uit EN meteen na boot

[Timer]
OnBootSec=15min
OnUnitActiveSec=1w

[Install]
WantedBy=timers.target
```

In de plaats van hier de service manueel te starten en te activeren, gaan we dat nu voor de timer doen. Die heeft namelijk de info wat en wanneer uitgevoerd moet worden.

```
systemctl enable --now foo.timer
```

### Nog veel meer
Er zijn nog zaken die Systemd beheert en ook hiervoor bestaan unit files. Hier lijst ik ze even kort op. 
- Socket: Inter proces communicatie socket
- Device: Toestellen die herkend worden door de kernel
- Scope: Processen die extern aangemaakt zijn geweest
- Slice: Een hiërarchische groepering van units die systeemprocessen beheren
- Path: Een pad naar een bestand of map in het filesysteem
- Swap: Unit file voor een swap device


## Hostnamectl
Verschillende Linux gebruikers passen hun hostnaam aan via `/etc/hostname`. Dat werkt maar vereist steeds een reboot om volledig door te voeren. Alhoewel een reboot zeker altijd aan te raden is, kan je met deze tool je hostnaam veranderen zonder die reboot.
```bash
# Geef hostname weer
hostnamectl
# Stel een nieuwe hostname in
hostnamectl hostname <Nieuwe naam>
# Stel een locatie is. Dit heeft niets met timedate te maken
hostnamectl location <locatie>
```

## Timedatectl
Nog een minder gekende tools is `timedatectl`. Deze, je raadt het nooit, kan je helpen om tijd, datum en tijdzone in te stellen. Hiernaast kan je ook NTP servers instellen. Deze is eenvoudig in werking en leuk om te weten. 
```bash
# Vraag alle beschikbare tijdzones op
timedatectl list-timezones
# Stel daarna de juiste in
timedatectl set-timezone <time/zone>
# Datum en tijd instellen
timedatectl set-time 'YYYY-MM-DD hh:mm:ss'
# Stel een NTP-server in
timedatectl ntp-servers <interface> <server>
# Activeer NTP service
timedatectl set-ntp true
```

## Localectl
Een laatste tool is `localectl`. Toch wel een onmisbare tool als je niet de standaard locale of keyboard settings gebruikt. Hier een paar voorbeelden voor mijn voorkeuren. 
```bash
# Lijst alle beschikbare locales op
localectl list-locales
# Stel de gewenste locale in
localectl set-locale en-US.UTF8
# lijst beschikbare keyboard layouts op
localectl list-keymaps
# Stel de gewenste keymap in
localectl set-keymap dvorak-intl
```

> Als je trouwens een locale ontbreekt kan je die installeren via DNF. Hiermee haal je  een lijst op van de beschikbare locales; `dnf search glibc-langpack-*`
