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
Links und weitere Informationen
- Systemd Service Configuration: http://www.freedesktop.org/software/systemd/man/systemd.service.html