In diesem Howto zeige ich wie man Skripte beim booten und herunterfahren von Linux startet bzw. anhält. Sozusagen "Autostart" von Linux, wenn man so will.
Der Debian"weg"
Debian arbeitet ein bisschen anders als bspw. Red Hat/CentOS. Damit Debian ein Skript beim Bootvorgang starten und später wieder anhalten kann benötigt es innerhalb seines Skriptes, welches ausgeführt werden soll einen Start- und einen Stop-Parameter. Ich zeige hier ein kleines Skript, um zu verstehen wie das gemeint ist. Das Skript muss unbedingt in den Ordner /etc/init.d/ gelegt werden und mit entsprechenden Rechten (755) versehen werden.
#/bin/bash
case "$1" in
start)
hier die Zeilen, die ausgeführt werden sollen für den Start.
;;
stop)
hier die Zeilen, die ausgeführt werden sollen für den Stop.
;;
*)
echo "Bitte $0 start oder $0 stop benutzen."
exit 1
;;
esac
exit 0
Dieses Skript könnte ein Startscript für einen Dienst sein, den man beim booten des Servers oder Workstation ausführen möchte. Es müssen mindestens wie fett hervorgehoben Start und Stop möglich sein.
Das reicht aber so noch nicht ganz aus, denn es fehlt noch ein auskommentierter Teil (der INIT INFOTeil) im Skript (Orange), dass das System erkennt in welchem Runlevel das Skript mit welchen Parametern gestartet bzw. später wieder gestoppt wird.
#!/bin/bash
### BEGIN INIT INFO
# Provides: firewall
# Required-Start:
# Required-Stop:
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: My Firewall Script
# Description: Starts my Firewall Script with super cow forces!
### END INIT INFO
case "$1" in
start)
hier die Zeilen, die ausgeführt werden sollen für den Start.
;;
stop)
hier die Zeilen, die ausgeführt werden sollen für den Stop.
;;
*)
echo "Bitte $0 start oder $0 stop benutzen."
exit 1
;;
esac
exit 0
Der orange markierte Teil ist die INIT INFO. Darin wird festgelegt mit welchem Namen das Script im initd geführt wird, in welchen Runleveln das Skript ausgeführt wird und in welchen Runleveln gestoppt wird. Außerdem kann ich Startparameter mitgeben, falls das Script außer "start" und "stop" noch bestimmte Parameter benötigt.
Danach in der Shell ein update-rc.d firewall defaults ausführen und schon erkennt initd das Firewallscript.
Debian Stretch Besonderheit
Da Debian etwas anders ist, ist die Datei /etc/rc.local möglicherweise nicht vorhanden. Wenn das so ist, dann ist folgender Weg zu beschreiten:
[Unit]
Description=/etc/rc.local
ConditionPathExists=/etc/rc.local
[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99
[Install]
WantedBy=multi-user.target
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
exit 0
chmod +x /etc/rc.local
systemctl enable rc-local
systemctl start rc-local.service
Andere Distributionen
Nehmen wird das Skript von oben noch ein mal. Allerdings ohne INIT-INFO-Zeilen, also beginnend mit case "$1" in ...
Das Skript speichern wir irgendwohin wo es ausgeführt werden soll. Ein Firewallscript könnte bspw. in /etc/firewall/ liegen. Natürlich muss das Script wieder ausführbar sein (755). Danach tragen wir in /etc/rc.local vor "exit 0" das Firewallscript mit absolutem Pfad und dem Parameter "start". Das war es auch schon.
Das könnte dann also wie folgt ausschauen.
#!/bin/sh -e # # rc.local # # This script is executed at the end of each multiuser runlevel. # Make sure that the script will "exit 0" on success or any other # value on error. # # In order to enable or disable this script just change the execution # bits. # # By default this script does nothing.
# Beispiel: /etc/firewall/firewall.sh start exit 0
Autostart mit Systemd
Für ein Systemd lässt sich das auch ganz einfach regeln. Hier gehe ich von einem fertigen Firewall-Script aus, welches in /usr/local/bin/firewall/myfirewall.sh
gespeichert ist und diese Datei ausführbar ist.
Zuerst das Service-Unit anlegen. Dazu bspw. die Datei /etc/systemd/system/myfirewall.service
anlegen und mit folgendem Inhalt füllen:
[Unit]
After=network.target
[Service]
ExecStart=/usr/local/bin/firewall/myfirewall.sh
[Install]
WantedBy=default.target
Danach Systemd "reloaden", den Service "enablen" und dann starten.
systemctl daemon-reload systemctl enablemyfirewall.service
iptables -nvL