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

Motivations

Le projet "Météo et 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 à l'école.

Cette intersection s'est matérialisée autour des nano-ordinateurs (Raspberry Pi, Odroĩd, Joule) qui pour une somme abordable pour un établissement d'enseignement permettent de disposer de véritables ordinateurs multi-coeurs (ou multi-core processors) de la taille d'une grosse boîte 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 simples consommateurs 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 (proche du langage-machine, du niveau de base de l'ordinateur) et le terrain vierge qu'elles fournissent 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 simplement que ça marche ou d'accompagner ceux qui aiment savoir comment ça marche et faire les choses par eux même (DIY), 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" (fichier à télécharger sur une carte SD qui permet de démarrer et configurer la Raspberry Pi) une image opérationnelle contenant tous les outils nécessaires pour un projet Météo prêts à l'emploi, elle est disponible au téléchargement en version Pi3 et en version Pi2. 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éthode 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).


Remerciements

Carole Larose, Éric le Jan et Charles-Henri Eyraud pour les relectures conseils et observations. Charles-Henri Eyraud pour la contribution sur l'installation de l'image sur un autre OS que linux.


Sommaire

  1. Présentation sommaire de la 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

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

    c. Utilisation de la RaspPi à distance

    d. Activation de la caméra

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

    c. Finitions 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 libopenzwave

    e. Construction du paquet modus

    f. Construction du paquet mraa

    g. Construction du paquet upm

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

  5. Installation de services utilisables à distance

    a.Installation d'un service de terminaux graphiques à distance

    b.Configurations diverses pour l'utilisation de python avec le bus GPIO

    c. Installation de jupyter et jupyterhub

  6. Propagation de l'image


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.7.0
  5. mraa software
  6. upm software
  7. Client et serveur de terminaux

Préambule : Raccourci pour essayer l'environnement de programmation et l'affichage distant

L'image Tremplin configure la Raspberry de façon à ce qu'elle permette par défaut sans aucune manipulation de faire un essai de : * de l'environnement web d'apprentissage du codage -> Le cahier de programmes * de l'affichage distant sur un ordinateur de l'écran de la Raspberry. Une seule contrainte.... brancher la Raspberry en mode filaire et connaître l'IP obtenue via le DHCP (Si cette information n'est pas connue se reporter au chapitre 2.b). Supposons que l'adresse obtenue par la Raspberry soit aaa.aaa.aaa.aaa.

  1. Ouvrir dans un navigateur web l'adresse https://aaa.aaa.aaa.aaa:8000 une invite de login apparait saisir l'utilisateur moonmot de passe guest Cliquer sur le cahier de programme et ouvrir un des exemples (prevoir DEL et capteurs).
  2. À l'aide d'un client de serveurs de terminaux ouvrir l'adresse aaa.aaa.aaa.aaa:1 ou aaa.aaa.aaa.aaa port 5901 suivant les outils utilisés, login tsuser mot de passe raspife2 ou raspife3 suivant le modèle; l'écran de la raspberry Pi s'affiche dans la fenêtre du client de serveur de terminaux.

1. Présentation sommaire des Raspberry Pi

Une Raspbery PI 2 ou 3 est un véritable ordinateur "complet", il a un processeur, de la mémoire et un espace de stockage. On peut l'utiliser en ordinateur de bureau grâce à son connecteur HDMI qui lui permet d'afficher sur un écran et à ses ports USB sur lesquels 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 (grâce au port HDMI) et on peut enfin l'utiliser comme un serveur sans écran 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 tient au fait 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 en réalité un certain nombre de contraintes qui peuvent finalement avoir un impact sur l'usage courant.

La seconde concerne la mémoire qui est fixée et intégrée dans le processeur. Sa taille est un des facteurs qui peuvent limiter la performance de la Raspberry Pi (les nano-ordinateurs Odroïd par exemple proposent plus de mémoire et par conséquent 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 trouvent sur une micro-SD, et lorsque l'on change de micro-SD on change littéralement de machine ! Il est donc possible à un coût raisonnable de créer plusieurs profils et donc plusieurs machines en fonction de ses besoins.

Le point le plus crucial est que la Raspberry Pi a besoin pour démarrer d'un petit morceau d'espace de stockage formaté comme celui des clefs USB (en FAT32) qui contient un code binaire propriétaire dépendant du processeur utilisé. Il n'est donc pas possible d'installer une Raspberry Pi comme on installerait un ordinateur portable ordinaire (de façon interactive avec un CD ou une clef USB linux). À cause de cette petite contrainte, la méthode la plus communément proposée est de construire une image sur un ordinateur tiers puis de copier cette image bit par 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 seconde partie. Après cela, nous expliquons comment construire sa propre image (sur le modèle de l'image nécessaire pour le projet Tremplin des Sciences) en indiquant les opérations à effectuer pour en changer les paramètres.

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 et la facilité avec laquelle l'usager qu'il va devenir pourra les obtenir, sans jamais parler de ce que cet objet (qui est un ordinateur souvent puissant) pourrait faire si d'autres choix de logiciels avaient été faits et bien souvent sans l'informer de tout ce que l'appareil fait sans qu'il le sache.

Pour la Raspberry Pi vous disposez d'un peu de matériel électronique inerte et d'une carte mémoire SD vierge, vous devez donc choisir parmi 10 systèmes d'exploitation possibles (au 05/01/2017) ce que sera le coeur de votre machine et ce qu'elle pourra faire. 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 vos positions militantes.

J'ai choisi la distribution linux Debian Stretch parce que c'est la distribution qui permet de compiler facilement 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 Debian en ligne (données d'installation et logiciels téléchargeables par tous). 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 Raspberry Pi Linux git. Dans ce qui suit la dernière version a été choisie car elle correspondait à la version du noyau de 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") quand on alimente la Raspberry Pi. Le site Raspberry Pi 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 libres existent pour ces fonctions : notez bien que ce n'est pas parce que la Raspberry Pi est un dispositif ouvert que tous les logiciels qui fonctionnent dessus sont des logiciels libres ou opensource...).

La vitesse de la Raspberry Pi dépend fortement de la vitesse en écriture de la micro-SD. Les cartes SD de classe 10 (débit de 10 Mo/s) sont plutôt dépassées : choisissez de préférence des cartes SD Ultra-haute vitesse (UHS-I ou UHS-II), et notez que la vitesse dépend aussi souvent du prix. Vérifiez bien la vitesse en écriture qui peut être très différente de la vitesse de lecture (c'est le cas en particulier pour des SD spécialisées photo pour minimiser les temps de transfert).

L'installation décrite ici se fait via des lignes de commande tapées sur une machine 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 installer l'image avec d'autres OS qui sont parfaitement utilisables avec l'image proposée ici. Quelques conseils sont fournis dans le déroulé ci-dessous pour permettre aussi d'installer l'image depuis l'OS le plus répandu.

Si vous n'avez pas de machine Debian et que vous souhaitiez suivre le mode d'emploi dans le monde linux, 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 pour Debian (une clé usb à partir de laquelle un ordinateur peut installer un sytème d'exploitation différent). (Tout autre distribution linux devrait d'ailleurs aussi bien fonctionner.)

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

Formater la SD linux

Il est toujours prudent de "nettoyer" sa micro SD et de la formater proprement avant de commencer. Formater votre SD en fat32 : 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 à traiter uniquement 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 dans les menus déroulants pour effacer les partitions s'il en existe, puis sélectionner toute la surface et ajouter une seule partition primaire en fat32. Exécuter l'opération et quitter gparted.

Formater la SD (autre OS)

Si vous souhaitez utiliser une carte SD préformatée pour la RaspberryPi, il faut tout de même la formater. Mais Windows ne reconnait pas naturellement le système de fichiers ext4, il est donc nécessaire d'installer sur votre ordinateur un logiciel fournissant cette fonctionnalité, par exemple SD Card Formatter) SD Card Formatter.

SD Card Formatter

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, il se peut qu'elles soient compatibles mais le bon fonctionnement n'est pas garanti.

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  

Décompresser l'image téléchargée

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

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

Copier l'image téléchargée sur la microSD (autre OS)

Sous windows la manipulation d'images ISO n'est pas possible en standard , télécharger le logiciel Win32Disk puis l'utiliser pour recopier l'image téléchargée sur la carte SD (voir image ci-dessous):

Logiciel Win32diskmanager

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 aussi modifier le fichier de configuration du système /etc/fstab en conséquence pour que cela fontionne). Pour redimensionner la partition deux procédures sont possibles :

Soit 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 Raspberry Pi, vous disposez maintenant d'une Raspberry Pi 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).

Soit en utilisant la Raspberry Pi nouvellement installée (à faire plus tard, après le démarage et la mise en fonction de la raspi)

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-dessus est inaplicable et la solution ci-dessous utilisant la Raspberry Pi est obligatoire.

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

sudo fdisk /dev/mmcblk0
  • Taper m pour voir la liste des commandes (juste pour information)
  • 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 et écrire N pour "remove signature",
    • pour finir taper w.

Taper ensuite sudo reboot puis :

sudo resize2fs /dev/mmcblk0p2
sudo reboot

Après ce second redémarrage la racine du système occupe maintenant la totalité de l'espace disponible sur la SD.

Avant de monter la micro-SD sur la Raspberry ilest nécessaire d'effectuer les opérations réseau que l'on souhaite mettre en oeuvre. L'image a été testée physiquement sur une raspberry qui a écrit dans la configuration réseau les paramètres physiques de sa carte réseau, il faut les changer pour cela vérifier que le fichier /etc/wicd/manager-settings.conf n'existe pas, s'il existe le supprimer. Attention de ne pas supprimer ce fichier sur son ordinateur tiers mais bien sur la carte sd !

C'est ici qu'il est aussi possible pour l'administrateur d'insérer les paramètres de connexion Wifi dans le fichier /etc/wicd/wireless-settings.conf. ces paramètres peuvent être copiés collés depuis le fichier de configuration de n'importe quelle autre machine linux connectée au réseau mais cela implique de manipuler des fichiers à accès privilégié contenant des informations personnelles. Nous ne proposons pas cette manipulation pour cette raison mais elle peut être très utile pour l'administrateur.

2.b Premier démarrage de la Raspberry Pi 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 Raspberry Pi3 ou une Raspberry Pi2 equipée d'un connecteur Wifi, 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 au premier démarrage il est obligatoire de fournir les informations de connection (nom du réseau et mot de passe) avant de démarrer la Raspberry Pi (cf. plus haut), cette manipumation n'est pas simple et est plutôt réservée à des usagers avancés. Il est donc tout de même recommandé pour le premier branchement d'être connecté via le réseau filaire. Même si l'image proposée permet de se passer d'un clavier/écran/souris le plus simple est tout de même de se placer dans une configuration complète avec ces 3 éléments.

Connexion en mode "ordinateur"

Pour la première connection il est donc souhaitable/confortable de disposer d'un environnement complet écran/clavier/souris qui rend la Raspberry Pi accessible de façon "ordinaire". 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)
    • moon (utilisateur ordinaire de test)
  • Le mot de passe de départ des 2 premiers comptes hors ens-ife est AChanger1$ (qui suggère qu'il doit être efectivement changé dès que possible !!) celui de moon est guest.

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.

Connexion à distance

Le point de départ est de connaître l'adresse IP de la Raspberry, si on n'a pas d'accès aux outils de contrôle locaux du réseau la commande suivante fournit les informations nécessaires à atteindre la Raspberry:

sudo nmap -sP -n 192.168.10.0/24  | grep -e Raspberry -B2

Nmap scan report for 192.168.10.101
Host is up (0.010s latency).
MAC Address: **:**:**:**:**:** (Raspberry Pi Foundation)

On trouve dans la réponse ci-dessus l'adresse IP de la raspberry ainsi son adresse MAC. 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 certains 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 et vous pouvez vous connecter depuis un terminal/console.

Installation aveugle

On se connecte à la Raspberry avec une console avec la commande ssh localadm@***.***.***.*** ... correspondant à l'adresse trouvée ci-dessus (le mot de passe initial est "AChanger1$".

Toutes les manipulations sont effectuées en ligne de commandes.

Installation avec une interface graphique

Il n'est pas nécessaire de disposer d'un clavier et d'un écran une fois que l'on connait l'adresse de la Raspberry, il suffit depuis la console obtenue ci dessus de lancer le service de terminaux avec la commande suivante :

localadm@raspife2:~$ sudo service vncserver start

Nous espérons que vous avez reçu de votre administrateur système local les consignes traditionnelles. Généralement, elles se concentrent sur ces trois éléments :

    #1) Respectez la vie privée des autres.
    #2) Réfléchissez avant d'utiliser le clavier.
    #3) De grands pouvoirs confèrent de grandes responsabilités.

[sudo] Mot de passe de localadm : 

Utiliser maintenant un client de serveur de terminaux et afficher l'écran de la Raspberry qui se trouve aux coordonnées suivantes * ...:1 ou * ... port 5901 * l'utilisateur est tsuser sont mot de passe AChanger1$

On accède alors à toutes les fonctionnalités de la Raspberry affichées dans une fenêtre de l'écran de l'ordinateur de travail et on peut aborder les modifications suivantes.

Adresse MAC ou reconnaissance de l'interface WIFI

Une fois connecté on peut facilement vérifier l'adresse MAC de son interface WIFI pour cela on utilise l'instruction ip sur la Raspberry Pi :

ip addr show

qui fournit dans le cas ou la Raspberry Pi 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.

Modifier le nom de la raspberry Pi

Si besoin il est possible de changer le nom de sa Raspberry Pi, s'il n'est pas installé ajouter le paquet dbus puis positionner la variable hostname sur le nouveau nom choisi :

sudo apt-get install -y dbus
hostname=mouveauNomDeLaRaspberry

Éditer le fichier /etc/hosts et remplacer raspife3 par le nouveau nom de la machine

jed /etc/hosts
127.0.0.1      mouveauNomDeLaRaspberry

Appliquer les changements puis redémarrer.

sudo hostnamectl set-hostname "$hostname"
sudo shutdown -r now

Reconfiguration du réseau filaire (si besoin et si anomalies de connexion)

Dans le cas de la Raspberry Pi2, 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 limiter leur accès sur un réseau 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, moon...

Le nom de l'interface filaire qui s'est autoconfiguré au démarrage est stocké dans le fichier /etc/wicd/manager-settings.conf, pour obtenir le nom de l'interface ouvrir l'outil graphique de gestion de réseau en mode graphique ou en mode console 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 nom de l'interface est dans cet exemple enxb827eb3c732f, ce numéro sera toujours le même si l'image a été construite de la même façon.

Le contenu du fichier manager-settings.conf doit ressembler à ceci (être root pour voir le contenu):

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

En cas de problème il est possible de réinitialiser toute la configuration en effectuant 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

Pour la Raspberry Pi2 si un WIFI USB est présent et si le paquet contenant les pilotes a été installé on est dans la même situation que la Raspberry Pi3 avec un wifi qui se configure simplement dans l'intterface graphique.

Mise en place du confort de base

Les utilisateurs initiaux ens-ife et localadm sont des utilisateurs privilégiés. Il est dangereux et déconseillé 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 méthode ci-dessous). Créer un utiisateur et continuer dans l'espace de cet utilisateur, il est possible de travailler en tant qu'utilisateur moon, le compte a été préconfiguré par défaut.

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
  • le groupe gpio pour accéder au bus gpio
  • le groupe netdev pour accéder aux paramètres du réseau.
  • le groupe plugdev pour accéder au montage des clés USB avec pmount.
  • le groupe jupyterhub pour accéder aux services de jupyterhub
sudo adduser myUser netdev
sudo adduser myUser plugdev
sudo adduser myUser gpio
sudo adduser myUser i2c 
sudo adduser myUser jupyterhub 

2.c Utilisation graphique de la RaspPi à distance

L'utilisation de la ligne de commandes n'est pas forcément facile d'accès 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 proposée est l'utilisation du serveur de terminaux déjà utilisé plus haut. Le serveur de terminaux sur la Raspberry Pi est installé par défaut et le service est mis en place mais non activé. Lorsque l'on ne souhaite pas se connecter via un environnement graphique à distance, 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 automatiquement 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 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 : tsuser
  • 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

Depuis une console n'importe quel user peut lancer un serveur de terminaux :

moon@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 Pi sur l'écran de n'importe quel ordinateur utilisant un client de serveur de terminaux par exemple le client opensource tightvncserver.

Attention à ne pas empiler des serveurs de terminaux nous avons déjà vu comment arrêter le service, mais si on lance un serveur de terminaux depuis le compte d'un utilisateur il faut l'arrêter avec la commande :

moon@raspife3:~$ vncserver -kill :1

Si par mégarde plusieurs serveurs ont été empilés ils prennent des nombres croissants :2 :3 etc

2.d Activation de la caméra raspberry Pi

Le constructeur propose une caméra parfois appelée raspicam Qui permet de prendre des photos ou des vidéos. Par défaut dans l'image IFÉ-ENS de Lyon la caméra est désactivée afin de ménager toute la mémoire pour les fonctions de service autour du pilotage des capteurs météo ou des autres fonctions. IL est nécessaire d'intervenir sur les fichiers de configuration de la raspberry Pi et de charger un module optionnel du noyau, les manipulations sont simples mais doivent être effectuées avec précaution car les fichiers de configuration et les modules du noyau régissent le fonctionnement de la Raspberry.

Modifier le contenu du fichier /boot/config.txt avec un éditeur de texte

Éditer le fichier et modifier la fin du fichier ci dessous

gpu_mem=16
initramfs initramfs-4.9.22-v7+ followkernel
dtparam=i2c_arm=on
dtparam=spi=on

# camera activation
# To activate camera at least uncomment the two following lines
# AND comment the line above gpu_mem=16
#
#start_x=1             # essential
#gpu_mem=128           # at least, or maybe more if you wish
#disable_camera_led=1  # optional, if you don't want the led to glow

en

#gpu_mem=16
initramfs initramfs-4.9.22-v7+ followkernel
dtparam=i2c_arm=on
dtparam=spi=on

# camera activation
# To activate camera at least uncomment the two following lines
# AND comment the line above gpu_mem=16
#
start_x=1             # essential
gpu_mem=128           # at least, or maybe more if you wish
#disable_camera_led=1  # optional, if you don't want the led to glow

Les # en début de ligne transforment une ligne en commantaire, on a donc commenté une ligne et décommenté deux autres lignes.

pour charger le module dans le noyau il suffit d'exécuter la commande privilégiée suivante (avec l'utilisateur localadm)

sudo modprobe bcm2835-v4l2

Il faut rebooter la raspberry pi, au redémarrage le device /dev/video0 est apparu et est maintenant disponible et peut être utilisé comme tout autre caméra sous linux.

Le fonctionnement a été testé avec ffmpeg logiciel audio/video polyvalent, des exemples d'utilisation seront proposés dans un autre article.

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

Cette opération permet de garder la cohérence à jour du système d'exploitation. Elle est facultative mais conseillée.

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 depuis le compte administrateur local localadmm.

sudo apt-get update
sudo apt-get upgrade
sudo 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  -DWERROR=off -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/nomDuPiloteSupprimé
  • soit vous reconnaissez l'erreur dans le code 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É par exemple)

Il faut alors les télécharger (la première fois seulement : - 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 -DWERROR=off -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 Pi 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

Ce paragraphe décrit la procédure à suivre pour construire soi-même une image Debian Stretch opérationnelle sur une Raspberry Pi3. 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 :

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 ressource selon leurs besoins.

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 Pi cible pour construire l'image, les paquets suivants doivent être installés sur la machine hôte : debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc. Tester la présence de ces paquets puis les installer si nécessaire :

for i in debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc psmisc; do dpkg -l $i;done

Tout paquet manquant sera signalé par : dpkg-query: aucun paquet ne correspond à ... il faut alors l'installer

sudo apt-get install debootstrap debian-archive-keyring qemu-user-static binfmt-support dosfstools rsync bmap-tools whois git bc pmisc crossbuild-essential-armhf gparted wget 7z

J'ai ajouté les paquets crossbuild-essential-armhf gparted wget 7z qui sont aussi utiles dans la procédure ci-dessous. Il est aussi possible de créer un environnement de développement armhf (chroot) indépendant du processus de création de l'image avec les commandes suivantes :

qemu-debootstrap --arch=armhf sid /chroots/sid-armhf ftp://ftp.debian.org/debian/
chroot /chroots/sid-armhf
mount -t proc proc /proc

Il peut servir à produire des paquets ou compiler des logiciels plus rapidement en utilisant la puissance d'un ordinateur tiers. Il d'installer sur l'émulation les sources et logiciels nécessaires à la compilation des programmes souhaités.

Télécharger le noyau pour construire l'image (optionnel)

Il est possible de choisir la version du noyau que l'on souhaite utiliser pour notre image car le domaine raspberrypi sur git en propose plusieurs. Nous allon télécharger la version 4.X :

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

Le code source du noyau se décompresse dans un dossier nommé linux, nous verrons comment l'utiliser plus tard.

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 1.5 Go à plus de 3.5 Go). Deux dépôts sont proposés ci-dessous, le dépôt original et le dépôt contenant une versions avec les choix effectués pour construire les images raspife2 et raspife3

git clone https://github.com/drtyhlpr/rpi23-gen-image.git
git clone https://github.com/g-vidal/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. Le dossier templates contient la liste des configurations particulières qui seront appliquées à notre image, le dossier packages contient les logiciels hors dépôt qui seront utilisés.

itzawisis.€ : ls -al
total 852
drwxr-xr-x  8 vidal vidal   4096 févr. 24 01:31 ./
drwxr-xr-x  9 vidal vidal   4096 févr.  8 08:41 ../
drwxr-xr-x  2 vidal vidal   4096 févr. 23 02:45 bootstrap.d/
-rw-r--r--  1 vidal vidal 714143 déc.  11 21:46 createrpi3.txt
drwxr-xr-x 15 vidal vidal   4096 sept.  7 16:02 files/
-rw-r--r--  1 vidal vidal   2153 févr. 23 02:45 functions.sh
drwxr-xr-x  8 vidal vidal   4096 févr. 23 19:37 .git/
-rw-r--r--  1 vidal vidal     43 sept.  7 16:02 .gitignore
drwxr-xr-x  3 vidal vidal   4096 nov.  24 23:49 images/
-rw-r--r--  1 vidal vidal  18092 sept.  7 16:02 LICENSE
drwxr-xr-x  2 vidal vidal   4096 déc.   4 18:46 packages/
-rw-r--r--  1 vidal vidal  23740 févr. 23 02:45 README.md
-rwxr-xr-x  1 vidal vidal  19550 févr. 23 02:45 rpi23-gen-image.sh*
-rwxr-xr-x  1 vidal vidal  18053 déc.  11 20:23 rpi3-gen-image.sh*
drwxr-xr-x  2 vidal vidal   4096 févr. 24 02:12 templates/

Il est nécessaire de fixer un certain nombre de variables pour réaliser une image correspondant à nos besoins. Pour simplifier cette action il est proposé de regrouper ces paramètres à l'intérieur d'un fichier qui est appellé par le script principal cela permet de reproduire simplement la génération d'une image. des modèles sont fournis dans le répertoire templates et il suffit de rajouter son propre fichier de configuration dans ce répertoire pour qu'il puisse être utilisé par le processus de création.

ls -al templates/
total 32
drwxr-xr-x 2 vidal vidal 4096 avril  1 15:39 ./
drwxr-xr-x 7 vidal vidal 4096 mars  21 10:23 ../
-rwxr-xr-x 1 vidal vidal 2501 avril  1 15:32 createraspife2*
-rwxr-xr-x 1 vidal vidal 2483 avril  1 15:25 createraspife3*
-rw-r--r-- 1 vidal vidal   72 mars  21 10:06 rpi2jessie
-rw-r--r-- 1 vidal vidal   91 mars  21 10:06 rpi2stretch
-rw-r--r-- 1 vidal vidal  102 mars  21 10:06 rpi3jessie
-rw-r--r-- 1 vidal vidal  103 mars  21 10:06 rpi3stretch

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

Ces fichiers sont différents car les deux Raspberry ne proposent pas les mêmes ressources notamment au niveau des interfaces réseau.

Raspberry Pi3

L'image que nous allons créer sera baptisée raspife3 pour signaler qu'elle est construite pour une Raspberry Pi3 du projet IFÉ Tremplin pour l'Enseignement des Sciences. Les paramètres de création ont été regroupés dans le fichier createraspife3 du dossier templates, ce fichier est reproduit ci-dessous :

# Configuration file raspi3 Stretch IFÉ 2017/04/15
#
APT_SERVER=ftp.fr.debian.org
APT_INCLUDES="gnupg,gnupg2,firmware-linux-nonfree,firmware-linux,tightvncserver,build-essential,git,cmake,libjson-c-dev,unzip,\
bison,libboost-all-dev,automake,autoconf,autogen,libtool,pkg-config,checkinstall,python3,python3-dev,menulibre,\
libnotify-bin,python,python-configobj,python-cheetah,python-imaging,python-serial,python-usb,python-dev,\
python-tk,python3-tk,python3-scipy,pandoc,python-pypandoc,python3-pypandoc,python-pandocfilters,python3-pandocfilters, \
pcre2-utils,libpcre++-dev,libpcre2-dev,libjpeg-dev,jed,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,\
texlive,texlive-xetex, \
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-dev,libpng16-16,\
nmap,libltdl-dev,lxsession,openbox-lxde-session,lxde,nginx-extras,ffmpeg"
#----------------------
RPI_MODEL=3 
RELEASE="stretch" 
HOSTNAME="raspife3" 
PASSWORD="**************"
USER_PASSWORD="************"
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_I2C=true
ENABLE_SPI=false
ENABLE_IPV6=true 
ENABLE_SSHD=true 
ENABLE_NONFREE=true 
ENABLE_WIRELESS=true
ENABLE_RSYSLOG=true 
ENABLE_SOUND=true 
ENABLE_HWRANDOM=true 
ENABLE_MINGPU=true 
ENABLE_DBUS=true 
ENABLE_XORG=true
ENABLE_WM="lxdm" 
#------------------------
ENABLE_MINBASE=false
ENABLE_REDUCE=false
ENABLE_UBOOT=false
ENABLE_FBTURBO=true
ENABLE_IPTABLES=false
ENABLE_USER=true 
USER_NAME=ens-ife
ENABLE_ROOT=true 
ENABLE_HARDNET=true
ENABLE_INITRAMFS=true 
ENABLE_IFNAMES=true
#------------------------
ENABLE_ROOT_SSH=false  
SSH_LIMIT_USERS=false
SSH_ROOT_PUB_KEY="/home/vidal/.ssh/authorized_keys"
SSH_USER_PUB_KEY="/home/vidal/.ssh/authorized_keys"
#------------------------
BUILD_KERNEL=true 
KERNEL_REDUCE=false
KERNEL_HEADERS=true
KERNEL_REMOVESRC=true
KERNELSRC_CLEAN=true
KERNELSRC_CONFIG=true
#------------------------
REDUCE_APT=false 
REDUCE_DOC=true 
REDUCE_MAN=false 
REDUCE_HWDB=true
REDUCE_BASH=false 
REDUCE_SSHD=false
REDUCE_LOCALE=false
#-------------------------
ENABLE_CRYPTFS=false
#-------------------------
BASEDIR=/pathTo/images/${RELEASE}
IMAGE_NAME=${BASEDIR}/${DATE}-rpi${RPI_MODEL}-${RELEASE}

Dans certaines configurations il a été 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

Raspberry Pi2

L'image que nous allons créer sera baptisée raspife2 pour signaler qu'elle est construite pour une Raspberry Pi2 du projet IFÉ Tremplin pour l'Enseignement des Sciences. Tous les paramètres de création ont été regroupés dans un fichier du répertoire templates appelé createraspife2. Le contenu de ce fichier est reproduit ci-dessous :

# Configuration file raspi2 Stretch IFÉ 2017/04/01
#
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,unzip,\
bison,libboost-all-dev,automake,autoconf,autogen,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,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-dev,libpng16-16,\
lxsession,openbox-lxde-session,lxde"
#----------------------
RPI_MODEL=2 
RELEASE="stretch" 
HOSTNAME="raspife2" 
PASSWORD="AChanger1$"
USER_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=true 
ENABLE_I2C=true
ENABLE_SPI=true
ENABLE_IPV6=true 
ENABLE_SSHD=true 
ENABLE_NONFREE=true 
ENABLE_WIRELESS=false
ENABLE_RSYSLOG=true 
ENABLE_SOUND=true 
ENABLE_HWRANDOM=true 
ENABLE_MINGPU=true 
ENABLE_DBUS=true 
ENABLE_XORG=true
ENABLE_WM="lxdm" 
#------------------------
ENABLE_MINBASE=false
ENABLE_REDUCE=false
ENABLE_UBOOT=false
ENABLE_FBTURBO=true
ENABLE_IPTABLES=false
ENABLE_USER=true 
USER_NAME=ens-ife
ENABLE_ROOT=true 
ENABLE_HARDNET=true
ENABLE_INITRAMFS=true 
ENABLE_IFNAMES=true
#------------------------
ENABLE_ROOT_SSH=false  
SSH_LIMIT_USERS=false
SSH_ROOT_PUB_KEY="/home/vidal/.ssh/authorized_keys"
SSH_USER_PUB_KEY="/home/vidal/.ssh/authorized_keys"
#------------------------
BUILD_KERNEL=true 
KERNEL_REDUCE=false
KERNEL_HEADERS=true
KERNEL_REMOVESRC=true
KERNELSRC_CLEAN=true
KERNELSRC_CONFIG=true
#------------------------
REDUCE_APT=false 
REDUCE_DOC=true 
REDUCE_MAN=false 
REDUCE_HWDB=true
REDUCE_BASH=false 
REDUCE_SSHD=false
REDUCE_LOCALE=false
#-------------------------
ENABLE_CRYPTFS=false
#-------------------------
BASEDIR=/media/vidal/ExternGV/Nano-Ordinateurs/RaspberryPi/ImageBuilder/images/${RELEASE}
DATE=`date +%Y-%m-%d`
IMAGE_NAME=${BASEDIR}/${DATE}-rpi${RPI_MODEL}-${RELEASE}

Commentaires sur les paramètres utilisés

Différences principales entre Raspberry Pi2 et Raspberry Pi3 :

  • le modèle de la Raspberry Pi
  • 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 Pi est équipée d'un mini-USB WIFI realtek nous installons donc le firmware realtek dans notre image.

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 Pi
  • 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 Raspberry Pi n'a pas d'horloge permanente, voir les forums à ce sujet)
  • ENABLE_WM je choisis lxdm 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
  • Important KERNELSRC_DIR lorsqu'il est présent localise le chemin du noyau choisi pour construire cette image. Par défaut et sans ce paramètre le noyau est téléchargé en ligne depuis raspberrypi

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 telle 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 (checkinstall non opérationnel), à 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(checkinstall non opérationnel), à compiler sur la nouvelle distribution
  • une version de NODE compatible avec mraa et upm (6.9.2) 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)

La situation est complexe en ce moment du fait d'un défaut de maintenance de la partie javascript du logiciel swig. Node évolue très rapidement et un certain nombre de fonctions utilisées par swig ont été dépréciées sans que cela ait été pris en compte dans swig. Il est donc nécessaire de ne pas utiliser une version de Nodesupérieure à 6.9.2. Toutefois une version compatible avec node7 a été proposée et est cours de test. Elle est intégrée à la nouvelle image https://github.com/g-vidal/mraa.git en attendant sa valisdation par INTEL.

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.

Les paquets swig et node doivent être récupérés sur les sites respectifs et installés car mraa et upm en dépendent. 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

Avant de construire l'image il faut créer 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 (voir plus haut la création d'une machine avec chroot et qemu). 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
cd packages
cp ~/Telechargements/weewx_3.7.1-1_all.deb .

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 la commande suivante :

sudo CONFIG_TEMPLATE=createraspife3  ./rpi23-gen-image.sh
sudo CONFIG_TEMPLATE=createraspife2  ./rpi23-gen-image.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.

Copier l'image sur une micro SD vierge (cf. Chap 2.a)

Pour continuer l'installation il est nécessaire de dimensionner la taille du support qui contiendra l'image, pour rester compatible avec le plus de support possible je propose de redimensionner à moins de 8Go.

3.c Finitions de l'image

La fin de la préparation de l'image se passe sur la raspberrypi. Copier l'image sur une microSD (voir Chap 2.a). La méthode proposée ici permet d'effectuer les manipulations sans se connecter à un écran et un clavier il suffit de brancher la raspberry au réseau filaire, chercher son adresse IP et se connecter par ssh avec le premier user créé (dans l'exemple ci-dessous l'adresse est 192.168.10.112 et le premier user ens-ife) Toutes les opérations décrites ci-dessous peuvent être réalisées directement sur la raspberry équipée d'un écran et d'un clavier/souris.

ssh ens-ife@192.168.10.112
The authenticity of host '192.168.10.112 (192.168.10.112)' can't be established.
ECDSA key fingerprint is SHA256:SuYi6uHrmK1MtxSybKdl21pDZa70Ujon3ftg44OC1yQ.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.10.112' (ECDSA) to the list of known hosts.

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.

La clef installée lors de la création est immadiatement opérationnelle et le premier user créé (ens-ife) possède les droits sudo, il est donc possible d'exécuter les commandes suivantes :

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install systemd-sysv xscreensaver
sudo service weewx stop
sudo update-rc.d weewx remove
sudo dpkg-reconfigure locales
sudo dpkg-reconfigure tzdata
mkdir -p Logiciels/Node
cd Logiciels
mkdir Swig IoT OpenZwave Modus

Il peut être nécessaire de configurer à la main wpa_supplicant, ajouter le fichier wpa_supplicant.conf(ou vérifier que le fichier de configuration s'il existe et s'il a un autre nom terminé par .conf dans le dossier /etc/wpa_supplicant);

ctrl_interface=/run/wpa_supplicant
update_config=1

Suivant le type d'installation certaines dépendances de wicd sont manquantes, dans ce cas le Wifi ne fonctionne pas correctement désinstaller puis réinstaller les 3 programes wicd :

sudo apt-get purge wicd*
sudo apt-get install wicd wicd-daemon wicd-gtk

Pour accéder facilement à tous les utilitaires et à l'environnement de développement pour l'éducation mis en place autour de la météo présentation et outils il est souhaitable de réaliser les installations proposées au chapitre 5. Le chapitre suivant décrit la méthode utilisée pour ajouter les logiciels nécessaires à la mise en oeuvre des programmes de l'environnement de codage et doivent aussi être installés.

Toutes les installations et améliorations décrites dans les chapitres 4 et 5 peuvent être réalisées sans brancher la raspberry à un écran en connaisant simplement son adresse sur le réseau et en s'y connectant via ssh. Une fois le serveur de terminaux installé il est possible d'afficher sur l'ordinateur tiers l'interface graphique de la raspberrypi.

Création des utilisateurs par défaut

La création automatisée de l'image a fourni un seul utilisateur pour le bon fonctionnement de l'environnement de développement nous avons besoin des utilisateurs suivants : - localadm (administrateur local de la Raspberry Pi), - callisto (utilisateur propriétaire et lanceur de Jupyterhub) - moon (utilisateur ordinaire de test)

for i in localadm callisto moon tsuser; do sudo adduser $i ;done 
sudo addgroup gpio
for i in ens-ife localadm callisto moon tsuser; do for j in i2c gpio netdev plugdev ; do sudo adduser $i $j; done; done
sudo addgroup jupyterhub
for i in localadm ens-ife callisto moon ; do sudo adduser $i jupyterhub ; done 
sudo adduser localadm sudo

Pour améliorer la sécurité il est possible (souhaitable) de supprimer le login par mot de passe de callisto en lui procurant un login exclusif par clef ssh.

Réseau avec acquisition automatique de l'adresse (DHCP)

Par défaut le WIFI n'a pas été configuré, pour y parvenir à distance on utilisera le serveur de terminaux vncserver .

Créer le mot de passe personnel de ens-ife (pour nos raspberries ce sera le nom de la raspberry qui sera utilisé raspife2et raspife3) pour le serveur de terminaux. Lancer le logiciel à distance et se connecter avec un client de serveur de terminaux.

vncpasswd
# Using password file /home/ens-ife/.vnc/passwd
# VNC directory /home/ens-ife/.vnc does not exist, creating.
# Password: 
# Verify:   
# Would you like to enter a view-only password (y/n)? n

Procéder de même pour l'utlisateur tsuser

vncpasswd
# Using password file /home/tsuser/.vnc/passwd
# VNC directory /home/tsuser/.vnc does not exist, creating.
# Password: 
# Verify:   
# Would you like to enter a view-only password (y/n)? n

Lancer le logiciel à distance vncserver (avec l'utilisateur ens-ife ou tsuser) et se connecter avec un client de serveur de terminaux.

vncserver
# xauth:  file /home/ens-ife/.Xauthority does not exist

# 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
sudo su tsuser
vncserver
# xauth:  file /home/tsuser/.Xauthority does not exist

# New 'X' desktop is raspife3:1

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

Il est possible de préconfigurer le wifi sans utiliser de serveur de terminaux et d'interface graphique, pour cela connectez votre machine debian d'installation au réseau que vous souhaitez préinstaller dans les Raspberry Pi, 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 Raspberry Pi, au premier démarrage la Raspberry Pi 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 dans le fichier /etc/wicd/wireless-settings.conf.

Exemple de paramètres concernant l'accès à eduroam

[connection]
id=eduroam
uuid=*****************************
type=wifi
permissions=
secondaries=

[wifi]
mac-address=**:**:**:**:**:**
mac-address-blacklist=
mac-address-randomization=0
mode=infrastructure
seen-bssids=
ssid=eduroam

[wifi-security]
auth-alg=open
group=
key-mgmt=wpa-eap
pairwise=
proto=

[802-1x]
altsubject-matches=
eap=peap;
identity=vidal@ens-lyon.fr
password=******************
phase2-altsubject-matches=
phase2-auth=mschapv2

[ipv4]
dns-search=
method=auto

[ipv6]
addr-gen-mode=stable-privacy
dns-search=
method=auto

Ne pas oublier de vérifier que l'utilisateur créé par défaut (pour nous localadm) 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.

En cas de problème réseau 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 seulement en cas de problème :

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

Pour terminer si le réseau ne parvient toujours pas à fonctionner automatiquement lors de la première connexion ou en fin d'installation afin d'éviter de laisser des traces confidentielles il est impératif de contrôler le contenu des fichiers /etc/wicd/wired-settings.conf et /etc/wicd/wireless-settings.conf. Pour réinitialiser ces fichiers (si on n'a pas choisi de modifier la configuration manuellement comme proposé ci-dessus) 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/*~

Le nom de l'interface filaire est unique et est créé lors de la première connexion, l'image étant installée par clonage elle propage le même numéro d'interface qui est forcément faux lorsque vous installez l'image générique sur votre raspberry. Il sera nécessaire de le changer pour que la raspi puisse se connecter, le nom effectif de l'interface active 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

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

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 Pi 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.7.1-1_all.deb
sudo dpkg -i weewx_3.7.1-1_all.deb

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

4.b Construction/Installation du paquet node

Suivant la distribution et la configuration souhaitée il est possible de técharger un binaire et l'installer ou de télécharger les sources les compiler et les installer.

Pour utiliser le binaire

https://nodejs.org/dist/v7.9.0/node-v7.9.0-linux-armv7l.tar.xz 
wget https://nodejs.org/dist/v7.9.0/node-v7.9.0-linux-armv7l.tar.xz
tar xvfJ node-v7.9.0-linux-armv7l.tar.xz
cd node-v7.9.0-linux-armv7l
for i in bin include lib share; do sudo cp -r $i/* /usr/local/$i; done
sudo ln -s /usr/local/bin/node /usr/local/bin/nodejs
sudo npm install -g node-gyp
sudo npm install -g configurable-http-proxy

Autre possibilité compiler et installer le paquet à partir de la dernière version des sources, pour cela 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 Raspberry Pi2 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 (normalement présents dans l'image) pcre2-utils,libpcre++-dev,libpcre2-dev automake 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, parfois automake ne s'installe pas le rajouter.

automake

Pour que swig produise les exécutables 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). On utilise ici la version de swig modifiée par arfoll et mise à jour

wget https://github.com/g-vidal/swig/archive/master.zip
unzip master.zip
cd swig-master
./autogen.sh
./configure
make -j4
sudo make install
sudo ln -s /usr/include/webkitgtk-4.0/JavaScriptCore /usr/include/JavaScriptCore

4.d Construction du paquet libopenzwave

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

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

4.e Construction du paquet modus

La librairie modus est requise pour la compilation d'upm. Cette pile est disponible sur github :

git clone https://github.com/stephane/libmodbus.git
cd libmodbus/
./autogen.sh 
./configure
make -j4
sudo make install

4.f Construction du paquet mraa

Cette opération ne peut plus être faite à l'avance pour le moment sur une Raspberry Pi, 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 ..
make -j4
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.g 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 Pi, 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 -DWERROR=off -DCMAKE_INSTALL_PREFIX=/usr ..
make -j4
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.h Réglages et exploitation des paquets créés et postinstallation

Si les 4 paquets debian ont pu être créés avec checkinstall ils 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 lors de la prochaine création. 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.

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 !

l'activation du bus i2c n'est plus nécessaire

Pour pouvoir utiliser le bus i2c dans les images précédentes il fallait l'activer. Deux manipulations étaient nécessaires elles sont conservées ici pour mémoire :

  • 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 et les commentaires qui la précèdent dans le fichier /boot/firmware/config.txt
# activate i2c0 i2c1
# i2c0 is used by the Raspberry Pi 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.

Pour connaître la liste des groupes auxquels appartient un utilisateur utiliser la commange groups :

groups
ens-ife dialout cdrom floppy sudo audio video plugdev users i2c

Accès non privilégié au bus GPIO

Vérifier si le groupe gpio existe et sinon le créer :

cat /etc/group | grep gpio
gpio:x:1001:ens-ife,vidal,callisto # le groupe est présent sinon

sudo addgroup gpio

Dans le répertoire /etc/udev/rulesd créer un fichier 99-com.rules contenant les éléments suivants :

sudo jed /etc/udev/rules.d/99-com.rules
#ajouter
SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio; \
chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio; \
chown -R root:gpio /sys/devices/platform/soc/3f200000.gpio && chmod -R 770 /sys/devices/platform/soc/3f200000.gpio; \
chown -R root:gpio /sys/devices/platform/soc/soc:virtgpio && chmod -R 770 /sys/devices/platform/soc/soc:virtgpio; \
chown -R root:gpio /sys/bus/platform/drivers/pinctrl-bcm2835 && chmod -R 770 /sys/bus/platform/drivers/pinctrl-bcm2835 '"

SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="gpio", MODE="0660"
SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add",
PROGRAM="/bin/sh -c 'chown root:gpio /sys/class/gpio/export /sys/class/gpio/unexport ; \
chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'"
SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c 'chown root:gpio /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; \
chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'"

Ces modifications permettent à un utilisateur ordinaire (non root et non sudo) d'accéder aux ressources du bus gpio.

5. Installation de services utilisables à distance

Si vous souhaitez arrêter la Raspberry Pi en ligne de commande installer le paquet suivant qui peut être exclu de l'image initiale pour des raisons techniques, il est normalement ajouté dans l'image IF-ENS de Lyon, s'il est absent :

sudo apt-get install systemd-sysv

5.a 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, créer tsuser et l'utiliser comme cela a été fait plus haut pour tester le wifi :

sudo adduser tsuser
sudo su tsuser
vncpasswd

le mot de passe ajouté par défaut est le nom de la machine raspife3 ou raspife2

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:    $remote_fs $syslog $networking
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 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

ajouter le fichier vncserver.service avec le contenu suivant dans le répertoire /lib/systemd/system :

[Unit]
Documentation=man:systemd-sysv-generator(8)
SourcePath=/etc/init.d/vncserver
After=networking.service

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/vncserver start
ExecStop=/etc/init.d/vncserver stop

Créer un lien dans /etc/systemd/system/multi-user.target.wants

sudo ln -s /lib/systemd/system/vncserver.service /etc/systemd/system/multi-user.target.wants

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 Raspberry Pi démarrée, si on ne connait pas son adresse, 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!

Si l'on ne compte pas se servir de ce service (qui est activé par défaut sur l'image ENS de Lyon IFÉ) il faut le désactiver pour éviter de consommer inutilement des ressources.

sudo update-rc.d -f vncserver remove

Noter que le service installé est une commodité afin que les usagers arrivant pour la première fois sur la plateforme et n'étant pas rompus à l'usage de la ligne de commande puissent travailler confortablement. Il est possible de modifier simplement la configuration du service en choisissant un autre usager que tsuser. Il est aussi possible de proposer à tout usager de lancer lui même depuis son propre environnement une instance de vncserver (via la commande en ligne vncserver) qui lui permettra de se retrouver à distance dans son environnement personnalisé et pas dans l'environnement minimaliste de tsuser. Sans que cela n'ait été testé il semble possible de cumuler le service en arrière plan et une instance personnelle de vncserver il y a cependant un risque de détérioration des performances et éventuellement un changement de numéro de "display" qui peut être déroutant pour un utilisateur novice. Quoi qu'il en soit et quelle que soit la stratégie choisie noter que vncserver est une commande attachée à un utilisateur ce dernier doit impérativement configurer les paramètres de son vncserver avant le premier lancement pour avoir tout l'environnement opérationnel(commande vncpasswd notamment).

5.b Configurations diverses pour l'utilisation de python avec le bus GPIO

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, elles sont exploitées dans l'environnement de programmation Tremplin.

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 modifier le nombre de broches en mode PWM utile pour certains programmes voir les cahiers de programmes jupyterhub.

Cette bibliothèque est installée via pip (une mise à jour des paquets de service est faite avant l'installation) :

sudo pip install setuptools
sudo pip install wheel --upgrade
sudo pip install Rpi.GPIO
sudo pip3 install setuptools
sudo pip install wheel --upgrade
sudo pip3 install Rpi.GPIO

5.c Installation de jupyter et jupyterhub

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

sudo pip install jupyter
sudo pip --no-cache-dir install matplotlib (à cause de la faible mémoire de la raspi)
sudo pip3 install jupyter
sudo pip3 install jupyterhub
sudo pip3 install git+https://github.com/jupyter/sudospawner
sudo pip3 --no-cache-dir install matplotlib (à cause de la faible mémoire de la raspi)

Installation des cahiers de programmes dans l'environnements de l'utilisateur de test on suppose ici que le point de départ est l'utilisateur privilégié ens-ife, répéter la manipulation dans les environnements de tous les utilisateurs qui utiliseront les cahiers de programmes.

git clone https://github.com/g-vidal/CahierDeProgrammes.git
sudo su moon
cd
git clone https://github.com/g-vidal/CahierDeProgrammes.git
exit

Création d'un certificat d'authentification pour protéger les échanges entre la raspberry et les clients et configuration de jupyterhub.

La sécurité est une étape cruciale de tout échange sur un réseau numérique. Même si votre raspberry qui est branchée dans une salle de TP derrière le pare-feu de l'établissement paraît ne pas être une menace, elle pourrait bel et bien le devenir ! (c'est très à la mode ne ce moment dans les séries américaines d'utiliser des Raspberries Pi comme instruments d'attaque numérique, cela est en général romancé mais repose effectivement sur la réalité). Il n'est pas nécessaire de mettre en place une politique de sécurité à outrance, par contre il est impératif de mettre en place quelques éléments basiques de protection qui pourront d'ailleurs servir de support à une sensibilisation sur les risques numériques et le comportement à adopter sur les réseaux. L'authentification permet à chaque groupe ou élève (suivant le choix du professeur) de disposer d'un espace protégé des actions du reste du monde.

Callisto est par défaut l'utilisateur qui lance jupyterhub, pour conserver la configuration proposée c'est donc l'utilisateur callisto qui doit créer un nouveau certificat.

cd ~
mkdir -p Utils/Certificates
cd Utils/Certificates
openssl req -new -newkey rsa:2048 -rand /dev/urandom -nodes -keyout meteojuphub.key -out meteojuphub.csr
#répondre aux questions avec vos informations
openssl req -new -x509 -days 3652 -key meteojuphub.key -out meteojuphub.pem
#répondre aux questions avec vos informations

Le certificat doit être activé pour jupyterhub à la racine du user callisto, dans le répertoire Jupyterhub (il est présent par défaut dans l'image ENS-IFÉ)

sudo su callisto
cd
mkdir Jupyterhub
cd ~/Jupyterhub
jupyterhub --generate-config 

Éditer le fichier jupyterhub_config.py en décommentant et renseignant les 3 lignes ci-dessous :

## The class to use for spawning single-user servers.
#  
#  Should be a subclass of Spawner.
#c.JupyterHub.spawner_class = 'jupyterhub.spawner.LocalProcessSpawner'
c.JupyterHub.spawner_class='sudospawner.SudoSpawner'

## Path to SSL certificate file for the public facing interface of the proxy
#  
#  Use with ssl_key
c.JupyterHub.ssl_cert = '/home/callisto/Utils/Certificates/meteojuphub.pem'

## Path to SSL key file for the public facing interface of the proxy
#  
#  Use with ssl_cert
c.JupyterHub.ssl_key = '/home/callisto/Utils/Certificates/meteojuphub.key'

## set of usernames of admin users
#  
#  If unspecified, only the user that launches the server will be admin.
c.Authenticator.admin_users = set(['loginAdminName','othername'])

## Whether to open a new PAM session when spawners are started.
#  
#  This may trigger things like mounting shared filsystems, loading credentials,
#  etc. depending on system configuration, but it does not always work.
#  
#  If any errors are encountered when opening/closing PAM sessions, this is
#  automatically set to False.
#c.PAMAuthenticator.open_sessions = True
c.PAMAuthenticator.open_sessions = False

Pour fonctionner l'utilisateur qui lance jupiterhub doit disposer d'un certain nombre de privilèges quisont ajoutés au fichier sudoers :

sudo visudo

ajouter les lignes suivantes à la fin du fichier /etc/sudoers

# the command(s) the Hub can run on behalf of the jupyterhub group users
# without needing a password
# the exact path may differ, depending on how sudospawner was installed
Cmnd_Alias JUPYTER_CMD = /usr/local/bin/sudospawner

# actually give the Hub user permission to run the above command on behalf
# of the above users without prompting for a password
callisto ALL=(%jupyterhub) NOPASSWD:JUPYTER_CMD

L'utilisateur doit aussi appartenir au groupe jupyterhub (à priori déjà effectué plus haut dans cette procédure) et au groupe shadow, S'il n'a pas été encore créé créer le groupe jupyterhub avant d'y affecter des utilisateurs.

sudo addgroup jupyterhub
sudo adduser userhublauncher jupyterhub
sudo adduser userhublauncher shadow

Les options de la ligne de commande sont passées via les paramètres sélectionnés dans le fichier de configuration.

Ajout d'un moteur nodeJS dans l'environnement jupyter/jupyterhub

Jupyter et jupyterhub sont programmés en python mais les notebooks (cahiers d'exercices) peuvent fonctionner avec d'autres langages, à titre d'exemple nous proposons ici l'installation du moteur javascript permettant de programmer en nodeJS.

Aller dans le répertoire /usr/local/share et técharger depuis github les sources du logiciel, entrer dans le répertoire obtenu et créer le répertoire de réception du nouveau moteur

cd /usr/local/share/jupyter
sudo git clone https://github.com/notablemind/jupyter-nodejs.git
cd jupyter-nodejs/
sudo mkdir /usr/local/share/jupyter/kernels/nodejs

passer en adminastrateur mettre à jour les dépendances nécessaires à l'installation et exécuter les commandes d'installation.

sudo su
npm install -g minimatch --upgrade
npm install -g zmq --upgrade
npm install -g node-gyp --upgrade
npm install && node install.js /usr/local/share/jupyter/kernels/nodejs
npm run build
npm run build-ext


Mise en place d'un service jupyterhub

Creation d'un fichier .service a recopier dans /lib/systemd/system

3littlehills.€ :  cat jupyterhub.service
[Unit]
Description=Jupyterhub
SourcePath=/etc/init.d/jupyterhub
After=networking.service

[Service]
Type=forking
Restart=no
TimeoutSec=5min
IgnoreSIGPIPE=no
KillMode=process
GuessMainPID=no
RemainAfterExit=yes
SuccessExitStatus=5 6
ExecStart=/etc/init.d/jupyterhub start
ExecStop=/etc/init.d/jupyterhub stop
WorkingDirectory=/home/callisto/Jupyterhub

Créer un lien dans /etc/systemd/system/multi-user.target.wants

sudo ln -s /lib/systemd/system/jupyterhub.service /etc/systemd/system/multi-user.target.wants

Télecharger le fichier à placer dans /etc/init.d

cd ~/Logiciels
mkdir Jupyterhub
wget https://gist.githubusercontent.com/lambdalisue/f01c5a65e81100356379/raw/ecf427429f07a6c2d6c5c42198cc58d4e332b425/jupyterhub

Modifier le fichier pour qu'il soit sous la forme :

cat jupyterhub
#! /bin/sh
### BEGIN INIT INFO
# Provides:          jupyterhub
# Required-Start:    $remote_fs $syslog $networking
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start jupyterhub
# Description:       This file should be used to construct scripts to be
#                    placed in /etc/init.d.
### END INIT INFO

# Author: Gérard Vidal <gerard.vidal@ens-lyon.fr>
#

# Do NOT "set -e"

# PATH should only include /usr/* if it runs after the mountnfs.sh script
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/bin
DESC="Multi-user server for Jupyter notebooks"
NAME=jupyterhub
DAEMON=/usr/local/bin/jupyterhub
DAEMON_ARGS="--config=/home/callisto/Jupyterhub/jupyterhub_config.py"
#DAEMON_ARGS="--config=/etc/jupyterhub/jupyterhub_config.py"
PIDFILE=/var/run/$NAME.pid
SCRIPTNAME=/etc/init.d/$NAME

# The Username:Group that will run VNC
export USER="callisto"


# Exit if the package is not installed
[ -x "$DAEMON" ] || exit 0

# Read configuration variable file if it is present
[ -r /etc/default/$NAME ] && . /etc/default/$NAME

# Load the VERBOSE setting and other rcS variables
. /lib/init/vars.sh

# Define LSB log_* functions.
# Depend on lsb-base (>= 3.2-14) to ensure that this file is present
# and status_of_proc is working.
. /lib/lsb/init-functions

#
# Function that starts the daemon/service
#
do_start()
{
    # Return
    #   0 if daemon has been started
    #   1 if daemon was already running
    #   2 if daemon could not be started
    start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON --test > /dev/null \
        || return 1
    start-stop-daemon --start --background --make-pidfile --quiet --pidfile $PIDFILE --exec $DAEMON -- \
        $DAEMON_ARGS \
        || return 2
    # Add code here, if necessary, that waits for the process to be ready
    # to handle requests from services started subsequently which depend
    # on this one.  As a last resort, sleep for some time.
}

#
# Function that stops the daemon/service
#
do_stop()
{
    # Return
    #   0 if daemon has been stopped
    #   1 if daemon was already stopped
    #   2 if daemon could not be stopped
    #   other if a failure occurred
    start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile $PIDFILE --name $NAME
    RETVAL="$?"
    [ "$RETVAL" = 2 ] && return 2
    # Wait for children to finish too if this is a daemon that forks
    # and if the daemon is only ever run from this initscript.
    # If the above conditions are not satisfied then add some other code
    # that waits for the process to drop all resources that could be
    # needed by services started subsequently.  A last resort is to
    # sleep for some time.
    start-stop-daemon --stop --quiet --oknodo --retry=0/30/KILL/5 --exec $DAEMON
    [ "$?" = 2 ] && return 2
    # Many daemons don't delete their pidfiles when they exit.
    rm -f $PIDFILE
    return "$RETVAL"
}

#
# Function that sends a SIGHUP to the daemon/service
#
do_reload() {
    #
    # If the daemon can reload its configuration without
    # restarting (for example, when it is sent a SIGHUP),
    # then implement that here.
    #
    start-stop-daemon --stop --signal 1 --quiet --pidfile $PIDFILE --name $NAME
    return 0
}

case "$1" in
  start)
    [ "$VERBOSE" != no ] && log_daemon_msg "Starting $DESC" "$NAME"
    do_start
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  stop)
    [ "$VERBOSE" != no ] && log_daemon_msg "Stopping $DESC" "$NAME"
    do_stop
    case "$?" in
        0|1) [ "$VERBOSE" != no ] && log_end_msg 0 ;;
        2) [ "$VERBOSE" != no ] && log_end_msg 1 ;;
    esac
    ;;
  status)
    status_of_proc "$DAEMON" "$NAME" && exit 0 || exit $?
    ;;
  #reload|force-reload)
    #
    # If do_reload() is not implemented then leave this commented out
    # and leave 'force-reload' as an alias for 'restart'.
    #
    #log_daemon_msg "Reloading $DESC" "$NAME"
    #do_reload
    #log_end_msg $?
    #;;
  restart|force-reload)
    #
    # If the "reload" option is implemented then remove the
    # 'force-reload' alias
    #
    log_daemon_msg "Restarting $DESC" "$NAME"
    do_stop
    case "$?" in
      0|1)
        do_start
        case "$?" in
            0) log_end_msg 0 ;;
            1) log_end_msg 1 ;; # Old process is still running
            *) log_end_msg 1 ;; # Failed to start
        esac
        ;;
      *)
        # Failed to stop
        log_end_msg 1
        ;;
    esac
    ;;
  *)
    #echo "Usage: $SCRIPTNAME {start|stop|restart|reload|force-reload}" >&2
    echo "Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}" >&2
    exit 3
    ;;
esac

:

Copier dans /etc/init.d puis lancer le service avec sudo service jupyterhub start. Pour controler statuspour arrêter stop.

sudo cp jupyter /etc/init.d
sudo chmod +x /etc/init.d/jupyterhub

Pour lancer au démarrage sudo update-rc.d jupyterhub defaults. pour ne plus lancer au démarrage sudo update-rc.d jupyterhub remove

Installation du proxy http de node s'il n'est pas encore présent:

sudo npm install -g configurable-http-proxy

Sans ce logiciel jupyterhub ne peut pas fonctionner.

Quelques vérifications supplémentaires

Lors de la construction de l'image certaines dépendances peuvent entrainer la non-installation de certain paquets pourtant demandés. La liste ci-dessous précise quelques paquets dont la mauvaise installation a été observée dans certaines situations :

  • wicd
  • wicd-gtk
  • console-data
  • keyboard-configuration
  • rsync

Réinstaller les paquets si besoin

sudo apt-get install package

Recongigurer les éléments reposant sur le lngage si besoin.

sudo dpkg-reconfigure console-setup
sudo dpkg-reconfigure keyboard-configuration

En cas de problème persistant sur le clavier vérifier le contenu du fichier etc/default/keyboard:

cat /etc/default/keyboard 
# KEYBOARD CONFIGURATION FILE

# Consult the keyboard(5) manual page.

XKBMODEL="pc105"
XKBLAYOUT="fr"
XKBVARIANT="latin9"
XKBOPTIONS=""

BACKSPACE="guess"

6. propagation de l'image

Vous pouvez aussi déplacer dans /home/localadm 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). Ne pas oublier de supprimer les fichiers de configuration de wicd : * manager-settings.conf * wired-settings.conf * wireless-settings.conf * dhclient.conf.template.default pour que la raspberry avec la nouvelle image prenne le premier réseau filaire disponible. Pour une configuration plus évoluée il est possible / souhaitable de renseigner ces fichiers avec les informations nécessaires à la connexion aux réseaux auxquels la raspberryPi doit se connecter. La méthode proposée est "radicale" mais elle remet à zero la configuration ce qui permet éventuellement d'éliminer des bugs empilés. Je recommande de ne pas faire cette manipulation depuis la raspberry Pi elle même mais en montant la micro-SD sur un ordinateur tiers.

#image raspi2 depuis SD
sudo dd if=/dev/mmcblk0 of=2017-04-02-debianStretchRpi2.img bs=8M conv=sparse count=900
image raspi3 depuis micro-SD dans USB
sudo dd if=/dev/sdh of=2017-01-17-debianStretchRpi3.img bs=8M conv=sparse count=900
[sudo] Mot de passe de vidal : 
900+0 enregistrements lus
900+0 enregistrements écrits
7549747200 bytes (7,5 GB, 7,0 GiB) copied, 232,419 s, 32,5 MB/s

J'ai choisi de limiter la taille de mon image à 7.5Go 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 2017-01-17-debianStretchRpi3.bmap 2017-01-17-debianStretchRpi3.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 2017-01-17-debianStretchRpi3.img.xz ./2017-01-17-debianStretchRpi3.img

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=fr_FR.UTF-8,Utf16=on,HugeFiles=on,64 bits,12 CPUs Intel(R) Xeon(R) CPU           W3680  @ 3.33GHz (206C2),ASM,AES-NI)

Scanning the drive:
1 file, 7549747200 bytes (7200 MiB)

Creating archive: 2017-01-17-debianStretchRpi3.img.xz

Items to compress: 1


Files read from disk: 1
Archive size: 1802331200 bytes (1719 MiB)
Everything is Ok

Webographie

  1. Site principal Raspberry Pi
  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