Für meine NAS Lösung habe ich ein Raid1, basierend auf btrfs eingesetzt. Services wie Video-Recording und die Bibliotheks-Software speichern dabei ihre Daten auf Mount-Verzeichnisse aus btrfs ab. Leider kam es vor, dass das Mounten der btrfs Verzeichnisse länger dauerte, als das starten der systemd Services. Das führte zur unschönen Situation, dass das System nach einem Reboot im Status “degraded” hängen blieb, weil benötigte Verzeichnisse noch nicht gemountet waren. Folgende Services waren bei mir betroffen:
- /lib/systemd/system/mariadb.service (für shinobi)
- /etc/systemd/system/calibre-server.service (für calibre)
- /etc/systemd/system/cps.service (für calibre)
- /etc/systemd/system/pm2-root.service (für shinobi)
Ich habe das gelöst, indem ich einen eigenes systemd Target definiert habe und besagte Services auf dieses Target, welches nach “multi-user.target” ausgeführt wird, gesetzt habe.
Und so geht das:
Erstelle ein eigenes Target
vi /etc/systemd/system/custom.target
[Unit] Description=My Custom Target - um sicherzustellen, dass caliberdb cps und mariadb ganz am schluss starten Requires=multi-user.target After=multi-user.target AllowIsolate=yes
Betroffene Systemd Services auf custom.target legen
Die betroffenen Services werden nun nach custom.target gelegt. Gleichzeitig habe ich eine “sleep” Phase eingebaut um dem btrfs mount sicher genügend zeit zu geben. Damit triggere ich den Start der Services schön nacheinander.
mariadb.service
vi /lib/systemd/system/mariadb.service
[Unit] ... After=multi-user.target ... [Install] ... WantedBy=custom.target ... [Service] ... # Warte 120s TimeoutStartSec=300 ExecStartPre=/bin/sleep 120 ...
Services neu installieren
sudo systemctl disable mariadb.service sudo systemctl enable mariadb.service
calibre-server.service
vi /etc/systemd/system/calibre-server.service
## startup service [Unit] Description=calibre content server After=multi-user.target [Service] ... TimeoutStartSec=300 ExecStartPre=/bin/sleep 140 ... [Install] WantedBy=custom.target
Services neu installieren
sudo systemctl disable mariadb.service sudo systemctl enable mariadb.service
cps.service
vi /etc/systemd/system/cps.service
[Unit] Description=Calibre-Web After=multi-user.target [Service] ... TimeoutStartSec=300 ExecStartPre=/bin/sleep 160 ... [Install] WantedBy=custom.target
Services neu installieren
sudo systemctl disable mariadb.service sudo systemctl enable mariadb.service
pm2-root.service
vi /etc/systemd/system/pm2-root.service
[Unit] ... After=multi-user.target ... [Install] WantedBy=custom.target [Service] .. TimeoutStartSec=300 ExecStartPre=/bin/sleep 180 ...
Services neu installieren
sudo systemctl disable mariadb.service sudo systemctl enable mariadb.service