Installer un Système d'exploitation linux Debian Stretch sur une Raspberry Pi 2 ou 3 avec les outils Weewx, MRAA et UPM

Motivations

Le projet Météo Climat tremplin pour l'enseignement des sciences s'intéresse aux instruments de mesure des paramètres météorologiques et à l'exploitation des données mesurées ainsi qu'au traitement des données météorologiques et climatologiques fournies par Météofrance. Cet intérêt a croisé la volonté institutionnelle d'enseigner le codage.

Cette intersection s'est matérialisée autour des nano-ordinateurs (RaspBerry, Odroĩd, Joule) qui pour une somme abordable pour un établissement d'enseignement permettent de disposer de vrais ordinateurs multi-coeurs de la taille d'une grosse boite d'allumettes. Ces nano-machines permettent autant de créer une interface de mesure avec des capteurs, que de traiter et afficher des données ou encore d'écrire des programmes qui s'exécutent sur un smartphone une tablette ou tout autre ordinateur.

De simple consommateur de technologie l'élève et son enseignant deviennent acteurs et producteurs de ressources, intégrables dans l'univers des opendata. Ces nano-machines proposent un accès direct au bas niveau de la machine et le terrain vierge qui est fourni requiert un travail préliminaire d'installation / configuration, avant que chacun puisse exprimer ses compétences techniques scientifiques ou de design. C'est cette première étape qui est exposée ici. Afin d'aider "ceux qui attendent que ça marche" ou accompagner "ceux qui aiment savoir comment ça marche" et faire eux même, deux approches sont proposées :

  1. Pour les plus pressés ou ceux qui ne souhaitent pas entrer dans les détails de la création de l'image, une image contenant tous les outils nécessaires pour un projet Météo est [disponible au téléchargement] (http://mediaserv.climatetmeteo.fr/images/RaspBerry/DebianStretchPi3/). Pour l'installer directement sur une micro-SD et faire fonctionner la Raspberry Pi ; Aller au chapitre 2 au début de l'article. Le reste du document décrit la méthode qui a été utlisée pour créer l'image proposée en ligne. La métode peut être adaptée et modifiée pour s'adapter aux besoins d'un projet ou aux contraintes pédagogiques d'un enseignement donné.

  2. Pour ceux qui veulent complètement maîtriser le contenu de la machine qu'ils vont utiliser avec leurs élèves, le processus de création de l'image est intégralement décrit et devrait pouvoir être reproduit (à condition de disposer de quelques compétences numériques et d'une machine fonctionnant avec un système d'exploitation libre, ce travail a été réalisé avec une machine Debian stretch mais tout autre distribution linux peut convenir).


Sommaire

  1. Présentation sommaire des Raspberry pi

    a. Particularités de la raspberry Pi par rapport à un PC portable

    b. Premiers choix stratégiques

  2. Installation de l'image sur une carte microSD et mise en route immédiate de la Raspberry Pi (2 ou 3)

    a. Préparation et construction de la micro-SD

    a. Premier démarrage de la Raspberry sur le système nouvellement installé

    b. Utilisation de la RaspPi à distance

    c. Mise à jour : système mraa et upm

  3. Procédure de construction d'une image Debian Stretch

    a. Préparation de l'ordinateur tiers qui permet de construire l'image

    b. Construction de l'image

  4. Construction manuelle des paquets debian spécifiques du projet Tremplin

    a. Le cas particulier du paquet weewx

    b. Construction du paquet node

    c. Construction du paquet swig

    d. Construction du paquet mraa

    e. Construction du paquet upm

    f. Construction du paquet libopenzwave

    g. Réglages et exploitation des paquets créés


Téléchargements

  1. Scripts de création de l'image
  2. logiciel weewx
  3. logiciel swig
  4. logiciel node v-6.9.1 Cette version est nécessaire pour compiler correctement mraa et upm, le travail est en cours pour utiliser logiciel node v-7.2.0
  5. mraa software
  6. upm software
  7. Client et serveur de terminaux

1. Présentation sommaire des Raspberry pi

Une Raspbery PI 2 ou 3 est un véritable ordinateur "complet", il propose un processeur, de la mémoire un espace de stockage. On peut l'utiliser en ordinateur de bureau grâce à son connecteur HDMI qui lui permet d'afficher sur son propre écran et à son bus USB sur lequel on peut connecter clavier, souris et tout autre périphérique. On peut aussi l'utiliser à distance comme un serveur de terminaux en affichant l'interface graphique sur un autre ordinateur (ce qui nous ramène au cas précédent) ou on peut aussi le traiter comme un serveur et interagir en ligne de commande à distance.

1.a Particularités de la raspberry Pi par rapport à un PC portable

La Raspberry Pi présente un certain nombre de différences fondamentales avec un ordinateur portable.

La première est que le processeur au coeur de la machine est un processeur graphique construit sur une architecture ARM et non X86. Cela peut paraître anecdotique à l'utilisateur final mais cela impose un certain nombre de contraintes qui au final peuvent interférer avec les usages courants.

La seconde concerne la mémoire qui est fixée et embarquée dans le processeur, sa taille est un des facteurs limitants de la performance (les Odroïd proposent plus de mémoire et un meilleur confort d'utilisation).

La troisième concerne le stockage qui est "amovible" tout le système et l'espace de stockage des usagers se trouve sur une micro-SD, si on change de micro-SD on change de machine ! Il est donc possible à un coût raisonnable de "profiler" plusieurs machines en fonction de ses besoins.

Le point le plus crucial est que pour démarrer la raspberry Pi a besoin d'un petit morceau d'espace de stockage formatté en FAT32 (comme celui des clefs USB) qui contient un code binaire propriétaire dépendant du processeur utilisé. Il n'est donc pas possible d'installer une raspberry comme on le fait pour un linux ordinaire (avec un CD ou une clef USB) à cause de cette petite contrainte. La solution la plus communément proposée est de construire une image sur un ordinateur tiers puis de copier cette image bit à bit (en binaire) sur le support micro-SD. Cela permet donc à un usager sans connaissance avancée de télécharger l'image et de la copier sur le support. C'est ce que nous proposons dans la dernière partie. Avant cela, nous expliquerons comment construire sa propre image (sur le modèle de l'image nécessaire pour le projet tremplin des Sciences) en signalant les opérations à effectuer pour changer les paramètres de cette image.

1.b Premiers choix stratégiques

Lorsqu'un client achète un ordinateur et encore plus un smartphone ou une tablette, le vendeur lui décrit en détail les nombreux "services clef en main" que propose l'objet, la facilité avec laquelle l'usager qu'il va devenir pourra les obtenir sans ne jamais parler de ce que cet objet (qui est un ordinateur souvent puissant) pourrait faire si d'autres choix logiciels avaient été faits et bien sûr sans l'informer de tout ce que l'appareil fait sans qu'il le sache.

Pour la raspberry vous disposez d'un côté d'un peu d'électronique inerte, d'un autre côté d'une carte mémoire SD vierge, vous devez donc choisir ce que sera le coeur de votre machine et ce qu'elle pourra faire parmi 9 (au 04/06/2015) systèmes d'exploitation possibles. Vous êtes libre de vous baser sur n'importe quel critère vous pouvez choisir l'OS qui correspond le mieux à vos besoins, à votre projet, à vos envies, à vos compétences, voire à vos inquiétudes sur la protection de votre vie privée ou même en fonction de vos positions militantes.

J'ai choisi la distribution linux Debian Stretch parce que c'est la distribution qui me permet de compiler les outils dont j'ai besoin pour le projet Météo et Climat tremplin pour l'enseignement des sciences et que la raspberry Pi2 est équipée d'un processeur arm en version 7 (armv7) qui fait partie du matériel pour lesquels il existe un dépôt officiel maintenu de la distribution Debian compilée. La Raspberry Pi3 dispose d'un armv8 mais le morceau de code nécessaire pour le faire fonctionner en 64 bits n'est toujours pas disponible (au 02/01/2017).

Il est aussi possible de choisir la version du noyau parmi toutes celles proposées sur le site RaspberryPiLinux git, dans ce qui suit la version 4.8 a été choisie pour qu'elle soit identique avec la version du noyau de la distribution Debian Stretch.

2. Installation de l'image sur une carte microSD et mise en route immédiate de la Raspberry Pi (2 ou 3)

Pour avoir une Raspberry Pi opérationnelle il faut disposer d'une microSD contenant une image capable de démarrer (de "booter"). Le site raspBerry et de nombreux forums proposent des images avec des goodies particuliers mais pour faciliter le travail des collègues du projet Tremplin et maîtriser complètement le contenu du système d'exploitation, nous avons réalisé et nous mettons à disposition une image contenant les logiciels dont nous avons besoin (appelée image IFÉ-ENS de Lyon). Cette image a été construite au détriment de quelques fonctionnalités que nous n'utilisons pas. Si vous souhaitez installer ces fonctionnalités, vous pouvez récupérer les paquets et de les intégrer (si tant est que des paquets ou des sources vraiment ouvertes existent pour ces fonctions, notez bien que ce n'est pas parce que la Raspberry est un dispositif ouvert que tous les logiciels qui fonctionnent dessus le sont...).

La vitesse de la RaspBerry dépend fortement de la vitesse en écriture de la SD, la nomenclature classe 10 est dépassée, toutes les SD le sont maintenant, la vitesse dépend du prix choisissez des cartes UHS-I ou UHS-II mais vérifiez bien la vitesse en écriture qui peut être très différente de la vitesse de lecture.

L'installation décrite ici est faite en ligne de commande à partir d'une machine sous linux Debian. La Raspberry Pi fonctionnant d'origine sous linux ce mode d'installation est assez spontané et surtout extrêmement robuste. Il existe sur le net des tutoriaux pour d'autres OS qui sont parfaitement utilisables avec l'image proposée ici. Si vous n'avez pas de machine Debian et que vous souhaitiez suivre ce mode d'emploi, vous pouvez démarrer votre ordinateur sur une distribution live Debian qui n'altèrera pas votre ordinateur et vous le restituera dans l'état où il était avant la session live. Vous trouverez ici les recettes pour créer une clef USB bootable sur Debian. (Tout autre distribution linux devrait aussi fonctionner d'ailleurs)

Pour parvenir à gérer la carte SD et l'installation de l'image vous aurez besoin des logiciels gparted, wget, 7z et bmap-tools. Pour ce dernier la version 3.2 est indispensable pour utiliser le fichier fourni au téléchargement. Si l'ordinateur que vous utilisez dispose d'une autre version 2.5 par exemple, il vous faudra impérativement refaire le fichier .bmap en appliquant cette ligne de commande

bmaptool create -o nom_image.bmap nom_image

L'expression mon-image correspond au nom du fichier fourni par l'IFE-ENS-de-Lyon sur le site de téléchargement (voir ci-dessous)

2.a Préparation et construction de la micro-SD

Formatter la SD

Il est toujours prudent de "nettoyer" sa micro SD et de la formatter proprement avant de commencer. Formatter la SD en fat 32, 1 seule partition sur toute la surface disponible la commande pour faire ce travail en linux est gparted qui propose une interface graphique. Attention cette commande est extrêmement puissante, veillez bien à ne traiter QUE votre SD (et surtout pas tout autre disque ou partition), votre SD devrait apparaître spontanément sous un nom de type mmcblk?

sudo gparted

Utiliser les commandes de gparted pour effacer les partitions s'il en existe, sélectionner toute la surface et ajouter une seule partition primaire en fat32. Exécuter l'opération et quitter gparted.

Télecharger l'image mise à disposition

L'image se trouve sur le mediaserveur du projet tremplin des Sciences. Les chiffres YYYY-MM-DD représentent la date de création à paramétrer en fonction de ce qui est disponible en ligne pour obtenir ce numéro se connecter avec un navigateur web à l'adresse Raspberry Pi3 http://mediaserv.climatetmeteo.fr/images/RaspBerry/DebianStretchPi3 ou Raspberry Pi2 http://mediaserv.climatetmeteo.fr/images/RaspBerry/DebianStretchPi2.

Pour télécharger l'image il suffit de copier coller le nom de l'image dans la barre d'adresse et le téléchargement sera lancé, ou alors utiliser la commande linux wget ou curl, du fait du hardware et des périphériques les images sont différentes pour les Raspberry Pi 2 et 3 :

Raspberry Pi 2

wget http://mediaserv.climatetmeteo.fr/images/RaspBerry/DebianStretchPi2/YYYY-MM-DD-debian-stretch.bmap
wget http://mediaserv.climatetmeteo.fr/images/RaspBerry/DebianStretchPi2/YYYY-MM-DD-debian-stretch.img.xz  

Raspberry Pi 3

wget http://mediaserv.climatetmeteo.fr/images/RaspBerry/DebianStretchPi3/YYYY-MM-DD-debian-stretch.bmap 
wget http://mediaserv.climatetmeteo.fr/images/RaspBerry/DebianStretchPi3/YYYY-MM-DD-debian-stretch.img.xz  

L'image est en format compressé il est nécessaire de la décompresser avec un des nombreux outils de décompression (ici nous utilisons 7Z) :

7z x YYYY-MM-DD-debian-stretch.img.xz

Pour le fichier .bmap il faut cliquer droit sur le lien et demander “enregistrer la cible du lien sous” pour éviter que le navigateur n'ouvre le fichier.

La décompression fournit le fichier image, après cette opération on a donc :

  • Un premier fichier de petite taille avec l'extension bmap qui est un fichier de configuration permettant une copie rapide avec l'utilitaire bmap-tool (ce fichier est inutile si vous utilisez un sytème d'exploitation moins puissant ne sachant pas exploiter le descriptif de l'image)

  • l'image proprement dite de grande taille (de l'ordre de 7.5Go) avec l'extension img

Copier l'image téléchargée sur la microSD

L'utilitaire bmap-tools utilise la description de l'image à copier pour raccourcir le temps de copie en ne copiant pas les blocs vides et en optimisant la taille des blocs copiés. Ci-dessous exemple de trace de la copie de l'image rp3 et rpi2.

sudo bmaptool copy --bmap YYYY-MM-DD-debian-stretch.bmap YYYY-MM-DD-debian-stretch.img /dev/mmcblk0

bmaptool: info: block map format version 2.0
bmaptool: info: 921600 blocks of size 4096 (3.5 GiB), mapped 899072 blocks (3.4 GiB or 97.6%)
bmaptool: info: copying image 'YYYY-MM-DD-debian-stretch.img' to block device '/dev/mmcblk0' using bmap file 'YYYY-MM-DD-debian-stretch.bmap'
bmaptool: info: 100% copied
bmaptool: info: synchronizing '/dev/mmcblk0'
bmaptool: info: copying time: 8m 3.9s, copying speed 7.3 MiB/sec

Redimensionner la taille utilisable à la taille de la micro SD

L'image n'occupe que la place nécessaire à contenir le système et les fichiers de base (avec un peu de marge pour les étourdis), il est souhaitable dès que possible d'augmenter la taille de la partition à la taille totale de la microSD pour avoir la place de mettre d'autres logiciels ou des données. Suivant vos habitudes et votre maîtrise vous pouvez si vous le souhaitez créer plusieurs partitions à ce moment (Ne vous engagez pas sur la création de plusieurs partitions si vous ne savez pas le faire car il faudra bien modifier le fichier /etc/fstab en conséquence). Pour redimensionner la partition deux procédures sont possibles :

En utilisant l'ordinateur tiers

Éjecter et remonter la microSD avant de lancer la modification de taille, on réutilise gparted toujours avec les mêmes recommandations de prudence.

sudo gparted

Quitter gparted ejecter la microSD et l'installer sur la raspi, vous disposez maintenant d'une raspi opérationnelle prête pour la météo et la programmation ! Pour l'utiliser il faudra glisser la SD dans le logement prévu à cet effet, brancher la Raspberry Pi au résseau et à une alimentation micro-USB et on pourra y aller ! Ce branchement suffit effectivement pour être opérationnel mais pour les premières fois surtout si l'on n'est pas habitué à la ligne de commandes linux il est souhaitable de brancher aussi un écran un clavier et une souris....et on se retrouve alors face à un vrai ordinateur (voir plus bas).

En utilisant la raspberry nouvellement installée

Dans certains cas des problème peuvent apparaître avec des SD redimensionnées avec gparted (vous trouverez sur le web une abondante littérature sur les performances et les faiblesses des différentes micro-SD si vous n'avez pas choisi une SD "bas de game" vous ne devriez pas être concernés par ces problèmes, mais ... on ne sait jamais). Dans d'autre cas la version de gparted un peu trop ancienne ne gère pas le paramètre metadata_csum et ne parvient pas à redimensionner la partition racine. Dans ces deux cas gparted est inutilisable et la solution ci-dessous utilisant la raspberry pi est indispensable.

Pour éviter d'utiliser gparted et l'ordinateur tiers il est possible de redimensionner la partition racine directement sur la Raspberry fonctionnant avec la nouvelle image. Pour cela une fois la raspberry opérationnelle et démarrée utiliser la commande

sudo fdisk /dev/mmcblk0
  • Taper m pour voir la liste des commandes
  • Taper p pour voir la liste des partitions disponibles, normalement il y en deux

    • une FAT : /dev/mmcblk0p1 * 2048 133119 131072 64M c W95 FAT32 (LBA)
    • une linux : /dev/mmcblk0p2 133120 62517247 62384128 29,8G 83 Linux
  • Taper ensuite

    • d puis
    • 2 puis
    • n puis
    • p puis
    • 2 puis
    • accepter les valeurs par défaut qui correspondent à la taille effectivement disponible sur la cartes SD,
    • pour finir taper w.

Taper ensuite sudo reboot puis :

sudo resize2fs /dev/mmcblk0p2
sudo reboot

La racine du système occupe maintenant la totalité de l'espace disponible sur la SD.

Reconfiguration du réseau filaire

Dans le cas de la raspi2, suivant les options choisies pour la construction il peut être nécessaire d'effectuer quelques manipulations manuelles qui faciliteront le travail ultérieur. Par exemple dans notre cas nous souhaitons directement accéder au WIFI pour cela nous avons mis dans l'installation le paquet de drivers nécessaires (firmware-realtek), si vous avez un autre matériel il faudra installer le bon driver.

Il est important que les utilisateurs appartiennent au groupe netdev pour pouvoir modifier la configuration du réseau. Il suffit pour cela de modifier le fichier etc/group de la carte fraîchement copiée, (ne pas mettre les usagers dans ce groupe est une méhode pour bloquer leur accès sur un internet précis). La manipulation peut être effectuée directement sur la carte montée sur l'ordinateur tiers (sans l'installer sur la Raspberry Pi) modifier la ligne netdev comme ceci netdev:x:108:ens-ife, ce travail est déjà fait pour les utilisateurs pré-installés ens-ife, localadm, callisto...

Nous venons de cloner une image ce qui signifie que tous les fichiers de configuration sont à l'identique avec l'image source. Cela présente de nombreux avantages mais quelques inconvénients. L'un d'entre eux est que l'identifiant de la carte réseau de la machine source est susceptible d'être conservé dans les fichiers de configuration du réseau (ce n'est pas systématique mais si cela arrive appliquer la procédure ci-dessous).

Il est impératif pour que le réseau fonctionne correctement que lors de la première connexion de la nouvelle machine au réseau (et en particulier au filaire) ses fichiers de configuration soient vides. La façon la plus simple et intuitive de procéder est de démarrer avec un environnement complet : clavier, écran, souris; et d'utiliser les outils graphiques pour configurer le réseau.

Il est aussi possible de faire à la main dans des fichiers de configuration les opérations qui sont effectuées à partir de l'interface graphique, ces opérations manuelles sont à faire plutôt par des utilisateurs avancés, mais en cas de problème tout utilisateur peut trouver dans les fichiers des informations utiles. Vérifier que les fichiers se terminant par .conf dans le répertoire /etc/wicd soient vides, s'ils ne le sont pas effectuer les commandes suivantes :

sudo rm /etc/wicd/wired-settings.conf
sudo rm /etc/wicd/wireless-settings.conf
sudo touch /etc/wicd/wired-settings.conf
sudo touch /etc/wicd/wireless-settings.conf

Il est aussi impératif d'identifier le nom de l'interface filaire et de le renseigner dans le fichier manager-settings.conf, pour obtenir le nom de l'interface taper :

ip address
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
    2:enxb827eb3c732f: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether b8:27:eb:3c:73:2f brd ff:ff:ff:ff:ff:ff
    3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:69:26:7a brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.14/24 brd 10.0.1.255 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba27:ebff:fe69:267a/64 scope link 
       valid_lft forever preferred_lft forever

le contenu du fichier doit ressembler à ceci :

[Settings]
backend = external
wireless_interface = wlan0
wired_interface = nom_de_l'interface_filaire
wpa_driver = wext
always_show_wired_interface = True
.../...

2.b Premier démarrage de la Raspberry sur le système nouvellement installé

Installer la micro-SD dans le connecteur prévu à cet effet puis brancher la RPi via le connecteur micro-USB. Avec une raspi3 il n'est pas impératif d'être connecté en filaire car l'image contient le driver du WIFI qui peut être activé par défaut, cependant pour que la connection WIFI fonctionne il est obligatoire de fournir les informations de connection (nom du réseau et mot de passe) avant de démarrer la raspberry (cf plus haut). Il est donc recommandé pour le premier branchement d'être connecté via le réseau filaire.

Pour la raspi2 si un WIFI USB est présent et si le paquet contenant les pilotes a été installé on est dans la même situation. Par contre si la raspi2 n'a pas de WIFI elle doit être impérativement connectée en filaire pour atteindre le réseau (pas de WIFI intégré par défaut dans la raspi2) et installer le paquet nécessaire; ici ce serait par exemple le paquet realtek (qui est déjà installé dans l'image IFÉ ENS de Lyon):

sudo apt-get install firmware-realtek

Pour la première connection il est aussi souhaitable/confortable de disposer d'un environnement complet écran/clavier/souris qui rend la raspi accessible de façon "ordinaire", la console a été désactivée dans cette image et ne permet donc pas d'avoir accès à la raspberry via ce mode dégradé. L'écran affiche une invite de login :

  • Les logins disponibles sont
    • ens-ife (mis en place pour les membres de l'équipe en cas de besoin de soutien à distance),
    • localadm (administrateur local de la Raspberry Pi),
    • callisto (utilisateur propriétaire et lanceur de Jupyterhub)
  • Le mot de passe de départ des 2 comptes hors ens-ife est AChanger1$ (qui suggère qu'il doit être changé dès que possible !!)

Une fois dans l'environnement de travail accéder à l'outil wicd pour configurer le réseau (cf plus haut). On peut alors continuer à travailler de façon "ordinaire" avec une connection internet active.

Toutefois il est possible de progresser de façon "moins intuitive" mais tout aussi efficace (en ligne de commandes) en se connectant à la raspi via une console c'est ce qui est décrit ci-dessous. La seule contrainte est de disposer de l'adresse IP de la raspi à laquelle on se connecte avec le user localadm depuis un ordinateur tiers en utilisant les commandes suivantes :

ssh localadm@***.***.***.***
The authenticity of host '***.***.***.*** (***.***.***.***)' can't be established.
ECDSA key fingerprint is SHA256:J4MATvTmHHoSu/Lkz2auFWTJwCgaZTqRBVMIDoshpA4.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '***.***.***.***' (ECDSA) to the list of known hosts.
localadm@***.***.***.***'s password: 

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.

Mise en place du confort de base

Les utilisateurs initiaux ens-ife et localadm sont des utilisateurs privilégiés. Il est dangereux de travailler sur l'utilisateur priviligié alors qu'il est possible et rapide de créer autant d'utilisateurs que nécessaire (tous les utilisateurs ordinaires devront être créés avec la meéthode ci-dessous). Créer un user et continuer dans l'espace du user.

sudo adduser myUser

Répondre aux questions en n'utilisant ni caractère accentué ni caractère spécial (sauf pour le mot de passe). Il est aussi utile de placer cet utilisateur dans un certain nombre de groupes afin de faciliter le fonctionnement au quotidien : * le groupe i2c pour accéder au bus i2c et aux capteurs qu'il porte ainsi qu'au * le groupe netdev pour accéder aux paramètres du réseau.

sudo adduser myUser netdev
sudo adduser myUser i2c gpio

2.c Utilisation graphique de la RaspPi à distance

L'utilisation de la ligne de commandes n'est pas forcément immédiate pour de nombreux utilisateurs et il est utile de proposer une interface graphique à distance pour les usagers ne sachant pas ou ne pouvant pas s'adapter à la ligne de commandes. La solution passe par la mise en place d'un terminal server sur la raspberry associé à un client qui affiche l'écran de la raspberry à distance. Le serveur sur la Raspberry est installé par défaut et le service est mis en place mais non activé. Ce service est utile seulement si l'on souhaite se connecter via un environnement graphique à distance; dans le cas contraire il est souhaitable de le maintenir désactivé (cf. plus bas). Pour une raison encore inconnue même lorsqu'il est activé, le service refuse de démarrer au boot il faut donc le lancer à la main. Pour cela se connecter à distance avec une console connaissant l'adresse IP de la Raspberry Pi xxx.xxxxxx.xxx et lancer la commande :

ssh localadm@xxx.xxxxxx.xxx sudo --stdin service vncserver start

Le serveur démarre et propose un accès en ligne. Pour se connecter à ce serveur de terminaux graphiques fournir au client les informations suivantes :

  • login : callisto
  • mot de passe : celui qui a été fourni au premier démarrage du serveur
  • adresse xxx.xxx.xxx.xxx:1
  • port 5901

Raspberry Pi 3 Dans un serveur de terminaux Sur cette figure remmina a été utilisé.

Pour éteindre le service à distance

ssh localadm@xxx.xxxxxx.xxx sudo --stdin service vncserver stop

Si le serveur de terminaux n'est pas activé (il est proposé sous la forme d'un service dans l'image proposée mais pas nécessairement activé par défaut [ce point est en discussion du fait des conséquences sur la sécurité]), pour lancer le serveur de terminaux qui permet de retrouver un mode graphique (le mot de passe est créé au premier lancement de vncserver comme dans l'exemple ci-dessous, le mot de passe n'est plus demandé par la suite) on utilise :

localadm@raspife3:~$ vncserver

You will require a password to access your desktops.

Password: 
Verify:   
Would you like to enter a view-only password (y/n)? n

New 'X' desktop is raspife3:1

Creating default startup script /home/ens-ife/.vnc/xstartup
Starting applications specified in /home/ens-ife/.vnc/xstartup
Log file is /home/ens-ife/.vnc/raspife3:1.log

ens-ife@raspife3:~$ 

Il est alors possible d'afficher l'écran de la raspberry sur l'écran de n'importe quel ordinateur utilisant un client de serveur de terminaux par exemple le client opensource tightvncserver.

Mise en place d'un broadcast VNC sur le port 5901

La solution systématique du service consomme des ressources et démarre pour un utilisateur particulier, il est mis en place par défaut. une façon moins élégante est que chaque utilisateur myUser puisse lancer un serveur de terminaux à son nom pour ce faire ajouter dans le fichier /etc/rc.local pour chacun des utilisateurs "myUser" la ligne suivante :

su myUser -c /usr/bin/vncserver

Comme dans le cas précédent au premier lancement de vncserver par l'utilisateur myUser il est nécessaire de choisir le mot de passe du serveur de terminaux ou l'avoir fixé par avance avec la commande :

vncpasswd

exécutée en tant que myUser.

Que l'on utilise le serveur de terminaux proposé par défaut ou un serveur personnalisé il est souhaitable avant de quitter la Raspberry de terminer les serveurs de terminaux soit en terminant le service soit en utilisant la commande suivante pour chacun des utilisateurs :

vncserver -kill :1

Recherche de l'adresse MAC ou reconnaissance de l'interface WIFI

Pour mettre en oeuvre cette solution il faut connaître l'adresse MAC de son interface WIFI pour cela on utilise l'instruction ip sur la raspberry :

ip addr show

qui fournit dans le cas ou la raspberry a pris l'IP 192.169.11.120 :

3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
    inet 192.169.11.120/24 brd 192.169.11.255 scope global dynamic wlan0
       valid_lft 9165sec preferred_lft 9165sec
    inet6 $$$$::$$$$:$$$$:$$$$:$$$$/64 scope link 
       valid_lft forever preferred_lft forever

où **:**:**:**:**:** est l'adresse MAC unique de l'interface. Il faut avoir la machine qui servira de client pour le terminal sur le même réseau et rechercher l'adresse de la carte de la raspberry (il faut les droits d'administration):

sudo nmap -sP -n 192.169.11.0/24 | grep -e **:**:**:**:**:** -B 2

Attention certains administrateurs réseau n'aiment pas (du tout, du tout) qu'un usager lambda utilise cette commande privilégiée et réputée agressive car elle permet d'obtenir des informations sur le réseau, dans ce cas vous n'obtiendrez pas de réponse ou vous verrez débarquer dans le bureau la sécurité de l'établissement.... Toutefois si vous ne la répétez pas une centaine de fois de suite vous ne serez probablement pas considérés comme malveillants. Une fois que vous avez récupéré votre IP vous êtes en situation connue :

ssh 92.169.11.120 
vncpasswd (donner un mot de passe de session)
vncserver

Puis un client VNC et l'écran de la raspberry apparait sur votre machine....

2.d Mises à jour : système mraa et upm

Cette opération permet de garder la cohérence à jour du système d'exploitation.

Mise à jour du système

Suivant la durée entre la construction de l'image et l'installation, cette opération peut prendre du temps et consommer de la bande passante, l'entreprendre seulement lorsque vous disposez d'un temps suffisant et d'une connection rapide.

apt-get update
apt-get upgrade
apt-get dist-upgrade

Mise à jour de mraa et upm

mraa et upm sont des librairies opensources soutenues par Intel et une communauté importante et très active, il est possible que la version compilée dans l'image ne soit pas suffisamment à jour (par exemple une contribution importante a été faite sur le code d'un capteur qui vous intéresse) et dans ce cas il est nécessaire de récupérer la dernière version en ligne et de la compiler. Cette opération est facilitée par la structure mise en place. Pour mettre à jour mraa deux situations sont possibles :

Si les dépôts mraa et upm sont déja clonés (ce qui est le cas dans l'image ENS-IFÉ)

dans ce cas il existe dans l'espace de stockage de l'administrateur par défaut (localadm) un répertoire Logiciels/IoT/mraa et Logiciels/iOt/upm dans ce cas:

  • mettre à jour les dépôts depuis la ressource en ligne
  • Entrer dans le dossier build
  • préparer la compilation avec l'instruction cmake
  • compiler installer
  • la nouvelle version est disponible !

Attention dans les images les plus anciennes le répertoire de construction est nommé Build aulieu de build le reste de la procédure reste identique.

cd ~/Logiciels/IoT/
cd mraa/
git pull
.../...
cd build
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..
make -j4
sudo make install
cd ../../upm
git pull
.../...
cd build
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..
make -j4
sudo make install

Habituellement la compilation se passe sans problème mais parfois des contributions insuffisamment vérifiées provoquent des erreurs qui sont corrigées rapidement :

  • soit vous pouvez attendre la correction,
  • soit le pilote affecté ne vous intéresse pas et vous le supprimez de la compilation avec la commande :
rm -r ../src/nomDuPilote
  • soit vous reconnaissez l'erreur et vous pouvez corriger la source !

Si les dépôts ne sont pas présents dans l'image (autre que celle de l'ENS-IFÉ)

Il faut alors les télécharger: - Choisir un répertoire qui recevra les sources et cloner les dépôts mraa et upm à l'intérieur - créer le dossier build à l'intérieur du dossier mraa et upm puis entrer dans ce dossier - préparer la compilation avec l'instruction cmake - compiler installer - la nouvelle version est disponible !

mkdir -p Logiciels/IoT
cd Logiciels/IoT
git clone https://github.com/intel-iot-devkit/mraa.git
mkdir -p mraa/build
git clone https://github.com/intel-iot-devkit/mraa.git
mkdir -p  upm/build
cd mraa/build
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..
make
sudo make install
cd ../../upm/build
cmake -DCMAKE_INSTALL_PREFIX:PATH=/usr ..
make
sudo make install

Courant Octobre 2016 une modification de structure est apparue à la demande des usagers, tous les modules python de la librairie upm ont été regroupé dans un répertoire upm cela implique que l'importation du code ne se fait plus directement. Dans les programmes plus anciens que cette date, il convient de remplacer

import pyupm_nomDuPilote

par

import upm
from upm import pyupm_nomDuPilote as myName

On peut alors utiliser ultérieurement myName ce qui allègera la notation.


Les chapitres qui suivent traitent de la technique de construction de l'image ENS-IFÉ qui est proposée en ligne.

L'accompagnement de l'utilisation de la Raspberry pour apprendre le codage et le pilotage à distance de capteurs météo se trouve dans l'article Apprendre à coder avec la météo dans un environnement web (LED, capteurs,affichage...)


3. Procédure de construction d'une image Debian Stretch

La construction de l'image repose sur un ensemble de scripts libres écrits par drtyhlpr et déposés sur la forge opensource GitHub à l'adresse : rpi23-gen-image. Ces scripts assurent tout le travail de téléchargement compilation et mise en forme de l'image. Les usagers avertis pourront directement utiliser cette ressources selon leurs besoins. La suite de cet article décrit le travail effectivement réalisé pour parvenir à l'image proposée en fin d'article et mise en ligne aux adresses suivantes :

3.a Préparation de l'ordinateur tiers qui permet de construire l'image

Afin d'accélérer le processus de création on utilise une autre machine que la raspberry cible pour construire l'image, les paquets suivants doivent être installés sur la machine hôte :

sudo apt-get install debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git crossbuild-essential-armhf

Télécharger le noyau pour construire l'image

Nous allon télécharger la version 4.8, cette version est avance par rapport à la distribution actuelle de raspbian (4.4) :

mkdir Kernel
cd Kernel
git clone -b rpi-4.8.y --single-branch https://github.com/raspberrypi/linux.git

Le code source du noyau se décompresse dans un dossier nommé linux.

Télécharger les scripts rpi23-gen-image

Cloner le dépôt GitHub dans un espace suffisant pour contenir le logiciel et la future image (de 500Mo à plus d'1.5 Go)

git clone https://github.com/drtyhlpr/rpi23-gen-image.git

Cette action crée le répertoire rpi23-gen-image qui contient l'ensemble des scripts et le script principal exécutable

otinapa.€ : ls -al
total 100
drwxr-xr-x  7 vidal vidal  4096 août  15 17:06 ./
drwxr-xr-x 14 vidal vidal  4096 août  15 17:02 ../
drwxr-xr-x  2 vidal vidal  4096 août  15 17:02 bootstrap.d/
-rwxr-xr-x  1 vidal vidal  1018 août  15 17:05 createraspife3.sh*
drwxr-xr-x 15 vidal vidal  4096 août  15 17:02 files/
-rw-r--r--  1 vidal vidal  1116 août  15 17:02 functions.sh
drwxr-xr-x  8 vidal vidal  4096 août  15 17:02 .git/
-rw-r--r--  1 vidal vidal    43 août  15 17:02 .gitignore
drwxr-xr-x  3 root  root   4096 août  15 17:06 images/
-rw-r--r--  1 vidal vidal 18092 août  15 17:02 LICENSE
drwxr-xr-x  2 vidal vidal  4096 août  15 17:04 packages/
-rw-r--r--  1 vidal vidal 18986 août  15 17:02 README.md
-rwxr-xr-x  1 vidal vidal 18052 août  15 17:02 rpi23-gen-image.sh*

Il est nécessaire de fixer un certain nombre de variables pour réaliser une image correspondant à nos besoins. Pour simplifier cette action il m'est apparu plus simple de proposer de regrouper ces paramètres à l'intérieur d'un fichier qui appelle le scrip principal cela permet de reproduire simplement la génération d'une image.

Création d'un fichier de configuration pour l'image raspife3 et raspi2ife

Raspi3

L'image que nous allons créer sera baptisée raspife3 pour signaler qu'elle est construite pour une raspi3 du projet IFÉ Trempli pour l'Enseignement des Sciences. Tous les paramètres de création ont été regroupés dans un fichier exécutable qui lance le script de création de l'image. Le contenu de ce fichier est reproduit ci-dessous :

otinapa.€ : more createraspife3.sh
#! /bin/sh

APT_SERVER=ftp.fr.debian.org \
APT_INCLUDES="gnupg,gnupg2,tightvncserver,build-essential,git,cmake,libjson-c-dev,\
bison,libboost-all-dev,automake,autoconf,libtool,pkg-config,checkinstall,python3,python3-dev,menulibre,\
libnotify-bin,python,python-configobj,python-cheetah,python-imaging,python-serial,python-usb,python-dev,\
pcre2-utils,libpcre++-dev,libpcre2-dev,libjpeg-dev,jed,wicd,i2c-tools,python-smbus,policykit-1,usbutils,\
pmount,python-pip,python3-pip,geany,geany-plugin-py,geany-plugin-markdown,firefox-esr,firefox-esr-l10n-fr,\
icedtea-8-plugin,openjdk-8-jdk,openjdk-8-jre,openjdk-8-jre-headless,libqtwebkit-dev,libqt5webkit5-dev,\
libudev-dev,libzzip-dev,zlib1g-dev,libcanberra-gtk-module,libnss-myhostname,libfreetype6,libpng16-16,\
lxsession,openbox-lxde-session,lxde" \
RPI_MODEL=3 \
RELEASE=stretch \
HOSTNAME="raspife3" PASSWORD="AChanger1$" \
DEFLOCAL="fr_FR.UTF-8" TIMEZONE="Europe/Paris" \
EXPANDROOT=false \
XKB_MODEL="pc105" XKB_LAYOUT="fr" XKB_VARIANT="latin9" XKB_OPTIONS="" \
ENABLE_DHCP=true ENABLE_CONSOLE=false ENABLE_IPV6=true ENABLE_SSHD=true ENABLE_NONFREE=true ENABLE_WIRELESS=true \
ENABLE_RSYSLOG=false ENABLE_SOUND=true ENABLE_HWRANDOM=true ENABLE_MINGPU=true ENABLE_DBUS=true ENABLE_XORG=true \
ENABLE_WM="lxdm" ENABLE_FBTURBO=true \
ENABLE_USER=true USER_NAME=ens-ife \
ENABLE_ROOT=true ENABLE_ROOT_SSH=false ENABLE_INITRAMFS=true KERNEL_HEADERS=true \
BUILD_KERNEL=true \
REDUCE_APT=false REDUCE_DOC=true REDUCE_MAN=false REDUCE_HWDB=true \
REDUCE_BASH=false REDUCE_SSHD=false REDUCE_LOCALE=false ./rpi3-gen-image.sh

Il est parfois nécessaire de supprimer le pré-chargement du paquet lxde pour que la compilation aboutisse, dans ce cas dès que l'image est terminée (avec lxdm) il faut ajouter le paquet lxde

sudo apt-get install lxde

Raspi2

L'image que nous allons créer sera baptisée raspife2 pour signaler qu'elle est construite pour une raspi2 du projet IFÉ Trempli pour l'Enseignement des Sciences. Tous les paramètres de création ont été regroupés dans un fichier exécutable qui lance le script de création de l'image. Le contenu de ce fichier est reproduit ci-dessous :

otinapa.€ : more createraspife2.sh
#! /bin/sh
APT_SERVER=ftp.fr.debian.org APT_INCLUDES="gnupg,gnupg2,firmware-realtek,firmware-linux-nonfree,firmware-linux,tightvncserver,build-essential,git,cmake,libjson-c-dev,automake,autoconf,libtool,pkg-config,checkinstall,python3,lxde,menulibre,libnotify-bin,python,python-configobj,python-cheetah,python-imaging,python-serial,python-usb,python-dev,pcre2-utils,libpcre++-dev,libpcre2-dev,libjpeg-dev,wicd,jed,i2c-tools,python-smbus,policykit-1,usbutils,pmount,python-pip,python3-pip,geany,geany-plugin-py,geany-plugin-markdown,libcanberra-gtk-module" RPI_MODEL=2 RELEASE=stretch HOSTNAME="raspife2" PASSWORD="AChanger1$" DEFLOCAL="fr_FR.UTF-8" TIMEZONE="Europe/Paris" EXPANDROOT=false XKB_MODEL="pc105" XKB_LAYOUT="fr" XKB_VARIANT="latin9" XKB_OPTIONS="" ENABLE_DHCP=true ENABLE_CONSOLE=false ENABLE_IPV6=true ENABLE_SSHD=true ENABLE_NONFREE=true ENABLE_RSYSLOG=false ENABLE_SOUND=true ENABLE_HWRANDOM=true ENABLE_MINGPU=true ENABLE_DBUS=true ENABLE_XORG=true ENABLE_WM="lxdm" ENABLE_FBTURBO=true ENABLE_USER=true USER_NAME=ens-ife ENABLE_ROOT=true ENABLE_ROOT_SSH=false ENABLE_INITRAMFS=true KERNEL_HEADERS=true BUILD_KERNEL=true REDUCE_APT=false REDUCE_DOC=true REDUCE_MAN=false REDUCE_HWDB=true REDUCE_BASH=false REDUCE_SSHD=false REDUCE_LOCALE=false  ./rpi23-gen-image.sh 

Différences principales entre raspi2 et raspi3 :

  • le modèle de la Raspberry
  • le nom donné à la machine
  • il n'y a pas de WIFI par défaut et il ne peut pas être activé pendant la création
  • notre Raspberry est équipée d'un mini-USB WIFI realtek nous installons donc le firmware realtek dans notre image.

Quelques précisions sur les choix des variables :

  • APT_SERVER est positionné sur l'hébergeur de la machine utilisée, une valeur générique sera en France ftp.debian.fr
  • APT_INCLUDES fournit la liste des paquets debian qui seront utilisés ultérieurement ce qui évite d'avoir à les installer plus tard à la main
  • RPI_MODEL fournit le modèle (2 ou 3) de la Raspberry
  • HOSTNAME le nom de la machine
  • PASSWORD le mot de passe qui sera à modifier
  • DEFLOCAL précise que nous souhaitons une interface en français
  • TIMEZONE définit notre position géographique (attention la raspi n'a pas d'horloge permanente, voir les forums à ce sujet)
  • ENABLE_WM je choisis lightdm pour sa petite taille et sa faible consommation de ressources par contre l'univers proposé est un peu ... "austère"
  • USER_NAME le premier user qui dispose des droits d'administration est ici ens-ife
  • KERNELSRC_DIR localise le noyau choisi pour construire cette image

Les autres variables positionnent un certain nombre de paramètres un peu plus techniques qu'il est possible de modifier (à condition de connaître les conséquences d'une modification)

Ajout de paquets debian ne figurant pas dans les dépôts

Pour le projet Météo Climat tremplin pour l'enseignement des Sciences, un certain nombre de librairies de fonctions sont nécessaires :

  • WEEWX qui fournit un outil pour communiquer avec une station météorologique du commerce
  • MRAA qui fournit des primitives de bas niveau pour interagir avec le bus GPIO ou I2C de la machine non disponible en ce moment sous la forme d'un paquet, à compiler sur la nouvelle distribution
  • UPM qui fournit les pilotes pour un très grand nombre de capteurs ou d'actionneurs. non disponible en ce moment sous la forme d'un paquet, à compiler sur la nouvelle distribution
  • une version de NODE compatible avec mraa et upm (6.9.1) qui soit installée en position standard (et non dans la structure Debian)
  • une version de SWIG compatible avec mraa et upm qui soit installée en position standard (et non dans la structure Debian)

Ces logiciels doivent être soit compilés depuis les sources ou alors chargés à partir de paquets Debian construits par des tiers mais ne figurant pas dans les dépôts officiels. Weewx propose un tel paquet en ligne et nous proposons les paquets swig et node dont dépendent mraa et upm afin de faciliter la construction la plus simple possible d'une image pour ceux qui souhaitent le faire. De plus un paragraphe du chapitre suivant est consacré à la création de ces paquets si un utilisateur souhaite réaliser l'intégralité de la procédure et créer ces paquets lui-même à partir des sources.

3.b Construction de l'image

Pour construire l'image il faut d'abord construire le répertoire packages et placer à l'intérieur tous les paquets Debian externes aux dépôts officiels, dont on a vérifié au préalable la compatibilité avec le système qui va être créé. Ce n'est pas un raisonnement circulaire! C'est simplement l'expression du fait que créer une image avec rpi23gen est une commodité extrêmement utile et performante mais pour en bénéficier il faut l'alimenter de ressources qui ont été au préalable testées sur une image minimale dont le coeur est identique à celle qui va être créée. Les paquets proposés par le projet Tremplin ont été vérifiés.

Pour ajouter les paquets les télécharger depuis le dépôt du projet et les déposer dans le répertoire packages :

cd rpi23-gen-image
mkdir pakages
cp weewx_3.5.0-1_all.deb swig_3.0.10-1_armhf.deb packages

Une fois que les paquets supplémentaires sont disponibles et que le fichier exécutable contient tous les paramètres du paragraphe précédent il suffit d'exécuter ce fichier ./createraspife3.sh la création se met automatiquement en route et aboutit à la création de 2 fichiers :

  • l'image proprement dite (reprenant la date et se terminant par l'estension .img)
  • un fichier annexe permettant d'accélerer la copie de l'image et réduit considérablement le temps de copie notamment sur des grosses cartes microSD (reprenant la date et se terminant par l'extension .bmap)

Le fichier bmap est utilisable seulement avec le logiciel bmap-tools pour lequel je n'ai pas trouvé de version windows. L'image par contre est tout à fait ordinaire (créée avec en plus l'option sparse qui n'a pas d'influence sur son utilisabilité) et peut être copiée avec n'importe quel outil capable d'écrire bit à bit sur un périphérique de stockage.

4. Construction manuelle des paquets debian spécifiques du projet Tremplin

Ces paquets sont ceux qui sont placés dans le répertoire package de rpi23gen-image afin de construire directement une image complète mais il va de soi que ces paquets que nous proposons en ligne dans le dépôt Tremplin ont été construits à la main sur une raspberry identique à la cible que nous visons dans l'image, c'est cette procédure qui est décrite ici. Le travail est effectué sur une Raspberry pi construite avec l'image précédente (celle qui est à jour en ligne) mise à jour pour correspondre exactement à l'image sui est en cours de création.

Les paquets swig et node sont nécessaires à la compilation et au fonctionnement de mraa et upm mais pour le moment ces deux dernières librairies ne sont pas configurés pour utiliser les ressources node et swig organisées selon la hiérarchie Debian, de plus mraa et upm nnécessitent souvent des versions plus avancées de swig et node que celles de la distribution standard Debian, c'est pourquoi nous proposons ces paquets "repackagés" qui fonctionnent convenablement avec mraa et upm.

4.a Le cas particulier du paquet weewx

Le paquet weewx est proposé par son auteur mais un certain nombre de librairies sont nécessaires pour configurer weewx, il s'agit de : python,python-configobj,python-cheetah,python-imaging,python-serial,python-usb,libpcre2-dev, ces librairies ont été rajoutées dans le fichier de configuration initial et sont ajoutées par défaut lors de la construction de l'image.

Le paquet weewx se charge et s'installe avec les commandes :

wget http://weewx.com/downloads/weewx_3.6.2-1_all.deb
sudo dpkg -i weewx_3.6.2-1_all.deb

Fournir les paramètres correspondant à la station qui sera connectée via Weewx.

4.b Construction du paquet node

Nous allons compiler et installer le paquet à partir de la dernière version des sources. Un certain nombre de paquets sont indispensables :

sudo apt-get install build-essential git-core libssl-dev pkg-config libc-ares-dev zlib1g-dev devscripts

On récupère et on compile ensuite les sources.

wget https://nodejs.org/dist/v6.9.2/node-v6.9.2.tar.gz
tar xfvz node-v6.9.2.tar.gz
cd node-v6.9.2
./configure
make
sudo checkinstall

La dernière commande installe le logiciel node et en même temps produit un paquet debian qui a été utilisé pour construire l'image complète et qui peut être réutilisé autant que de nécessaire pour toutes les installs de raspi2 et 3.

Il est important de vérifier que nodejs, node-gyp et le proxy http fourni par node sont présents car les deux premiers sont nécessaires pour Swig et le troisième indispensable pour le bon fonctionnement de jupyterhub, il est aussi éventuellement utilisé lorsqu'on crée un site web en node sur la Raspberry Pi. S'il ne sont pas installés les ajouter avec les commandes :

sudo npm install -g nodejs
sudo npm install -g node-gyp
sudo npm install -g configurable-http-proxy

4.c Construction du paquet swig

La construction du paquet swig dépend des paquets pcre2-utils,libpcre++-dev,libpcre2-dev qui sont ajoutés dans le fichier de configuration pour la création de l'image afin d'éviter aux usagers qui souhaitent construire l'image d'avoir à charger à la main ces dépendances.

Pour que swig produise les excutables java il faut java disponible sur la machine, de même les exécutables, les include et les librairies node doivent être liées. Idem pour javascript (il faut donc impérativement compiler node avant swig).

sudo apt-get install openjdk-8-jdk
sudo ln -s /usr/local/bin/node /usr/bin/nodejs
sudo ln -s /usr/local/bin/node /usr/bin/node
sudo ln -s /usr/local/lib/node_modules/npm/bin/node-gyp-bin/node-gyp /usr/bin/node-gyp
sudo ln -s /usr/include/webkitgtk-4.0/JavaScriptCore /usr/include/JavaScriptCore

Il faut que les paquets nodejs et node-gyp soient installés pour pouvoir compiler swig mais il faudra ajouter la nouvelle version de node (ci-dessous) pour compiler mraa et upm. Vérifier la version de swig avant d'effectuer le téléchargement et au besoin modifier les deux premières commandes.

wget wget http://prdownloads.sourceforge.net/swig/swig-3.0.10.tar.gz 
cd swig-3.0.10
./configure
make
sudo checkinstall

La dernière commande installe le logiciel swig et en même temps produit un paquet debian qui a été utilisé pour construire l'image complète et qui peut être réutilisé autant que de nécessaire pour toutes les installs de raspi2 et 3.

4.d Construction du paquet mraa

Cette opération ne peut plus être faite à l'avance pour le moment sur une raspberry, il faut construire les librairies directement sur la machine nouvellement installée. Pour construire les deux paquets INTEL (MRAA et UPM) il est nécessaire de disposer des utilitaires opkg mis au point par INTEL pour sa distribution Yocto. Ils doivent être installés à partir du dépôt git :

git clone https://github.com/shr-project/opkg-utils.git
make
sudo checkinstall

le paquet opkg_1.0-1_armhf.deb est disponible dans le répertoire.

MRAA est une librairie de bas niveau permettant l'interaction avec le bus GPIOn elle est fournie par INTEL sous licence GPL sur GitHub. L'installation se fait par clonage depuis le dépôt

git clone https://github.com/intel-iot-devkit/mraa.git
cd mraa
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
sudo make install

Quand la construction des paquets refonctionnera il faudra remplacer les deux dernières lignes par :

cmake -DIPK=ON -DCMAKE_INSTALL_PREFIX=/usr ..
sudo checkinstall

Pour les utilisateurs de Yocto il est possible d'obtenir un pachage ipk en lançant la commande make package, noter que la construction debian ne se passe pas bien dans la situation décrite ici (peut-être à cause de dépendances non satisfaites (à examiner).

Le paquet mraa_YYYYMMDD-1_armhf.deb n'est plus fabriqué par cette méthode et il est conseillé de ne plus l'utiliser voir discussion sur git.

4.e Construction du paquet upm

UPM est une librairie de pilotes pour un gand nombre de capteurs et microcapteurs pouvant être connectés sur le bus GPIO de la RaspBerry Pi. Cette librairie permet d'interragir directement avec un capteur ou effecteur avec des instructions simples qui sont en fait des fonctions masquant la complexité de la programmation d'une interface. Toutefois il reste possible de passer des paramètres et d'insérer les appels à ces fonctions dans des programmes de haut niveau comme par exemple l'administration d'une station météorologique collectant et transmettant des données. Cette opération ne peut plus être faite à l'avance pour le moment sur une raspberry, il faut construire les librairies directement sur la machine nouvellement installée.

git clone https://github.com/intel-iot-devkit/upm.git
cd upm
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
sudo make install

Quand la construction des paquets refonctionnera il faudra remplacer les deux dernières lignes par :

cmake -DIPK=ON -DCMAKE_INSTALL_PREFIX=/usr ..
sudo checkinstall

Pour les utilisateurs de Yocto il est possible d'obtenir un pachage ipk en lançant la commande make package, noter que la construction debian ne se passe pas bien dans la situation décrite ici (peut-être à cause de dépendances non satisfaites (à examiner).

Le paquet upm_YYYYMMDD-1_armhf.deb n'est plus fabriqué par cette méthode et il est conseillé de ne plus l'utiliser voir discussion sur git.

4.f Construction du paquet libopenzwave

OpenZWave n'est pas disponible sur les plateformes zrm il est nécessaire de la compiler depuis les sources. Nous utiliserons la version du dépôt github.

cd ~/Logiciels
mkdir OpenZWave
cd OpenZwave
ggit clone https://github.com/OpenZWave/open-zwave.git
cd open-zwave
make
sudo make install

4.g Réglages et exploitation des paquets créés et postinstallation

Les 4 paquets debian qui viennent d'être créés doivent être transférés sur la machine hôte qui construit l'image dans le répertoire home_rpi23-gen-image/packages, ils seront alors automatiquement pris en compte par les scripts et intégrés à l'image. le paquet weewx devra être reconfiguré en fonction des paramètres de la station pilotée et si on ne souhaite pas piloter de station il faudra désactiver weewx qui consomme inutilement dans ce cas quelques ressources sudo update-rc.d -f weewxd remove.

Le paquet upm devra être construit sur la machine nouvellement installée car il n'est plus possible de construire un paquet sur la raspberry (cela reste possible sur un x86). La construction ne place pas les modules python dans l'endroit convenable pour Debian il faut donc créer un lien symbolique comme précisé ci-dessous ou tout autre moyen pour disposer des .py dans /usr/lib/python2.7/dist-packages de la nouvelle image.

Pour une production en chaîne de l'image il faut réaliser ces modifications sur une image installée puis recopier l'image avec modifications afin de proposer des images directement opérationnelles !

Une fois l'image créée la déposer sur une SD formattée en FAT32 (cf Chapitre 4), monter la SD puis effectuer les manipulations suivantes (vérifier que le répertoire dist-packages n'existe pas déjà, si c'est le cas pas besoin de le créer) :

sudo mkdir pointDeMontageSD/usr/lib/python2.7/dist-packages
cd pointDeMontageSD/usr/lib/python2.7/dist-packages
ln -s pointDeMontageSD/usr/lib/arm-linux-gnueabihf/python2.7/dist-packages/upm  /usr/lib/arm-linux-gnueabihf/python2.7/dist-packages/
ln -s pointDeMontageSD/usr/lib/arm-linux-gnueabihf/python2.7/dist-packages/mraa.py /usr/lib/arm-linux-gnueabihf/python2.7/dist-packages/
ln -s pointDeMontageSD/usr/lib/arm-linux-gnueabihf/python2.7/dist-packages/_mraa.so /usr/lib/arm-linux-gnueabihf/python2.7/dist-packages/

Les liens créés ne sont pas valides du fait du point de montage mais ils le seront dès que la SD sera racine du système, une autre solution est d'utiliser les chemins relatifs plutôt que les chemins absolus.

Activation du bus i2c

Il est nécessaire pour pouvoir utiliser le bus i2c de l'activer car dans l'image par défaut, bien que tout soit préparé il n'est pas actif. Deux manipulations sont nécessaires :

  • décommenter deux lignes du fichier /lib/modules-load.d/rpi2.conf pour qu'il ressemble à ceci
# bcm2708_rng
snd_bcm2835
i2c-bcm2708
i2c-dev
# rtc-ds1307
  • rajouter les deux lignes suivantes dans le fichier /boot/firmware/config.txt
# activate i2c0 i2c1
# i2c0 is used by the raspi for other functions and
# cannot be used for connecting sensors directly
dtoverlay=i2c0-bcm2708
dtoverlay=i2c1-bcm2708

Afin d'éviter d'utiliser la commande privilégiée root il suffit de mettre les utilisateurs qui vont utiliser le bus i2c dans le groupe i2c avec la commande :

sudo adduser ens-ife i2c
[sudo] Mot de passe de ens-ife : 
Ajout de l'utilisateur « ens-ife » au groupe « i2c »...
Ajout de l'utilisateur ens-ife au groupe i2c
Fait.

Vous pouvez aussi déplacer dans /home/ens-ife tous les dossiers que vous souhaiterez utiliser par la suite. S'ils sont dans l'image vous n'aurez pas à les copier n fois pour les n images créées.

Une fois que toutes les manips de postinstallation sont effectuées démonter la SD puis copier son contenu sur le disque dur (veiller à avoir la place nécessaire la taille de l'image peut varier)

dd if=/dev/mmcblk0 of=2016-08-19-debianStretchRpi2.img bs=8M conv=sparse count=450
450+0 enregistrements lus
450+0 enregistrements écrits
3774873600 bytes (3,8 GB, 3,5 GiB) copied, 338,623 s, 11,1 MB/s

J'ai choisi de limiter la taille de mon image à 7.6Go pour qu'elle puisse contenir dans une SD de 8Go, on a vu plus haut que la taille effective initiale de l'image compilée était de moins de 2Go ce qui laisse de la marge, même après l'installation des paquets supplémentaires. Une fois l'image copiée il faut bien sûr refaire sa bmap :

bmaptool create -o 2016-08-StretchRpi2.bmap 2016-08-19-debianStretchRpi2.img

L'image ainsi produite et sa bmap sont maintenant diffusables mais il est souhaitable de compresser l'image qui sinon est un peu.... encombrante

7z a -txz rpi2StretchTremplin-1.0.xz ./2016-08-19-debianStretchRpi2.img 
Scanning the drive:
1 file, 3774873600 bytes (3600 MiB)

Creating archive: rpi2StretchTremplin-1.0.xz

Items to compress: 1

Files read from disk: 1
Archive size: 1044415884 bytes (997 MiB)
Everything is Ok

Réseau

Il est aussi possible de préconfigurer le wifi, pour cela connectez votre machine debian d'installation au réseau que vous souhaitez préinstaller dans les raspi, une fois connectés allez chercher
* Soit le fichier portant le nom de votre réseau dans le répertoire /etc/NetworkManager et copiez ce fichier dans le même répertoire de votre raspi, au premier démarrage la raspi trouvera le réseau et pourra s'y connecter; * Soit la partie du fichier /etc/wicd/network.conf concernant la configuration du réseau auquel vous souhaitez vous connecter et recopiez la.

Ne pas oublier de vérifier que l'utilisateur créé par défaut (pour nous ens-ife) appartient au groupe netdev, si ce n'est pas le cas le rajouter sinon il ne pourra pas activer ou modifier le réseau WIFI.

Il est possible que le résolveur soit configuré pour une utilisation statique (en particulier si le réseau filaire est utilisé lors de la première connexion) cela ne pose aucun problème si la machine reste à demeure sur le même domaine en utilisant le filaire et le wifi. Par contre si la machine est susceptible de se connecter depuis un autre réseau il est nécessaire de passer le fichier de configuration du résolveur en mode dynamique pour cela effectuer les commandes suivantes :

sudo rm /etc/resolv.conf
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf

Pour terminer afin d'éviter que le réseau ne parvienne pas à fonctionner automatiquement lors de la première connexion et afin d'éviter de laisser des traces confidentielles il est impératif de vider de leur contenu les fichiers /etc/wicd/wired-settings.conf et /etc/wicd/wireless-settings.conf et de supprimer les fichiers de sauvegarde terminés par "~" pour cela on peut utiliser ls commandes suivantes ou éditer les fichiers et les vider à la main.

sudo rm /etc/wicd/wired-settings.conf
sudo rm /etc/wicd/wireless-settings.conf
sudo touch /etc/wicd/wired-settings.conf
sudo touch /etc/wicd/wireless-settings.conf
sudo rm /etc/wicd/*~

Il sera nécessaire de changer le nom de l'interface filaire pour qu'elle puisse se connecter, le nom de l'interface est obtenu par la commande :

ip address
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
    2:enxb827eb3c732f: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether b8:27:eb:3c:73:2f brd ff:ff:ff:ff:ff:ff
    3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether b8:27:eb:69:26:7a brd ff:ff:ff:ff:ff:ff
    inet 10.0.1.14/24 brd 10.0.1.255 scope global wlan0
       valid_lft forever preferred_lft forever
    inet6 fe80::ba27:ebff:fe69:267a/64 scope link 
       valid_lft forever preferred_lft forever

le nom de l'interface est ici enxb827eb3c732f

Divers

Si vous souhaitez arrêter la raspi en ligne de commande installer le paquet suivant qui est exclu de l'image initiale pour des raisons techniques, il est ajouté dans l'image IF-ENS de Lyon.

sudo apt-get install systemd-sysv

Installation d'un service de terminaux graphiques à distance

Une façon élaborée pour atteindre cet objectif est d'avoir un user dédié à l'accès par terminal serveur, nous utiliserons l'utilisateur callisto mais il est possible de créer un tsuser et de l'utiliser par exemple (par défaut l'utilisateur choisi est callisto) :

adduser tsuser
su tsuser
vncpasswd

On ajoute ensuite le fichier suivant dans le répertoire /etc/init.d nommé par exemple vncserver, l'utilisateur callisto doit éventuellement être changé en fonction des choix effectués.

#!/bin/sh -e
### BEGIN INIT INFO
# Provides:          vncserver
# Required-Start:    networking
# Default-Start:     S
# Default-Stop:      0 6
### END INIT INFO

PATH="$PATH:/usr/X11R6/bin/"

# The Username:Group that will run VNC
export USER="tsuser"
#${RUNAS}

# The display that VNC will use
DISPLAY="1"

# Color depth (between 8 and 32)
DEPTH="16"

# The Desktop geometry to use.
#GEOMETRY="<WIDTH>x<HEIGHT>"
#GEOMETRY="800x600"
GEOMETRY="1024x768"
#GEOMETRY="1280x1024"

# The name that the VNC Desktop will have.
NAME="my-vnc-server"

OPTIONS="-name ${NAME} -depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"

. /lib/lsb/init-functions

case "$1" in
start)
log_action_begin_msg "Starting vncserver for user '${USER}' on localhost:${DISPLAY}"
su ${USER} -c "/usr/bin/vncserver ${OPTIONS}"
;;

stop)
log_action_begin_msg "Stoping vncserver for user '${USER}' on localhost:${DISPLAY}"
su ${USER} -c "/usr/bin/vncserver -kill :${DISPLAY}"
;;

restart)
$0 stop
$0 start
;;
esac

exit 0

Rendre le fichier exécutable et l'installer dans le système d'applications au démarrage :

sudo chmod +x /etc/init.d/vncserver
sudo update-rc.d vncserver defaults

Vncserver est alors un service manipulable comme tous les autres services de la machine. ne pas oublier de l'arrêter pour éviter de broadcaster en permanence sur le réseau.

Une fois la RasPI démarrée il suffit de chercher une machine faisant du broadcast sur le port 5901, notons qu'on trouvera tous les serveurs faisant du broacast sur ce port... On se connecte en utilisant un client VNC par exemple xvncviewer ou remmina ou tout autre client de terminal server!

Ce mode de fonctionnement n'est utile bien sûr que si votre raspberry acquiert son IP automatiquement via DHCP, il va de soi que si votre raspi a une IP fixe pas besoin de cette astuce. La configuration d'une IP fixe n'est pas traitée ici

Noter qu'il est possible à tout moment de lancer un serveur de terminaux sur la raspberry avec par exemple le service vncserver décrit ci-dessus et de retrouver sur un autre ordinateur un environnement de travail complet fourni par la raspi. (Ne pas oublier de configurer le paramètres de son vncserver pour avoir tout l'environnement opérationnel).

Configurations diverses pour l'utilisation de python

Le bus GPIO de la Raspberry Pi n'est pas aussi complet et souple que celui d'un Arduino ou d'un Edison, chacune de ces machines a des propriétés spécifiques se traduisant par des interactions différentes avec leur bus GPIO. De plus le python étant souvent utilisé en formation les outils jupyter et jupyterhub peuvent s'avérer extrêmement performants. Ce paragraphe propose un certain nombre d'installations et configurations complémentaires mais fort utiles.

Installation d'environnements virtuels python

Avec la distribution stretch les deux versions python2.7 et python3.5 cohabitent sans aucun problème toutefois il peut être intéressant de faire évoluer indépendamment ces deux univers. Il est possible d'installer des environnements virtuels avec la commande :

virtualenv -p python2.7 --system-site-packages VirtPython2
virtualenv -p python3.5 --system-site-packages VirtPython3

Installation de bibliothèques complémentaires pour le bus GPIO

Le bus GPIO de la Raspberry Pi est assez particulier au point qu'il existe une bibliothèque construite spécialement pour la Raspberry Pi. Cette bibliothèque est très utile dans certains domaines en particulier pour augmenter le nombre de broches en ode PWM utile pour certains programmes voir les cahiers de programmes jupyterhub.

Cette bibliothèque est installée via pip :

sudo pip install Rpi.GPIO
sudo pip3 install Rpi.GPIO

Installation de jupyter et jupyterhub

Ce point est abordé en détail dans l'article Apprendre à coder avec la météo dans un environnement web (LED, capteurs,affichage...)


Webographie

  1. Site principal Raspberry
  2. Scripts de création de l'image
  3. Logiciel mraa
  4. Logiciel upm
  5. Image Debian Live
  6. Comment créer une clef USB bootable Debian

Commentaires