Einführung

Seit Arch Linux komplett auf systemd umgestellt hat, gibt es die Datei /etc/rc.local nicht mehr. Will man trotzdem Befehle direkt beim Systemstart ausführen, kann man sich einen systemd Service schreiben.

Service schreiben

Services unter systemd sind viel einfacher aufgebaut, als die Startskripte unter SysVinit.

Die Services (egal ob aktiviert oder nicht), liegen im Verzeichnis /lib/systemd/system/. Dort kann man seine Services erstellen:

$ sudo vi /lib/systemd/system/disablebluetooth.service

Ein simpler Service, welcher ein Befehl ausführt, der im Target multi-user (entspricht etwa dem Runlevel 2 unter SysVinit) geladen wird, sieht so aus:

#########################################################################
#
# disablebluetooth.service
# systemd service: disable bluetooth at start
#
#########################################################################
[Unit]
Description=Disable Bluetooth

[Service]
Type=oneshot
ExecStart=/usr/sbin/rfkill block bluetooth

[Install]
WantedBy=multi-user.target
# EOF

Diese Beispieldatei ist ziemlich selbsterklärend. Beim betreten des Targets multi-user wird der Befehl unter ExecStart ausgeführt.

Wichtig ist, dass man den kompletten Pfad zum Programm/Skript angibt, weil $PATH nicht verfügbar ist. Man könnte jedoch auch bash -c verwenden, damit die Bash $PATH setzt, das braucht aber unnötige Ressourcen.

Sicherheit

Damit nach dem Erstellen des Services nicht andere Benutzer böse Befehle in den Service schreiben können, müssen noch die Berechtigungen passend gesetzt werden:

$ sudo chown root.root /lib/systemd/system/disablebluetooth.service
$ sudo chmod 644 /lib/systemd/system/disablebluetooth.service
$ ls -l /lib/systemd/system/disablebluetooth.service
-rw-r--r-- 1 root root 375 28. Feb 18:37 /lib/systemd/system/disablebluetooth.service

Service aktivieren

Da der Service noch nicht aktiviert ist, muss man dies noch tun:

$ sudo systemctl enable disablebluetooth.service
ln -s '/usr/lib/systemd/system/disablebluetooth.service' '/etc/systemd/system/multi-user.target.wants/disablebluetooth.service'`

Man sieht, dass systemctl einen Symlink im Verzeichnis /etc/systemd/system/multi-user.target.wants anlegt. Dies könnte man auch von Hand mittels ln -s machen.

Service starten

Der Service wird jetzt beim Betreten des Targets multi-user automatisch gestartet. Wer den Service jetzt sofort starten will, kann das so machen:

$ sudo systemctl start disablebluetooth.service