Problème : J'ai installé un serveur (via IPKG généralement) et je souhaite qu'il se lance automatiquement au reboot de mon Qnap, et éventuellement qu'il s'auto relance en cas de crash inattendu et même plus, en cas de crash … qu'il me laisse un message dans le log du type : « relaunch process ».
Base pour comprendre :
Que se passe t-il lors du boot au lancement des applications par le Qnap
Le Linux exécute un script nommé rcS_normal (dans /etc/init.d )
Ce script exécute dans l'ordre (çà c'est important )
… TOUS les fichiers commençant par un Snn (nn = numéro) situés dans le répertoire /etc/rcS.d par ordre croissant des nn .
… En fait, ces fichiers sont des liens vers les scripts de /etc/init.d exécuté avec le paramètre start
PUIS
… TOUS les fichiers commençant par QS1nn_______ par ordre croissant des nn (aussi exécuté avec start).
… Ces fichiers QS1nn___ sont crées dynamiquement (par un des scripts Snn___ ) donc juste avant, a partir du contenu du fichier des QPKG ( /etc/config/qpkg.conf ) le chiffre nn étant le rang du QPKG dans le fichier qpkg.conf en commençant par zero (00), CECI a de l'importance, car entre autre le QPKG Optaware (IPKG) est « lancé » via le shell Optware-ipkg.sh sur lequel pointe un lien QS1nnOptware-ipkg (ce nom : Optware-ipkg peut changer en fonction des versions de firmware et des modéles). DONC IPKG est activé APRES exécution de TOUS les Snn_____ .
Qu'a prévu Qnap pour lancer son propre shell ? :
Qnap autorise l'ajout de son (ses) propres scripts a condition qu'ils soient écrit dans une zone de mémoire flash particulière.
Cette zone est /dev/mtdblock5 (TS-x09 X10 X19 Arm) /dev/sdx6 (TS-Intel) (TBC), il faudra donc « monter » cette partition sur un point de montage (répertoire). Pour connaitre "votre" partition, car je n'ai pas tous les modèles de Qnap, le mieux est de rechercher dans le fichier /etc/inbit.d/init_nas.sh la variable : DEV_NAS_CONFIG et chercher quand elle est chargée; attention elle est initialisé puis modifié, ou non, suite à un test sur le modèle de Qnap.
Ceci est fait (lancer votre script) par le script S98init_nas (pointe sur /etc/init.d/init_nas.sh ) qui « monte » la partition dans /tmp/config, recherche le ou les scripts, les exécute. DONC AVANT le lancement des QS1nn______ (donc d'IPKG) .
QUEL SCRIPTS ? :
En fait un seul est très connu et utilisé couramment : autorun.sh MAIS rien ne vous empêche (en plus ou à la place de) d'avoir des shell nommés : K01___.sh (le K01 est obligatoire, ainsi que le .sh entre les deux, c'est comme vous voulez) .
La différence :
autorun.sh … est exécuté en mode direct « /tmp/config/autorun.sh » (donc on attend la fin du shell pour reprendre la main) ce script n'est pas ré exécuté lors de l'arrêt du système.
Les K01xxxx.sh sont exécutés en mode « arrière plan » « /tmp/config/K01xxxx.sh start & » PUIS sont recopiés dans /etc/rcK_init.d pour être rappelés avec le paramètre stop lors de l'arrêt normal du systéme.
Créer ou Modifier les scripts :
Comme indiqué les scripts sont a modifier ou créer dans une des partitions /dev/mtdblock5 ou /dev/sdx6
1) montez la partition :
mount /dev/mtdblock5 /tmp/config
cd /tmp/config
2) éditez le fichier si il n'existe pas il sera crée :
vi autorun.sh
entrez x ou w pour l'écrire q pour quitter vi
Si vous avez déjà les ipkg, préférez vim à vi ... car avec une aide complète et plus de fonctions.
3) modifiez le droit de autorun.sh pour le rendre exécutable
chmod +x autorun.sh
4) N'OUBLIEZ PAS DE DÉMONTER la partition (pour assurer l'écriture physique (sure) des données.) :
cd /tmp
umount /tmp/config
Le principe est le même pour les fichiers K01xxxxx.sh
AUTORUN.SH :
Le mieux est d'utiliser dans ce script l'appel a un autre script extérieur a la mémoire flash, qui pourra être modifié SANS retravailler le fichier autorun.sh
ex. :
[/tmp] # mount /dev/mtdblock5 config [/tmp] # cat config/autorun.sh #!/bin/sh # un seul script /share/HDA_DATA/custom/autorunmaster.sh # fini [/tmp] # umount config
N'OUBLIEZ PAS DE DEMONTER la partition /dev/mtdblock5 ou /dev/sdx6 sous peine de risque d'erreur … .
autorunmaster.sh lançant lui-même les différents scripts souhaités et assurant un log par exemple :
#!/bin/sh # Scriptname automaster.sh # This script is called by autorun.sh which is executed at every startup of the system # (See: http://forum.qnap.com/phpbb2/viewtopic.php?t=1168) # You will find the reboot log at: /share/..._DATA/custom/log/autorun.log # Define Target HDA_DATA or MD0_DATA export TARG=HDA_DATA # Please add your scripts below echo "Lancement des shell personnalises" >> /share/$TARG/custom/log/autorun.log # update proftpd.conf #/share/$TARG/custom/scripts/proftpd.sh echo "start sshd shell /share/$TARG/custom/scripts/sshd.sh " >> /share/$TARG/custom/log/autorun.log /share/$TARG/custom/scripts/sshd.sh echo "Fin de autorunmaster.sh" >> /share/$TARG/custom/log/autorun.log
QUE faire ? puisque autorun.sh s'exécute AVANT le lancement des QS1nn_____ donc entre autre AVANT Optware-ipkg.sh
Solution 1 : lancer un script en « arrière plan » ( & ) et ajouter un délai … bon c'est pas sur …
Solution 2 : lancer le serveur en utilisant un Path complet donc de type /share/HDA_DATA/.qpkg/Optware/..........
Cela marche pour des serveurs simples ne demandant pas un environnement spécifique ou des libraries qui ne seront là qu'APRES le lancement d'Optware ???? par exemple « transmission » (TBC)
Solution 3 : ma préférée … lancer depuis autorun.sh Optware, puis supprimer le lancement automatique fait par le QS100Optware-ipkg
AINSI l'environnement IPKG sera opérationnel AVANT le lancement de vos serveurs installés par ipkg dans /opt
Il faut bien entendu trouver le numéro nn du shell ou positionner Optware en premier dans le fichier qpkg.conf
ex. :
[/tmp] # cat /share/HDA_DATA/custom/autorunmaster.sh #!/bin/sh # Scriptname automaster.sh # This script is called by autorun.sh which is executed at every startup of the system # (See: http://forum.qnap.com/phpbb2/viewtopic.php?t=1168) # You will find the reboot log at: /share/..._DATA/custom/log/autorun.log # Define Target HDA_DATA or MD0_DATA export TARG=HDA_DATA # Please add your scripts below #FIRST start Optawre and delete the /etc/rcS.d/QS100...sh echo `date` >> /share/$TARG/custom/log/autorun.log echo "start autorunmaster commencer par Optware" >> /share/$TARG/custom/log/autorun.log /etc/init.d/Optware-ipkg.sh start # supression du shell de start … automatique rm -f /etc/rcS.d/QS100Optware-ipkg echo "Optawre started" >> /share/$TARG/custom/log/autorun.log echo "Lancement des shell personnalises" >> /share/$TARG/custom/log/autorun.log # # update proftpd.conf #/share/$TARG/custom/scripts/proftpd.sh echo "start sshd shell /share/$TARG/custom/scripts/sshd.sh " >> /share/$TARG/custom/log/autorun.log /share/$TARG/custom/scripts/sshd.sh echo "Fin de autorunmaster.sh" >> /share/$TARG/custom/log/autorun.log
UTILISATION des K01______.sh : A completer … mais sans probléme particulier.
Comment lancer mon serveur comme un serveur surveillé par le Qnap ?
Qnap propose une commande :
/sbin/daemon_mgr nom_donné_au_service start|stop « /path/a/lancer parametres …. »
Que fait cette commande …
elle va lancer le programme entre guillemets
écrire un article dans le fichier /etc/daemon_mgr.conf
assurez une surveillance du programme et le relancer en cas de crash de plus en écrivant un article « relaunch process » dans le journal système.
Extrait du fichier :
[/share/HDA_DATA/.qpkg/Optware] # cat /etc/daemon_mgr.conf DAEMON0 = bcclient, start, /sbin/bcclient DAEMON1 = hotswap, start, /sbin/hotswap & …..[/color] DAEMON19 = sshd, start, /opt/sbin/sshd -f /etc/ssh/sshd_config -p 9922 …..[/color] DAEMON30 = min_snmptrapd, stop, /sbin/min_snmptrapd DAEMON31 = Qthttpd, stop, /usr/local/sbin/Qthttpd
exemple d'utilisation de deamon_mgr dans un script appelé par autorunmaster.sh :
[/share/HDA_DATA/.qpkg/Optware] # cat /share/HDA_DATA/custom/scripts/sshd.sh #!/bin/sh # arret puis relance de sshd TARG=HDA_DATA SSH_PORT=`/sbin/getcfg LOGIN "SSH Port" -d 22` SSH=/usr/sbin/sshd OPENSSH=/opt/sbin/sshd # # STOP sshd echo "Shutting down sshd services:" >>/share/$TARG/custom/log/autorun.log /sbin/daemon_mgr sshd stop $SSH /usr/bin/killall sshd rm -f /var/lock/subsys/sshd # # copy new sshd_config cp /share/$TARG/custom/customized/sshd_config /etc/ssh/ # RESTART sshd if [ `/sbin/getcfg LOGIN "SSH Enable" -u -d TRUE` = FALSE ]; then echo "Starting sshd services: disabled." >>/share/$TARG/custom/log/autorun.log else echo "Starting sshd services: " >>/share/$TARG/custom/log/autorun.log /sbin/daemon_mgr sshd start "$OPENSSH -f /etc/ssh/sshd_config -p $SSH_PORT" touch /var/lock/subsys/sshd fi [/share/HDA_DATA/.qpkg/Optware] #
J'espère que ceci ne vous décourage pas ... j'aurai pu simplement reprendre ce qui est dans le wiki ou une des recettes toute faites des forums, j'ai préféré essayer de vous donner les mécanismes mis en oeuvre ... en cas de problémes, je crois que c'est plus facile, ainsi, de retrouver une erreur.
Philippe.
NB. A relire, compléter, modifier, corriger ....
















