Da es einfach zu viele Missverständnisse mit der Optware gibt, habe ich dieses kleine HowTo verfasst, das mit einer "generic" autorun.sh kommt.
Mit dieser autorun.sh ist es möglich alle Optware init.d Script's zu starten und werden später auch via der rcK.d sauber heruntergefahren rcS.d fällt weg, da wir hier alle Dienste direkt starten es würde einfach keinen Sinn ergeben.
Wer diese autorun.sh einsetzt benötigt kein updaten der autorun.sh mehr, wenn ein Dienst hinzugefügt werden sollte. Viel eher sollten immer schön init script's verwendet werden.
Die "generic" autorun.sh funktioniert auf jedem NAS. Greifft auch nur ein, wenn das Optware.qpkg installiert wurde.
autorun.sh:
#!/bin/sh
#Determine optware directory and symlink it to /opt
for optwaredirexists in `ls -d /share/* | grep "_DATA" | sort`
do
#optware was determined
if [ -d ${optwaredirexists%/}/.qpkg/Optware ]; then
OPTWARE=${optwaredirexists%/}/.qpkg/Optware
#optware is already symlinked
if [ -h /opt ]; then
#symlinked but wrong directory
if [ $(readlink "/opt") != ${OPTWARE} ]; then
rm -Rf /opt
ln -sf ${OPTWARE} /opt
fi
#optware is a directory
elif [ -d /opt ]; then
rm -Rf /opt
ln -sf ${OPTWARE} /opt
#optware does not exist
else
ln -sf ${OPTWARE} /opt
fi
fi
done
#execute if OPTWARE was determined
if [ ! -z ${OPTWARE} ]; then
#set environment variables
SET_ENV_VARS="/opt/bin:/opt/sbin:/usr/local/bin:/usr/local/sbin"
export PATH=$PATH:$SET_ENV_VARS
echo "export PATH=$PATH" >> /etc/profile
#load libs if directory exists
if [ -d /opt/lib ]; then
echo "/opt/lib" >> /etc/ld.so.conf
/sbin/ldconfig
fi
#Starting Optware daemons and create shutdown rcK symlink (starting at K200)
#if directory /opt/etc/init.d exists
if [ -d /opt/etc/init.d ]; then
#if directory is not empty
if [ "$(ls -A "/opt/etc/init.d")" ]; then
I=200
for optdaemon in `ls /opt/etc/init.d/S* | grep -v '~' | sort`
do
#execute only if init script is executable
if [ -x ${optdaemon} ]; then
${optdaemon} start
#create symlink in rcK.d to shutdown the daemon
ln -s ${OPTWARE}/etc/init.d/${optdaemon##*/} /etc/rcK.d/K${I}${optdaemon##*/}
I=$(($I+1))
fi
done
fi
fi
fi
Alles anzeigen
Init Script's:
1) Die Init scripts werden unter dem Pfad /opt/etc/init.d erstellt.
2) Init Script's fangen mit einem Grossen S (wie Siegfried) und einer nachfolgenden Zahl an. Ein Beispiel für das Starten von einem openSSH Dienst wäre der Dateiname: S20openssh
3) Init script's müssen ausführbar sein. Wenn ein neues Script erstellt wird ist es nötig, chmod +x Scriptname auszuführen, damit dieses ausführbar ist.
4) Es ist wichtig, dass das init script einen Part zum starten und beenden hat, denn nur so werden diese ordentlich gestartet und beendet.
Hier ein einfacher Aufbau eines init script's, dass beim Booten gestartet und beim Neustarten / Herunterfahren des NAS den Dienst beenden würde. (mit der obigen autorun.sh).
Man könnte generell diese Vorlage verwenden und in den part start() { } und stop() { } kämen die Kommandos des jeweiligen Dienstes rein.
Vorlage eines minimalen init Script's:
#!/bin/sh
start(){ echo "Starting "}
stop(){ echo "Shutting down "}
# you do not need to edit this lines
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
# Restarting the Daemon
$0 stop
$0 start
;;
*)
## If no parameters are given, print which are avaiable.
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
Alles anzeigen
Änderung 7. Juli 2011:
Überprüfen ob das init.d script überhaupt beim Starten und Herunterfahren ausgeführt wird.
Man kann sich beim starten und beenden der eigenen init.d script's auch ausgeben lassen, ob das init.d script überhaupt aufgerufen wird.
Dies machen wir hier via Logeintrag im AdminCP unter Systemprotokolle. Dabei wird nicht geprüft, ob der "Dienst", oder die Veränderungen "funktionieren", sondern lediglich geht es darum zu schauen, ob das init.d script überhaupt ausgeführt wird (start & stop). Das ganze geschieht via dem log_tool.
Wenn man allerdings viele init.d script's hat, kann es irgendwann einfach nur "voll" in den Systemprotokoll werden. Ich empfehle es einfach nur zum testen. Danach könnte man die Zeile /sbin/log_tool..... einfach löschen (so würde wieder ruhe im Systemprotokoll einkehren).
Wenn das NAS beim Starten das init.d script aufruft, es ein "start und stop" gibt, jedoch das was man ausführen möchte nicht ausgeführt wird, dann weiss man schon einmal, dass es am init.d script liegt.
Hier nun die Vorlage:
Vorlage eines init Script's mit "Log" Ausgabe im AdminCP (Starten und Beenden):
Hier müsste die Zeile:
geändert werden. Dafür erscheint dann im AdminCP (unter Systemprotokolle) die Ausgabe "Starting xxxxxx" und "Shutting down xxxxxx".
Ihr beginnt mit euerem Script nach der Zeile: /sbin/log_tool (1x im start und im stop bereich).
#!/bin/sh
NAME="Servicename"
start()
{
echo "Starting ${NAME}"
/sbin/log_tool -a "Starting ${NAME}" -t 0 -u SYSTEM -m LOCAL
}
stop()
{
echo "Shutting down ${NAME}"
/sbin/log_tool -a "Shutting down ${NAME}" -t 0 -u SYSTEM -m LOCAL
}
# you do not need to edit this lines
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
# Restarting the Daemon
$0 stop
$0 start
;;
*)
## If no parameters are given, print which are avaiable.
echo "Usage: $0 {start|stop|restart}"
exit 1
;;
esac
Alles anzeigen
Grüsse, David