SysV-Initscript in SystemD-Unit umwandeln
Systemd wandelt bestehende SysV-Initskripte beim Boot oder Reload des SystemD-Daemons automatisch in temporäre SystemdD-Units um. Dieses Verhalten ist jedoch „abgekündigt“ und wird in einer noch unbestimmten Zukunft entfernt werden.
Sofern man selbst solche SysV-Initscripte in /etc/init.d und gegebenenfalls auch Start- und Stop-Links in /etc/rc2.d angelegt hat, soll diese Anleitung ein Leitfaden zur Umwandlung in eine SystemD-Unit sein.
Bitte nicht auf SysV-Initskripte anwenden, die von eisfair-Paketen stammen, z. B. mail, redis, mini_httpd, …!
Als Beispiel nehmen wir mal an, dass
- das SysV-Initskript boot.local,
- und eventuell angelegte Start- und Stop-Links S99boot.local und K01boot.local heißen.
boot.local war ein früher von eisfair vorgehaltenes SysV-Initskript, in welchem Anwender ihre eigenen Startbefehle eintragen konnten. Sofern sie nicht genutzt wurde, also dem Originalzustand entsprach, wurde sie mit Umstellung auf SystemD automatisch entfernt.
Zunächst legen wir ein Verzeichnis an, in den das SysV-Initskript verschoben wird:
# mkdir -p /var/libexec/boot-local
Anschliessend wird das SysV-Initskript gestoppt und disabled:
# service stop boot-local # service disable boot-local
Nun entfernen wir die Start- und Stop-Links, wobei der Start-Link in der Regel schon von service disable entfernt worden sein sollte:
# rm -f /etc/rc2.d/S99boot-local # rm -f /etc/rc2.d/K01boot-local
Das SysV-Initskript verschieben wir in das zu Anfang erstellte Verzeichnis, dabei ist die Umbenennung von boot.local in boot-local ist Absicht, damit namentlich eine Verbindung zur noch zu erstellenden SystemD-Service-Datei besteht und SystemD-Service-Dateien üblicherweise „-“ als Trenner im Dateinamen verwenden:
# mv /etc/init.d/boot.local /usr/libexec/boot-local/boot-local
Soll ein SysV-Initskript namens myboot umgewandelt werden, ist nicht intendiert, für dieses ein eigenes Unterverzeichnis in /usr/libexec anzulegen. Der Vorschlag /usr/libexec/boot-local soll als Ort für alle umzuwandelnden SysV-Initskripte dienen. Für das Beispiel boot.local ergibt sich hier scheinbar einen Namensdopplung. Für myboot wäre der move-Befehl demzufolge:
# mv /etc/init.d/myboot /usr/libexec/boot-local/myboot
Nun führen wir einen Reload des SystemD-Daemons durch:
# service daemon-reload
In /etc/systemd/system erstellen wir die Datei boot-local.service mit etwa folgendem Inhalt:
[Unit] Description=boot-local service After=multi-user.target [Service] Type=oneshot ExecStart=/usr/libexec/boot-local/boot-local start ExecStop=/usr/libexec/boot-local/boot-local stop RemainAfterExit=yes [Install] WantedBy=multi-user.target
Hinweis: Wer einen Editor benutzt, der bei Änderungen einer Datei eine Backup-Datei im gleichen Verzeichnis erstellt, sollte diese unbedingt entfernen, damit der Service nicht doppelt gestartet wird.
Diese SystemD-Service-Datei kann den eigenen Anforderungen angepasst werden. Insbesondere sind hierbei die Optionen:
- After: An welcher Stelle des Bootprozesses soll die Unit gestartet werden.
- Type: oneshot ist insbesondere empfehlenswert, wenn z. B. beim Boot etwas aufgeräumt oder ein Befehl ausgeführt, aber kein Dienst/Daemon gestartet werden soll.
- RemainAfterExit: Eher sinnvoll beim Type oneshot
gemeint.
Nun führen wir erneut einen Reload des SystemD-Daemons durch:
# service daemon-reload
Damit die neu erstellte SystemD-Unit auch beim nächsten Boot ausgeführt wird, ist diese nun zu enablen
# service enable boot-local.service
und gegebenenfalls neu zu starten:
# service start boot-local.service
Die Möglichkeiten von Unit-Files sind sehr vielfältig. Eine Suche im Netz nach „systemd unit files“ liefert zahlreiche Informationen wie z.B. https://wiki.ubuntuusers.de/systemd/Units/.