09 septembre 2011

optWare sur QNAP


J’utilise un QNAP TS259 comme serveur de fichiers dans mon réseau perso. La force et la faiblesse du système de QNAP c’est que beaucoup de choses sont restaurées dans leur état de base à chaque reboot à partir d'une mémoire flash. Ceci protège contre de fausses manips mais rend difficile toute configuration personnelle. Il existe des méthodes pour que ces modifs persistent d’un reboot à l’autre. Mais aucune n'est totalement efficace en cas de mise à jour du firmware.

optWare est un system de gestion de packages adapté aux systèmes Linux embarqués. Il peut être installé par l’intermédiaire d'un package standard (QPKG) de Qnap.Une fois le package optWare installé, on peut utiliser en ligne de commande ipkg pour accéder à plus d’un millier de logiciels compilés pour Intel ou ARM (suivant le type de QNAP) et qui fonctionnent entièrement dans /opt (binaire, config, librairies ect). Tout l’intérêt c’est que le contenu de /opt n’est modifié n’y au reboot n’y à l’occasion d’une mise à jour du firmware.

Le seul problème à résoudre est comment lancer à chaque boot du QNAP les daemons installés via ipkg de optWare (bind, openssh, ect) ? Heureusement QNAP propose un ‘hook’ nommé autorun.sh Dans sa procedure de boot le Qnap appelle ce script. A vous d'y faire ce qui vous arrange.

Voici la procédure pour le mettre en place de la manière la plus simple et la plus efficace possible.

1) A faire une seule fois

ATTENTION
  1. suivant la configuration disque et le modèle de votre QNAP, ce qui chez moi s'appelle MD0_DATA peut, par exemple, s’appeler HDA_DATA chez vous. A vous de trouver l'équivalent et d’adapter ce qui suit. 
  2. De même ce qui chez moi s’appelle /dev/sdx6 sur mon Qnap peut s’appeler /dev/mtdblock5 sur le votre.
Créer un répertoire
mkdir /share/MD0_DATA/.qpkg/autorun
Entrer dans ce répertoire
cd /share/MD0_DATA/.qpkg/autorun
Créer les 3 scripts shell : autorun.sh run.sh et restore_autorun.sh

Le script autorun.sh
#!/bin/sh 
RUN=/share/MD0_DATA/.qpkg/autorun/run.sh 
[ -x $RUN ] && $RUN
Le script run.sh
#!/bin/sh

RUNDIR="$( cd -P "$( dirname "$0" )" && pwd )"
echo "RUN: " `date` >> $RUNDIR/log.txt

#Start all optWare packages
for i in /opt/etc/init.d/S??* ;do              

     case "$i" in
        *.sh)
            # Source shell script for speed.
            (
                trap - INT QUIT TSTP
                set start 
                . $i
            )
            ;;
        *)
            # No sh extension, so fork subprocess.
            [ -f $i ] && $i start
            ;;
    esac
done
Le script restore_autorun.sh
#!/bin/sh
cd /
mount /dev/sdx6 /tmp/config
cp /share/MD0_DATA/.qpkg/autorun/autorun.sh  /tmp/config/autorun.sh
ls -l  /tmp/config
umount /tmp/config
Rendre les 3 scripts exécutables
chmod +x *.sh

2) A faire la première fois et après chaque changement de firmware

Exécuter cette commande depuis la ligne de commande du Qnap:
/share/MD0_DATA/.qpkg/autorun/restore_autorun.sh
Ceci va copier dans la mémoire flash (dans mon cas /dev/sdx6) le fichier autoruns.sh qui sera appeler à chaque boot.
Ce fichier a pour rôle d'appeler notre run.sh qui effectue le véritable travail.

Pourquoi ne pas tout mettre dans autorun.sh ?
- La place dans la mémoire flash est limité.
- L’accès à la mémoire flash n'est pas immédiat. Il faut d’abord la monter. Ce qui rend l’édition du fichier autoruns.sh pas pratique.

3) Adapter run.sh à vos besoins

Éditez directement le script "/share/HDA_DATA/.qpkg/autorun/run.sh" pour démarrer, initialiser ce qu’il vous plaira.
La version présenté ci-dessus démarre tous les daemons installés par optWare et qui ont un script de démarrage dans /opt/etc/init.d (Tous les packages de optWare ne mettent pas leut script de démarrage là : Lire la doc !)