Articles avec le tag ‘Debian’

vcgencmd sur un Raspberry Pi avec une image Debian auto-fabriquée

J’ai acheté il y a quelque temps déjà un Rasperry Pi sur lequel j’ai mis une Debian Wheezy « standard » – comprenez « pas une Raspbian ». Pour cela j’ai suivi l’excellent tuto de Hödlmoser : http://blog.kmp.or.at/2012/05/build-your-own-raspberry-pi-image/
Mais ce n’est pas le sujet de ce post :)

Raspi_Colour_R.resized

 

Un outil permettant d’accéder à un bon nombre de paramètre du firmware du Raspberry existe : il s’agit de vcgencmd.
Dans mon cas, je voulais m’en servir pour récupérer la température interne du Raspberry, fournie par un capteur intégré au CPU.

 

Je suis tombé sur les problèmes suivant :
vcgencmd n’était pas connu dans mon PATH. Bon ce n’est pas très grave, il suffit de l’appeler avec son chemin complet : /opt/vc/bin/vcgencmd, ou mieux, d’ajouter /opt/vc/bin au PATH. J’ai choisi de carrément ajouter /opt/vc/bin dans le PATH créé dans le fichier /etc/profile, qui sert de « PATH de base ».

problème de librairie partagée non trouvée :

root@raspberrypi:~# /opt/vc/bin/vcgencmd
/opt/vc/bin/vcgencmd: error while loading shared libraries: libvcos.so: cannot open shared object file: No such file or directory

IL y a deux solutions à ce problème. Choisissez celle que vous préférez, inutile d’appliquer les deux.

La première solution (qui est plutôt une solution de contournement) que j’ai mise en oeuvre est de créer le script suivant dans /usr/local/bin (mais vous pouvez le placer dans n’importe quel dossier, pourvu qu’il soit dans votre PATH) :

#!/bin/sh
LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/vc/lib
export LD_LIBRARY_PATH
exec /opt/vc/bin/vcgencmd $@

Ce script positionne correctement la variable LD_LIBRARY_PATH pour lancer l’utilitaire vcgencmd. Le fait de placer ce script dans un dossier de votre PATH corrigera aussi le premier problème qui était que vcgencmd n’était pas connu dans le PATH.

La deuxième solution est d’ajouter la librairie manquante aux « PATH des librairies partagées système » de Linux.
Pour cela, créez un fichier dans /etc/ld.so.conf.d/. Le nom du fichier doit finir par .conf (vcgen.conf par exemple).
Dans ce fichier, il n’y a qu’une ligne à mettre :

/opt/vc/lib

Passez la commande ldconfig pour appliquer les changements.
Le dossier /opt/vc/lib/ est maintenant utilisé pour la recherche des librairies partagées et la librairie manquante, libvcos.so, sera trouvée.
Il faut tout de même ajouter /opt/vc/bin/ à votre PATH ou bien créer un script (ou un lien) dans un dossier de votre PATH pour lancer la commander vcgencmd sans avoir à écrire tout le chemin.

 

L’avantage de la 1ère solution est que le dossier /opt/vc/lib ne sera scruté que lorsque vous lancerez la commande vcgencmd (via le script). L’inconvénient c’est que c’est un peu brouillon, et que vous risquez de retomber sur le même problème pour un autre programme qui aurait besoin de cette librairie partagée, ou bien d’une autre librairie partagée contenue dans /opt/vc/lib.
Pour la 2ème solution c’est l’inverse : elle est plus universelle car toutes les librairies partagées de /opt/vc/lib seront scrutées pour tous les programmes. L’inconvénient est que du coup, il y a une petite perte de performances. C’est négligeable lorsque l’on ajoute seulement un dossier qui contient quelques librairies partagées comme ici, mais ajouter de nombreux dossiers, contenant chacun de nombreuses librairies, peut affecter les performances du système puisque ce dernier va scruter toutes les librairies partagées indiquées (jusqu’à trouver la bonne) quand il devra chercher une librairie partagée.

 

Au final, j’ai choisi :
– d’ajouter /opt/vc/bin/ au « PATH de base » créé dans /etc/profile
– la 2ème solution pour le problème de la librairie partagée manquante

 

PS : quand même, un petit exemple d’utilisation de vcgencmd pour récupérer la température interne du Raspberry :

root@raspberrypi:~# vcgencmd measure_temp
temp=56.8'C

 
 

Liens utiles :
– A propos de LD_LIBRARY_PATH : http://www.cc.dtu.dk/?page_id=304
– Ajouter des librairies partagées à Linux : http://blog.andrewbeacock.com/2007/10/how-to-add-shared-libraries-to-linuxs.html
– A propos de vcgencmd : http://elinux.org/RPI_vcgencmd_usage
– Pour créer sa propre image Debian pour son Raspberry : http://blog.kmp.or.at/2012/05/build-your-own-raspberry-pi-image/

NAS Synology: Debian en chroot, apache et mysql

Le système d’exploitation embarqué dans les NAS Synology, le DSM, est un système plutôt sympathique à utiliser, et qui permet de s’éviter des heures de configuration. Activer un serveur ftp en 2 clics est assez appréciable.

Quand on veut aller plus loin, avoir une configuration apache particulière, utiliser screen + irssi, et toutes ces choses qui ne sont pas prévus par le fabriquant, cela devient plus compliqué. Même si obtenir un accès SSH root est très facile, on tombe sur des consoles qui ne sont pas en UTF-8, avec un busybox énervant, un système de paquet obsolète avec un choix limité. Et surtout, on risque de casser le système en bidouillant la configuration, qui est assez tentaculaire, et régénérée en partie à chaque changement dans l’interface.

Il y a une solution que je trouve assez élégante à ce problème, c’est d’installer une Debian en parallèle du système de base, grâce à debootstrap et un chroot. Dit comme ça, ça a l’air bien compliqué, mais en réalité, c’est plus simple et moins risqué que de triturer le DSM, avec en bonus, toute la puissance de Debian. Le principe est que nous allons ’embarquer’ une Debian sur le NAS, qui va tourner dans un compartiment restreint, le chroot. Nous aurons donc les deux systèmes qui tournent en parallèle, les deux faisant des appels au même noyaux, celui du DSM.

Mise en place de Debian

Il va nous falloir une Debian qui tourne quelque part pour générer un système de base. Si vous n’en avez pas, vous pouvez l’installer dans une machine virtuelle le temps de faire la manip (Debian net-install et Virtualbox font très bien l’affaire). Un fois ceci fait, on va utiliser debootstrap de nous générer une archive minimale pour notre architecture cible, l’ARM :

sudo apt-get install debootstrap
mkdir sdebian
sudo debootstrap --foreign --arch armel squeeze sdebian
sudo tar -cvzfp sdebian.tar.gz sdebian

Transférez l’archive obtenue sur votre NAS, placez la dans /volume1/, connectez vous au NAS grâce à telnet et désarchivez la :

tar -xvzfp sdebian.tar.gz

Mise en place du chroot

Debian aura besoin de faire des appels au noyau linux du DSM. Nous allons donc rendre accessible dans le chroot les répertoires spéciaux comme /proc, /dev …

On va utiliser un petit script shell qui va nous permettre de faire les quelques opérations nécessaires et d’entrer dans le chroot. Éditez un fichier chroot.sh, et copiez y les commandes suivantes:

CHROOT=/volume1/sdebian
mount -o bind /dev $CHROOT/dev
mount -o bind /proc $CHROOT/proc
mount -o bind /dev/pts $CHROOT/dev/pts
mount -o bind /sys $CHROOT/sys

cp /etc/resolv.conf $CHROOT/etc/resolv.conf

# Si installation d'un apache sur le port 80 dans Debian,
# voir la suite de l'article
# /usr/syno/etc.defaults/rc.d/S97apache-user.sh stop

chroot $CHROOT /bin/bash

Executez le en root, et vous serez dans le chroot. Il reste maintenant à finaliser l’installation de Debian :

/debootstrap/debootstrap --second-stage

Générez un fichier sources.list correct grâce à http://debgen.simplylinux.ch, et placez le dans /etc/apt/sources.list.

Une petite mise à jour de Debian:

apt-get update
apt-get upgrade

Ajout d’un compte utilisateur:

adduser babar

J’ai du corriger quelques droits d’accès qui se sont perdus dans la bataille. Il y en a probablement d’autres, à vous de corriger si nécessaire.

chmod 777 /tmp
chmod +t /tmp

Installation du minimum vital:

apt-get install openssh-server htop most uptimed screen irssi

Pour que la Debian soit fonctionnelle, il faut maintenant faire tourner un certain nombre de services. Sur une Debian normale, ces services sont lancés par init, mais ce n’est pas notre cas. Il faudra donc les lancer manuellement. Éditez un fichier services.sh que vous placerez dans votre $HOME, et placez y le contenu suivant :

/etc/init.d/rsyslog start
/etc/init.d/mtab.sh start
/etc/init.d/cron start
/etc/init.d/ssh start
/etc/init.d/uptimed start
# Si installation d'apache et de mysql, voir la suite de l'article
# /etc/init.d/apache2 start
# /etc/init.d/mysqld start

Et voilà, votre Debian est fonctionnelle ! Vous avez virtuellement deux systèmes qui tournent en parallèle. Si votre NAS s’éteint, vous devrez lancer le script chroot.sh, qui vous emmène dans la Debian, puis le script services.sh. Si vous vous connectez en telnet, vous tomberez sur le DSM, et en ssh, sur Debian.

Installation d’apache et de mysql

Le DSM fait déjà tourner deux apache, un pour l’interface web, l’autre pour les web station et photo station. L’un des deux écoute sur le port 80, et redirige vers l’interface web (port 5000/5001) si nécessaire. Si vous voulez faire tourner un apache sur le port par défaut, il va falloir faire deux choses:

  • Allez dans l’interface d’administration et activez la web station
  • Arrêtez le deuxième apache par telnet:
/usr/syno/etc.defaults/rc.d/S97apache-user.sh stop

Après installation d’apache et de mysql, pensez à dé-commenter les lignes correspondantes dans les deux scripts. On a perdu au passage les web et photo stations, mais si vous voulez un apache personnalisé, c’est probablement que vous n’en avez pas besoin. Si vous changez d’avis, vous pouvez toujours réactiver le service apache du DSM, la configuration est restée intacte.

Conclusion

A l’usage, c’est une solution très efficace. Les services avancés du NAS d’un coté, la simplicité et la puissance de Debian de l’autre. La différence se situe au niveau de l’occupation en RAM, même si cela reste bien raisonnable. Après 20 jours d’uptime, l’occupation mémoire est de 170Mo sur 512Mo, sachant que Linux à tendance à ne pas trop nettoyer la mémoire s’il n’en a pas besoin.

Source:

http://www.seken.co.uk

Edit: meLIanTQ a proposé une solution pour un lancement automatique du chroot au démarrage du NAS: Le commentaire