[SCRIPT] autorun.sh - Optware Dienste starten und beenden

  • 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:


    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:



    Ä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:

    Code
    NAME="Servicename"


    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).




    Grüsse, David

  • Hi,


    hab das Thema auch mal hier mit in "Scripts und Snippets" verschoben.
    Im prinzip ist das was ich hier oben mache fast das Identische (Technisch) mit deinen, bloss, dass ich dafür nicht extra Pfade anlege, die Optware.sh patche. Das hat den Vorteil, dass es revisionssicher ist, auch wenn man das .qpkg updated.
    Ein rcS benötigt man ja eigentlich nicht wirklich um die Dienste zu starten... und die RCK's werden halt direkt als symlink beim starten angelegt.


    Lassen wir es mal bei 2 Methoden. ;)


    Grüsse, David

  • Nö, warum? $0 ist der Scriptname selbst. Sollte so auf jeden fall funktionieren ;)


    Grüsse, David

  • Als Ergänzung zur Handhabung der "autorun.sh" :


    Im Wiki http://wiki.qnap.com/wiki/Autorun.sh wird erklärt wie man die "autorun.sh" anlegen und bearbeiten kann.


    Mir persönlich ist diese Methode zum öfteren Bearbeiten der "autorun.sh" zu umständlich, da bei mir nicht alles über Scripte eingebunden wird.
    Öftere Änderungen zum Testen und Einbinden anderer Programme sind bei mir nicht selten.


    Dafür nutze ich (weil es bequemer ist) zwei "autorun.sh"!


    Eine im Ramblock angelegt "autorun.sh" wie im Wiki beschrieben mit folgendem Inhalt:


    Bash
    #!/bin/sh
    #sym-link /opt to /opt
        rm -rf /opt
        ln -sf /share/MD0_DATA/.qpkg/Optware /opt
    
    
    # Start /opt/autorun.sh
      /opt/autorun.sh


    und eine zweite "autorun.sh" unter /opt !
    In dieser zweiten "autorun.sh" stehen dann die Aufrufe für Scripte oder zusätzlich einzubindener Module!


    Der Vorteil:
    Nie wieder den Ramblock mounten, autorun.sh bearbeiten und dann unmount!
    Jederzeit schnelles anpassen der /opt/autorun.sh über Winscp, Putty od. ähnlich möglich!
    Man kann jederzeit mal schnell nachschauen was man in der "autorun.sh" verbockt hat, mal schnell etwas bei Bedarf auskommentieren, ect.


    Und funzt genau so zuverlässig wie mit nur einer "autorun.sh"!!


    vg kasimodo

  • Hi,


    da hast Du etwas falsch verstanden.... So oder so musst Du die autorun.sh 1x editieren.
    Mit der obigen autorun.sh entfällt das nachträgliche editieren der autorun.sh.
    Es gibt wirklich definitiv keinen Grund mehr an dieser etwas zu ändern. ;)


    Eine zweite würde keinen sinn ergeben, da man alles via init scripts starten kann und falls man bei "stop" etwas hinzufügt, dann werden diese auch beim neustarten, herunterfahren ordentlich beendet.


    Darum geht es in diesem Thread auch... ;) Du kannst auch mit obigen alles via winSCP oder so editieren... Lese lieber noch einmal drüber, was da oben eigentlich gemacht wird... ;)



    Grüsse, David

  • HALT !! STOP!! :mrgreen:


    David, da hast du mich bzw. meinen Beitrag falsch verstanden!!! :love:


    Ich habe das mit deinem Script und dem Sinn schon gecheckt.
    TOP! :thumb:
    Auch habe ich selbst eine ähnliche Form davon benutzt!!


    Aber als "Bastler" da versuche ich mich immer wieder mal an den unterschiedlichsten Dingen.
    Da gibt es dann mit der Zeit eine Menge StartScripte im Verzeichnis, von denen ich dann doch nur einen Teil starten möchte.
    Auch ist der Teil in der autorun.sh zwischen dem Erstellen Symlink auf /opt und Start der Scripte bei mir noch umfangreicher und da ändere ich öfter mal etwas. (neue Kernelmodule, IPForward und so)
    Dafür ist dann die von mir beschriebenen Variante mit einer zweiten autorun.sh (für mich) schnell + einfacher zu handhaben.


    Für "nicht Bastler" -> keine Frage, da ist deine Variante optimal!


    vg kasimodo

  • Jipp, da haben wir einen wurm drinnen ^^
    Oder Du machst Dir ein init script, dass S1autorun heisst :mrgreen: Wäre das identische ^^ Oder lädst deine Kernelmodule via init script...
    Kannst ja alles so machen wie bisher. ;)


    Whatever. Käme auf das gleiche drauf aus ;)


    Grüsse, David

  • Hallo


    ich hab ein qnap 109 und möchte ushare bei einem reboot automatisch starten lassen.


    ich bin linux noob :)


    autorun.sh wie folgt geändert:



    unter /opt/etc/init.d


    meine S99ushare init schaut wie folgt aus:



    leider startet ushare nicht automatisch :(


    was mach ich falsch ?

  • Hi,


    lasse mal die autorun.sh so wie oben beschrieben.
    Die macht schon alles für Dich ;) Daran müsstest Du nie wieder Hand anlegen.


    Also nehme die von da oben (1.Post noch einmal:)
    http://forum.qnapclub.de/viewtopic.php?f=208&t=14277#p78297


    #########################


    Zu deinen Init script:
    Du braucht nur 1x was zum starten und 1x was zum beenden.
    2 Zeilen, die wir vom obigen Init script hinzufügen

    Code
    /opt/bin/ushare --cfg=/opt/etc/ushare.conf --daemon

    (zum starten)
    und weil es kein "wirklichen" shutdown des Dienstes ushare gibt, wird der via killall abgeschlossen:

    Code
    killall ushare


    So die beiden Zeilen ergänzt Du. Und dann sieht das so aus:


    Wie gesagt, an der autorun brauchst Du nix mehr zu ändern. ;)
    Und dann kannst Du mal schauen, ob der Dienst startet, wenn Du in Deinem Falle:

    Code
    /opt/etc/init.d/S99ushare start


    auf der Konsole eingibst und zum stoppen halt:

    Code
    /opt/etc/init.d/S99ushare stop


    Grüsse, David

  • Wie startest Du es dann manuell ?


    Das was im Start drinnen steht:
    /opt/bin/ushare --cfg=/opt/etc/ushare.conf --daemon
    Müsste man natürlich auch so starten können ;)

  • vorweg ich bin linux noob


    also optware läuft schon bei einem reboot.


    vorher hab ich den dienst manuell mit

    Zitat

    /opt/etc/init.d/S99ushare start

    gestartet.


    mein ziel war es bei einem reboot das dieser dienst automatisch startet

  • Hallo David,


    habe mal paar Verständnisfragen:


    Die Ordner init.d und rcK.d sind auf meinem NAS unter /opt/etc nicht vorhanden. Diese beiden somit von Hand anlegen, oder?
    Soweit ich dein Script verstehe, so werden die Init Script's damit automatisch beim hochfahren gestartet und gleichzeitig in den Ordner rcK.d ein Symlink zum stoppen angelegt.
    Aber woher weiß das NAS dann, dass es beim runterfahren in diesen Ordner schauen soll und die stop Befehle mit den Scripts ausführen soll?

  • Zitat

    Die Ordner init.d und rcK.d sind auf meinem NAS unter /opt/etc nicht vorhanden.


    Richtig. Es wird nur der Pfad /opt/etc/init.d benötigt.
    Einige Dienste aus der optware kommen schon direkt mit init.d script's. z.B. openvpn.
    Dabei wird dann auch der Pfad /opt/etc/init.d erstellt.
    Hat man jetzt aus der Optware einen Dienst / oder möchte etwas starten was nicht mit einem init.d script kommt, so kann man den Pfad /opt/etc/init.d und das Init Script anhand der Vorlage (kiss keep it small and simple) erstellen.
    Das rcK.d und rcS.d Verzeichnis wird nicht benötigt.


    Zitat

    Diese beiden somit von Hand anlegen, oder?


    Nein. Wird nicht benötigt. ;) (rcK.d und rcS.d Verzeichnis wird nicht benötigt.)
    Nur eben den /opt/etc/init.d Pfad.


    Zitat

    Aber woher weiß das NAS dann, dass es beim runterfahren in diesen Ordner schauen soll und die stop Befehle mit den Scripts ausführen soll?


    Die autorun.sh startet Dir alles was im /opt/etc/init.d/ liegt (und halt mit einem S anfängt).
    Wenn ein Init Script gestartet wird, dann wird auch direkt ein Symlink zu für den Systemeigenen Shutdown erstellt.
    Das heisst, alle Init Scripts in /opt/etc/init.d/S* werden gestartet und ein Symlink für den Shutdown in /etc/rcK.d/ erstellt.
    Damit sich da auch nix überschneidet wird der Symlink in /etc/rcK.d/ mit den Prefix K(zahl)(scriptname) erstellt.
    Somit benötigt man deshalb nix anderes ausser das init.d script. Die autorun macht den rest.


    Im "Realen leben" (ohne Optware) liegen alle init.d Script's auch nur im init.d und es wird lediglich von den Pfaden etc/rcK.d/ und etc/rcS.d/ auf die init.d script's gesymlinkt. Diese Script's werden dann auch nur mit den Parameter start|stop aufgerufen. Hier würde halt der Start etc/rcS.d/ wegfallen, da wir alles mit schon in der autorun.sh verarbeiten. (scriptname start) und für den shutdown wird halt ein symlink angelegt, der vom NAs dann mit (scriptname stop) ausgeführt wird.


    Ebendrum: keep it small and simple (dann verwirrt's auch nicht)
    Im Englischen Forum haben auch schon so einige die autorun.sh laufen :mrgreen:


    Grüsse, David

  • So.


    Ich habe noch einen kleinen Bug in der autorun.sh gefunden und im 1. Post korrigiert und dazu noch ein paar "Schönheitskorrekturen" vorgenommen.
    http://forum.qnapclub.de/viewtopic.php?f=208&t=14277#p78297


    Ändern tut sich also nix, ausser dass es jetzt auf allen NAS funktioniert ;)
    aval_anche: Das könnte auch Dein Problem gewesen sein. Es kam vor, dass /opt schon symlinked oder nicht symlinked war und /opt einfach ein "default" path war. Jetzt sollte es funktionieren. ;)


    Grüsse, David

  • Hi, also ich dreh noch mal durch mit diesen autostarts. Ich kapier es einfach nicht. Nachdem du mir ja im anderen Thread (http://forum.qnapclub.de/viewtopic.php?f=33&t=15056) den Tipp mit dieser autostart.sh gegeben hast, wollte ich es doch noch mal ausprobieren. Aber es klappt einfach nicht. Das dubiose ist, wenn ich die autostart.sh gemountet lasse und in /tmp/config mit ./autostart.sh die Datei teste, wird Pyload gestartet. Um jeden Fehler, den ich gemacht haben könnte auszuschließen, hier mal wie ich vorgegangen bin:


    Gemountet (TS-210):
    mount -t ext2 /dev/mtdblock5 /tmp/config


    autorun.sh zum editieren geöffnet:
    vi /tmp/config/autorun.sh


    Dein Script von Seite 1 eingetragen:

    Bash
    #!/bin/sh#Determine Optware Directory and Symlink it to /opt if /opt does not existsfor optwaredirexists in /share/HDA_DATA /share/HDB_DATA /share/HDC_DATA /share/HDD_DATA /share/HDE_DATA /share/HDF_DATA /share/HDG_DATA /share/HDH_DATA /share/MD0_DATA /share/MD1_DATA /share/MD2_DATA /share/MD3_DATA; do  if [ -d $optwaredirexists/.qpkg/Optware ]; then    OPTWARE=$optwaredirexists/.qpkg/Optware    #check if optware is already symlinked    if [ ! -h /opt ]; then      #if not but determined delete /opt if exist and symlink to optware      if [ -d /opt ]; then        rm -rf /opt      fi      ln -sf $OPTWARE /opt    fi  fidone#execute if OPTWARE was determinedif [ ! -z $OPTWARE ]; then  #set environment variables  echo "export PATH=$PATH:/opt/bin:/opt/sbin:/usr/local/sbin" >> /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  fifi


    Ausführbar gemacht:
    chmod +x /tmp/config/autorun.sh


    Unmountet:
    umount /tmp/config



    Dann ins init.d Verzeichnis gewechselt:
    cd /opt/etc/init.d


    S20pyload.sh erstellt:
    nano S20pyload.sh


    Dein Script eingetragen:


    Ausführbar gemacht:
    chmod +x /opt/etc/init.d/S20pyload.sh



    Warum funktioniert das nicht???? :( Ich verzweifel hier echt noch :(


    Wie gesagt, ich habe dann noch mal die autostart.sh gemountet:


    mount -t ext2 /dev/mtdblock5 /tmp/config


    Bin ins Verzeichnis
    cd /tmp/config


    und habe die autostart.sh von Hand ausgeführt:
    ./autostart.sh


    und dann startet Pyload. Also stimmt doch alles mit den Scripts? Aber warum startet Pyload nicht nach einem Neustart von QNAP?


    Bitte helft mir, ich dreh hier noch durch.
    Danke


  • hi Terz,


    ja mit der änderung läuft es perfekt. ushare startet endlich automatisch :)


    mfg


    aval_anche