Motivations
Le but de cet article est de décrire la procédure technique conduisant à un système d'exploitation Debian "orthodoxe" (totalement analogue à celui qui serait installé sur un ordinateur ordinaire) fonctionnant sur une Raspberry Pi. La motivation principale est de disposer d'une distribution standard Debian comparable à toutes celles qui fonctionnent sur d'autres appareils que des raspberries et aussi de proposer une explication de TOUT ce qui est fait sans cacher à l'usager des commandes parfois perçues comme magiques et dans la plupart des cas conduisant à une incompréhension toatale de leurs conséquences.
Cet article décrit la construction d'images apparentées, chacune dédiée à un mode de fonctionnement particulier :
- Une image raspberry Pi0 buster pour piloter une station météo et partager des données
- Une image raspberry Pi3 buster pour apprendre à coder
- Une image raspberry Pi2 buster pour apprendre à coder
- Une image raspberry Pi3 buster pour piloter une station météo et partager des données
- Une image raspberry Pi4 buster pour apprendre à coder
- Une image raspberry Pi3 Pi4 bullseye tous terrains permettant de suivre tous les aspects du projet et de préparer les migrations à venir
Remerciements
Carole Larose, Myriam Bentoumi, Éric le Jan et Charles-Henri Eyraud.
Sommaire
-
1.1. Trois phases de construction
- Construction de l'image avec le script automatisé "rpi23genimage" et premiers services
- Ajustements manuels génériques
- Configuration particulière avancée
1.3. Mode de classement et moyen de retrouver une information
-
Construction de l'image avec le script "rpi23genimage" et premiers services
2.1. Raspberry Pi2 Buster
2.2. Raspberry Pi3 Buster
2.4. Raspberry Pi3 Buster sans serveur graphique
2.6. Raspberry Pi4 Buster
-
Ajustements manuels génériques
-
Ajustements après démarrage de la Raspberry munie de sa nouvelle image
4.1. Modification de la taille de l'espace utilisé (au besoin seulement)
4.2. Mises à jour et installation d'utilitaires
4.3. Ajout d'une interface graphique
4.4. Ajout d'utilisateurs et distribution des droits
-
Configurations particulières avancées
- Compilation d'un cmake récent
- Ajout de fontes
- Activation de la caméra raspberry Pi
- Activation du réseau WIFI et du réseau filaire
6.2 Mise à jour des librairies upm et mraa depuis
github
6.3 Installation de Jupyter et Jupyterhub
- Configuration de la sécurité et du lancement par le user callisto
- Ajout d'un moteur nodeJS dans l'environnement jupyter/jupyterhub
- Installation d'un service
jupyterhub
oujupyterlabhub
- Installation d'une alternative entre jupyterlab et jupyter
6.5 Installation de Domoticz pour piloter des objets connectés du commerce
6.6 Ajout de scripts pour démarrer ou supprimer un service au démarrage * Pour
jupyterhub
* Pourvncserver
* Pourweewx
6.7 Ajout des cahiers de programmes pour apprendre/enseigner la programmation
-
Configuration du logiciel de pilotage de stations météorologiques
-
Vérification de la configuration et modifications manuelles
-
Dossier des affichages standards et de cadrans
-
Ajout des cadrans interactifs
- installation et configuration du pare-feu
- Installation et configuration de la base de données relationnelle mariadb
- Mise en place d'un serveur web
En cours se référer pour le moment à :
Téléchargements
- rpi23-gen-image
- g_vidal rpi23-gen-image
- logiciel weewx
- Images téléchargeables raspberryPi du projet Tremplin
1. Stratégie adoptée
Lors du développement du projet "Météo et Climat tremplin pour l'enseignement des sciences et dès que l'utilisation d'objets connectés (Raspberry Pi Odroïd Intel edison, Intel joule) a été entérinée, des images ont été construites au coup par coup pour soutenir les fonctions attribuées à chacun des objets connectés. Cet article est le premier d'une série de 3 présentant la création de l'image et les premiers ajustements pour la rendre aisément opérationnelle. Le second décrit les aménagements faits pour avoir des services opérationnels y compris les outils pour la météorologie et le climat. Le troisième décrit les adaptations particulières pour le projet "Tremplin des Sciences"
- Construire et installer un système d'exploitation GNU/linux Debian Stretch sur une Raspberry Pi 3 ou Pi3 B+ pour piloter une station météorologique
- Piloter une station météorologique avec une Raspberry Pi3 (image ENS-IFÈ) et participer au réseau OpenMetEdu (optionnel)
- A Debian Buster image for Raspberry Pi 3 to learn or teach coding with JupyterHub (python, JS), Snap!BYOB (bloc-programming), MRAA and UPM (maker world)
- Installer un Système d'exploitation linux Debian Stretch sur une Raspberry Pi 2 ou 3 avec les outils Weewx, JupyterHub, MRAA et UPM
La procédure décrite ci-dessous a été réalisée à partir d'une machine Debian, si on ne dispose pas d'un tel ordinateur il est possible de réaliser ce travail à partir d'une distribution "live" sur une clef USB qui s'installe sur tout ordinateur sans toucher au système d'exploitation et aux données existantes. Pour conserver l'état du système ainsi créé on peut utiliser une distribution "persistante" voir Créer et utiliser une clef USB GNU/linux bootable persistante pour configurer une raspberry Pi.
1.1 Trois phases de construction
La construction d'une image se passe en trois phases:
- Tout d'abord construction d'une image minimale en utilisant le script automatisé de drtyhlpr disponible sur le dépôt github rpi23-gen-image et sur le dépôt tremplin des sciences,
- ensuite réalisation d'un certain nombre d'ajustemts génériques aux quatre images dont une partie est réalisable directement sur la micro-SD l'autre devant être exécutée lors du premier démarrage
- enfin modifications adaptées à chacune des fonctions attendues pour la raspberry Pi considérée
1.1.1 Construction de l'image avec le script automatisé "rpi23genimage" et premiers services chap. 2
Cette opération est totalement automatisée grâce au travail piloté par drtyhlpr
sur github
, le développement de ces scripts a besoin de développeurs et de testeurs n'hésitez pas à contribuer à ce travail si vous le pouvez. L'image créée est minimale bien que de nombreuses options permettent déjà de la profiler (cf. plus bas).
1.1.2 Ajustements manuels génériques chap. 3
Dans cette partie du travail sont réalisés tous les ajustements possibles après le premier démarrage de la raspberry avec sa nouvelle image. Cela permet entre autres de prendre en compte le support physique utilisé, l'environnement opérationnel de la future raspberry et quelques fonctionnalités qui ne peuvent être ajoutées lors de la création. L'image fournie contient un ensemble d'usagers et de services préinstallés.
1.1.3 Configuration particulière avancée chap. 4
Les Raspberries Pi sont d'admirables petites machines mais leur puissance reste limitée et il est judicieux de les cantonner à un nombre limité de fonctions en supprimant autant que possible tout ce qui est superflu. par exemple l'image qui pilote la station n'a pa besoin d'écran et toute l'infrastructure d'affichage graphique est supprimée ce qui améliore grandement les performances de pilotage de la station et de manipulation des données.
1.2 Quatre générations de RaspberryPi (rpi2-rpi3-rpi3B+-rpi4), deux familles d'images (codage-station météo) et deux distributions (buster-bullseye)
Au cours du projet nous avons manipulé des raspbrries Pi-2, Pi-3, Pi-3B+ et pi4 ; afin de conserver une compatibilité avec les premiers matériels installés des images pour raspberries Pi 2, 3, 3B+ sont proposées. Dans la mesure où plus aucune raspberry pi 2 ne pilote de station météorologique il n'y a pas d'image de raspberry Pi2 pour le pilotage d'une station météorologique avec weewx
. S'il existe un besoin on pourra s'inspirer de la construction de la raspberry Pi W3 en changeant les paramètres liés au modèle et au réseau (On ne peut pas garantir que des problèmes de compilation n'apparaissent pas).
1.3 Mode de classement et moyen de retrouver une information
Le nom des images de raspberries crées est formé en suivant la règle suivante :
- date AAAA-MM-JJ "-"
- modèle rpi2, rpi3, rpi3P (3 BPlus) ou rpi4
- fonction W pour la raspberry
weewx
de pilotage de la station météo et rien pour les autres - distribution de debian utilisée
buster
oubullseye
(des versionsstretch
existent dans les archives) - pour les rpi4 32 ou 64
- extension : type de fichier img ou bmap (éventuellement compression xz)
Ainsi l'mage du 22 octobre 2019 buster pi3 pour la programmation sera nommée : 2019-10-22-rpi3-buster.img.xz
. L'image pour raspberry4 64 bits faite le 10/02/2020 avec la distribution buster a pour nom : 2020-02-10-rpi4-buster-64.img
2. Construction de l'image avec le script "rpi23genimage"
Le Travail reporté ci-dessous a été effectivement réalisé à partir d'un ordinateur linux. Windows a finalement intégré la possibilité d'utiliser des commandes linux unix (voir l'un des nombreux tutoriaux sur comment installer le bash dans windows10) et l'unix de MacOs est suffisamment proche pour que beaucoup de choses soient faisables de puis ces plateformes. Toutefois, une solution élégante consiste à utiliser une clef bootable Linux live
dont la description est ici et d'appliquer les commandes proposées, cela peut s'avérer extrêmemnt utile pour la copie de l'image sur une micr-SD.
Toutes les constructions d'images ci-dessous s'appuient sur le travail de drtyhlpr disponible sur le dépôt github rpi23-gen-image. Le dépôt g_vidal rpi23-gen-image est un clône de rpi23-gen-image
maintenu à jour autant que possible auquel sont ajoutés quelques fichiers décrits dans les chapitres suivants. Des différences peuvent exister entre les versions commentées ici et les versions disponibles en ligne lorsque des modifications doivent être effectuées pour respecter l'évolution de Debian, la version en ligne sur github
est à priori et sauf indication contraire toujours la plus à jour (pour des raisons de sécurité les mots de passe et les indications de chemins sont remplacées par des *****
).
Le travail s'effectue dans la hiérarchie de fichiers obtenue par clonage du dépôt g_vidal rpi23-gen-image.
ls -R
.:
bootstrap.d/ functions.sh LICENSE README-CN.md
files/ packages/ README.md rpi23-gen-image.sh* templates/
./bootstrap.d:
10-bootstrap.sh 13-kernel.sh 30-security.sh 42-fbturbo.sh 99-reduce.sh
11-apt.sh 20-networking.sh 31-logging.sh 14-fstab.sh 32-sshd.sh
43-videocore.sh 12-locale.sh 15-rpi-config.sh 21-firewall.sh 41-uboot.sh
50-firstboot.sh
./files:
apt/ dpkg/ firstboot/ iptables/ modules/ network/ xorg/
boot/ etc/ initramfs/ locales/ mount/ sysctl.d/
./files/apt:
02nocache 03compress 04norecommends 10proxy flash-kernel sources.list
./files/boot:
config.txt uboot.mkimage
./files/dpkg:
01nodoc
./files/etc:
99-com.rules rc.local*
./files/firstboot:
10-begin.sh 23-regenerate-initramfs.sh 26-config-ifnames.sh
21-generate-ssh-keys.sh 24-generate-machineid.sh 99-finish.sh
22-expandroot.sh 25-create-resolv-symlink.sh
./files/initramfs:
expand_encrypted_rootfs expand-premount* expand-tools*
./files/iptables:
flush-ip6tables.sh ip6tables.rules iptables.rules nftables6.rules
flush-iptables.sh ip6tables.service iptables.service nftables.rules
./files/locales:
locale
./files/modules:
raspi-blacklist.conf rpi2.conf
./files/mount:
crypttab fstab
./files/network:
eth.network host.conf hostname hosts interfaces wlan.network
./files/sysctl.d:
81-rpi-vm.conf 82-rpi-net-hardening.conf 83-rpi-printk.conf
./files/xorg:
99-fbturbo.conf
./packages:
python3-weewx_4.2.0-1_all.deb
./templates:
makebuster.log raspife3-stretch rpi0stretch
rpi1buster raspife2-stretch rpi1Pbuster
rpi1Pstretch raspife3-buster rpi1stretch
rpi2buster rpi2stretch rpi3buster
rpi3Pbuster rpi3Pstretch rpi3stretch
rpi3-stretch-arm64-4.14.y raspife3-buster-arm64 raspife3-jessie
rpi0buster
Pour construire les images on met en place le noyau linux X.YY proposé par le dépôt officiel RaspberrryPi/linux. Au moment de la rédaction on utilise le noyau 4.19 pour buster
et 5.4 pour bullseye
.
Les 5 parties ci-dessous sont totalement indépendantes, le lecteur peut directement se reporter à la construction de l'image souhaitée. Dans tous les cas l'utilisateur privilégié initial s'appelle ens-ife
dans les fichiers de configuration et on fournit une clef ssh pour éviter l'utilisation de mots de passe (un mot de passe de secours est toutefois prévu dans la configuration). L'utilisateur privilégié ens-ife
est réservé au contructeur de l'image, un autre utilisateur privilégié localadm
est créé pour fournir à un tiers installateur de l'image les droits d'administration. les exemples fournis ont été effectivement utilisés pour construire des images MAIS l'outil rpi23-gen-image
est vivant et la communauté active, des modifications légères peuvent s'avérer nécessaires entre deux mises à jour du blog.
2.1 Raspberry Pi2 Buster
Cette image a été générée en utilisant le fichier template raspife2-buster_19-09-08
et le script standard rpi23-gen-image.sh
. Ce travail étant réalisé dans le cadre du projet Météo Climat Tremplin pour l'enseignement des Sciences le package weewx de gestion de stations météorologiques est introduit par défaut; il permet d'illustrer l'incorporation de paquets debian non présents dans les dépôts par défaut.
Les instructions sont lancées depuis la racine du dépôt listé ci-dessus.
sudo rm -r /data/RpiGenImage/Images/buster/build
sudo CONFIG_TEMPLATE=raspife2-stretch ./rpi23-gen-image.sh
Le fichier raspife2-buster_19-09-08
se trouve dans le répertoire templates et contient les informations présentées ci-dessous. Se reporter à la documentation de rpi23-gen-image
pour avoir des précisions sur les paramètres utilisés. Ces informations sont celles qui ont été extraites du fichier de configuration qui a permis de produire l'image proposée au téléchargement. Les paquets listés dans APT_INCLUDES_LATE=""
sont ceux qui sont ajoutés à la construction par défaut pour les besoins du projet. On y trouve les outils de compilation, le langage python et python3, les ressources pour l'affaichage graphique et la manipulation de graphiques et vidéos, firefox et quelques utilitaires ainsi que des paquets ajoutés au coup par coup au cours du développement du projet.
télécharger le fichier raspife2-buster_19-09-08
La trace de l'exécution apparait à l'écran la durée dépend de la puissance de la machine utilisée et peut atteindre une heure ou plus. Lorsque tout se passe bien l'exécution s'achève par les messages suivants :
killing processes using mount point ...
removing temporary mount points ...
/pathTo/Images/debianVersion/isoImageName.img (size in M) : successfully created
On dispose alors de deux fichiers :
* isoImage.bmap
* isoImage.img
qui peuvent être directement utilisés ou être enrichis comme proposé dans les chapitres suivants. Dans les deux cas il est nécessaire de copier cette image sur une micro SD en utilisant la commande bmaptool copy
(installer le paquet bmaptools si nécessaire).
2.2 Raspberry Pi3 Buster
Cette image a été générée en utilisant le fichier template raspife3-buster_19-09-12
et le script standard rpi23-gen-image.sh
. ce travail étant réalisé dans le cadre du projet Météo Climat Tremplin pour l'enseignement des Sciences le package weewx de gestion de stations météorologiques est introduit par défaut; il permet d'illustrer l'incorporation de paquets debian non présents dans les dépôts par défaut.
Les instructions sont lancées depuis la racine du dépôt listé ci-dessus.
sudo rm -r /data/RpiGenImage/Images/stretch/build
sudo CONFIG_TEMPLATE=raspife3-buster_19-09-12 ./rpi23-gen-image.sh
Le fichier raspife3-buster_19-09-12
est homologue de raspife2-buster_19-09-08
avec en plus la gestion du WIFI intégré. Il se trouve dans le répertoire templates et contient les informations présentées ci-dessous. Se reporter à la documentation de rpi23-gen-image
pour avoir des précisions sur les paramètres utilisés. Ces informations sont celles qui ont été extraites du fichier de configuration qui a permis de produire l'image proposée au téléchargement. Les paquets listés dans APT_INCLUDES_LATE=""
sont ceux qui sont ajoutés à la construction par défaut pour les besoins du projet. On y trouve les outils de compilation, le langage python et python3, les ressources pour l'affaichage graphique et la manipulation de graphiques et vidéos, firefox et quelques utilitaires ainsi que des paquets ajoutés au coup par coup au cours du développement du projet. L'installation de java s'est mal passée elle a été supprimée mais laissée dans le fichier de configuration au cas où le problème serait résolu dans un futur proche.
télécharger le fichier raspife3-buster_20-11-01
La trace de l'exécution apparait à l'écran la durée dépend de la puissance de la machine utilisée et peut atteindre une heure ou plus. Lorsque tout se passe bien l'exécution s'achève par les messages suivants :
killing processes using mount point ...
removing temporary mount points ...
/pathTo/Images/debianVersion/isoImageName.img (size in M) : successfully created
On dispose alors de deux fichiers :
* raspife3-buster_19-09-12.bmap
* raspife3-buster_19-09-12.img
qui peuvent être directement utilisés ou être enrichis comme proposé dans les chapitres suivants. Dans les deux cas il est nécessaire pour poursuivre de copier cette image sur une micro-SD en utilisant la commande bmaptool copy
(installer le paquet bmaptools si nécessaire).
2.3 Raspberry Pi3B+ Buster
Cette image a été générée en utilisant le fichier template raspife3P-buster_19-10-20
et le script standard rpi23-gen-image.sh
. ce travail étant réalisé dans le cadre du projet Météo Climat Tremplin pour l'enseignement des Sciences le package weewx de gestion de stations météorologiques est introduit par défaut; il permet d'illustrer l'incorporation de paquets debian non présents dans les dépôts par défaut. Cette image a été créée pour respecter les contraintes de securité d'un ordinateur en milieu scolaire et d'une machine de service. Elle dispose d'un serveur graphique, elle obtient une IP via le DHCP de l'établissement. Au delà de ces particularités structurelles, la configuration qui sera appliquée ultérieurement permet d'enseigner la programmation avec la météo ou tout autre capteurs ou effecteurs.
Les instructions sont lancées depuis la racine du dépôt listé ci-dessus.
sudo rm -r /data/RpiGenImage/Images/stretch/build
sudo CONFIG_TEMPLATE=raspife3P-buster_19-10-20 ./rpi23-gen-image.sh
Les instructions sont lancées depuis la racine du dépôt listé ci-dessus.
Le fichier raspife3P-buster_19-10-20
est fourni par le site de drtyhlpr puis modifié. Il se trouve dans le répertoire templates et contient les informations présentées ci-dessous. Se reporter à la documentation de rpi23-gen-image
pour avoir des précisions sur les paramètres utilisés. Ces informations sont celles qui ont été extraites du fichier de configuration qui a permis de produire l'image proposée au téléchargement. Les paquets listés dans APT_INCLUDES=""
sont ceux qui sont ajoutés à la construction par défaut pour les besoins du projet. On y trouve les outils de compilation, le langage python et python3, les ressources pour l'affaichage graphique et la manipulation de graphiques et vidéos, firefox et quelques utilitaires ainsi que des paquets ajoutés au coup par coup au cours du développement du projet.
télécharger le fichier raspife3P-buster_20-11-01
La trace de l'exécution apparait à l'écran la durée dépend de la puissance de la machine utilisée et peut atteindre une heure ou plus. Lorsque tout se passe bien l'exécution s'achève par les messages suivants :
killing processes using mount point ...
removing temporary mount points ...
/pathTo/Images/debianVersion/isoImageName.img (size in M) : successfully created
On dispose alors de deux fichiers :
* raspife3P-buster_19-10-20.bmap
* raspife3P-buster_19-10-20.img
qui peuvent être directement utilisés ou être enrichis comme proposé dans les chapitres suivants. Dans les deux cas il est nécessaire pour poursuivre de copier cette image sur une micro-SD en utilisant la commande bmaptool copy
(installer le paquet bmap-tools
si nécessaire).
2.4 Raspberry Pi3 Buster sans serveur graphique et avec IP fixe
Cette image a été générée en utilisant le fichier template raspife3W-buster_19-10-20
et le script standard rpi23-gen-image.sh
. ce travail étant réalisé dans le cadre du projet Météo Climat Tremplin pour l'enseignement des Sciences le package weewx de gestion de stations météorologiques est introduit par défaut; il permet d'illustrer l'incorporation de paquets debian non présents dans les dépôts par défaut. Cette image a été créée pour respecter les contraintes de securité d'un ordinateur en milieu scolaire et d'une machine de service. Elle ne dispose pas de serveur graphique, elle possède une IP fixe pré-attribuée au sein de l'établissement. Au delà de ces particularités structurelles, la configuration qui sera appliquée ultérieurement sera aussi sensiblement différente. Le "W" ajouté au nom est tiré du nom du logiciel weewx
pour signaler que la fonction principale est dédiée à la gestion d'une station météorologique.
Les instructions sont lancées depuis la racine du dépôt listé ci-dessus.
sudo rm -r /data/RpiGenImage/Images/stretch/build
sudo CONFIG_TEMPLATE=raspife3W-buster_19-10-20 ./rpi23-gen-image.sh
Le fichier raspife3W-buster_19-10-20
est homologue de raspife3-buster_19-09-12
et de raspife3P-buster_19-09-12
sans gestion du WIFI intégré, la Raspberry étant conçue pour se comporter "comme un serveur". Il se trouve dans le répertoire templates et contient les informations présentées ci-dessous. Se reporter à la documentation de rpi23-gen-image
pour avoir des précisions sur les paramètres utilisés. Ces informations sont celles qui ont été extraites du fichier de configuration qui a permis de produire l'image proposée au téléchargement. Les paquets listés dans APT_INCLUDES_LATE=""
sont ceux qui sont ajoutés à la construction par défaut pour les besoins du projet. On y trouve les outils de compilation, le langage python et python3 et quelques utilitaires ainsi que des paquets ajoutés au coup par coup au cours du développement du projet.
Pour que l'image soit construite convenablement il est impératif que les paramètres NET_ADDRESS
, NET_GATEWAY
et NET_DNS_1
soient correctement configurés. Ils pourront toujours modifiés ou anonymisés plus tard si besoin. L'image ainsi constituée (avec des adresses IP fixes en clair) démarre et se connecte au réseau correspondant aux paramètres entrés (et à celui-là seulement) sans problème.
télécharger le fichier raspife3W-buster_19-10-20
La trace de l'exécution apparait à l'écran, la durée dépend de la puissance de la machine utilisée et peut atteindre une heure ou plus. Lorsque tout se passe bien l'exécution s'achève par les messages suivants :
killing processes using mount point ...
removing temporary mount points ...
/pathTo/Images/debianVersion/isoImageName.img (size in M) : successfully created
On dispose alors de deux fichiers :
* raspife3W-buster_19-10-20
* raspife3W-buster_19-10-20
qui peuvent être directement utilisés ou être enrichis comme proposé dans les chapitres suivants. Dans les deux cas il est nécessaire pour poursuivre de copier cette image sur une micro-SD en utilisant la commande bmaptool copy
(installer le paquet bmaptools si nécessaire).
2.5 Raspberry Pi3 BullsEye
Cette image a été générée en utilisant le fichier template raspife3-bullseye_19-11-09
et le script standard rpi23-gen-image.sh
. ce travail étant réalisé dans le cadre du projet Météo Climat Tremplin pour l'enseignement des Sciences. L'utilisation de la distribution buster permet d'assurer une veille sur l'évolution de la distribution Debian et anticiper les effets des changements de certains paquets sur le projet. Cette est image n'est pas recommandée à un utilisateur ordinaire mais fera certainement le bonheur d'un utilisateur avancé à l'affut de dernières mises à jour, cette image présente tous les avantages et inconvénients d'une distribution "debian testing". Le package weewx de gestion de stations météorologiques est introduit par défaut; il permet d'illustrer l'incorporation de paquets debian non présents dans les dépôts par défaut. Quelques autre paquets supplémentaires ont été ajoutés et certains paquets présents dans la version stretch ont du être retirés du fait d'incompatibilités avec la version deu noyau choisi. Comme son nom l'indique la version est "testing" ce qui occasionne des instabilités temporaires au gré des contributions des auteurs des paquets debian, rien d'insurmontable mais nécessité d'un certain savoir-faire...
Les instructions sont lancées depuis la racine du dépôt listé ci-dessus.
sudo rm -r /data/RpiGenImage/Images/buster/build
sudo CONFIG_TEMPLATE=raspife3-bullseye_19-11-09 ./rpi23-gen-image.sh
Le fichier raspife3-bullseye_19-11-09
dérive de raspife3-buster_19-09-12
mais en diffère sur un certain nombre de points assurant la cohérence entre la procédure-le noyau-le choix effectués. Il se trouve dans le répertoire templates
et contient les informations présentées ci-dessous. Se reporter à la documentation de rpi23-gen-image
pour avoir des précisions sur les paramètres utilisés. Ces informations sont celles qui ont été extraites du fichier de configuration qui a permis de produire l'image proposée au téléchargement. Les paquets listés dans APT_INCLUDES_LATE=""
sont ceux qui sont ajoutés à la construction par défaut pour les besoins du projet. On y trouve les outils de compilation, le langage python et python3, les ressources pour l'affaichage graphique et la manipulation de graphiques et vidéos, firefox et quelques utilitaires ainsi que des paquets ajoutés au coup par coup au cours du développement du projet.
télécharger le fichier raspife3-bullseye_19-11-09
La trace de l'exécution apparait à l'écran, la durée dépend de la puissance de la machine utilisée et peut atteindre une heure ou plus. Lorsque tout se passe bien l'exécution s'achève par les messages suivants :
killing processes using mount point ...
removing temporary mount points ...
/data/RpiGenImage/Images/buster/rpi3-buster.img (4390M) : successfully created
On dispose alors de deux fichiers :
* rpi3-buster.bmap
* rpi3-buster.img
qui peuvent être directement utilisés ou être enrichis comme proposé dans les chapitres suivants. Dans les deux cas il est nécessaire pour poursuivre de copier cette image sur une micro-SD en utilisant la commande bmaptool copy
(installer le paquet bmaptools si nécessaire).
2.6 Raspberry Pi4 Buster
Cette image a été générée en utilisant le fichier template raspife4-buster_20-02-04
et le script standard rpi23-gen-image.sh
. ce travail étant réalisé dans le cadre du projet Météo Climat Tremplin pour l'enseignement des Sciences. L'utilisation de la distribution buster permet d'assurer une veille sur l'évolution de la distribution Debian et anticiper les effets des changements de certains paquets sur le projet. Cette est image n'est pas recommandée à un utilisateur ordinaire mais fera certainement le bonheur d'un utilisateur avancé à l'affut de dernières mises à jour, cette image présente tous les avantages et inconvénients d'une distribution "debian testing". Le package weewx de gestion de stations météorologiques est introduit par défaut; il permet d'illustrer l'incorporation de paquets debian non présents dans les dépôts par défaut. Quelques autre paquets supplémentaires ont été ajoutés et certains paquets présents dans la version stretch ont du être retirés du fait d'incompatibilités avec la version deu noyau choisi. Comme son nom l'indique la version est "testing" ce qui occasionne des instabilités temporaires au gré des contributions des auteurs des paquets debian, rien d'insurmontable mais nécessité d'un certain savoir-faire...
Les instructions sont lancées depuis la racine du dépôt listé ci-dessus.
sudo rm -r /data/RpiGenImage/Images/buster/build
sudo CONFIG_TEMPLATE=raspife4-buster_20-11-01 ./rpi23-gen-image.sh
télécharger le fichier raspife4-buster_20-11-01
La trace de l'exécution apparait à l'écran, la durée dépend de la puissance de la machine utilisée et peut atteindre une heure ou plus. Lorsque tout se passe bien l'exécution s'achève par les messages suivants :
killing processes using mount point ...
removing temporary mount points ...
/data/RpiGenImage/Images/buster/rpi4-buster.img (4390M) : successfully created
On dispose alors de deux fichiers :
* rpi4-buster.bmap
* rpi4-buster.img
qui peuvent être directement utilisés ou être enrichis comme proposé dans les chapitres suivants. Dans les deux cas il est nécessaire pour poursuivre de copier cette image sur une micro-SD en utilisant la commande bmaptool copy
(installer le paquet bmaptools si nécessaire).
2.7 Raspberry Pi4 BullsEye
Cette image a été générée en utilisant le fichier template raspife4-64-bullseye_20-02-04
et le script standard rpi23-gen-image.sh
. ce travail étant réalisé dans le cadre du projet Météo Climat Tremplin pour l'enseignement des Sciences. L'utilisation de la distribution buster permet d'assurer une veille sur l'évolution de la distribution Debian et anticiper les effets des changements de certains paquets sur le projet. Cette est image n'est pas recommandée à un utilisateur ordinaire mais fera certainement le bonheur d'un utilisateur avancé à l'affut de dernières mises à jour, cette image présente tous les avantages et inconvénients d'une distribution "debian testing". Le package weewx de gestion de stations météorologiques est introduit par défaut; il permet d'illustrer l'incorporation de paquets debian non présents dans les dépôts par défaut. Quelques autre paquets supplémentaires ont été ajoutés et certains paquets présents dans la version stretch ont du être retirés du fait d'incompatibilités avec la version deu noyau choisi. Comme son nom l'indique la version est "testing" ce qui occasionne des instabilités temporaires au gré des contributions des auteurs des paquets debian, rien d'insurmontable mais nécessité d'un certain savoir-faire...
Les instructions sont lancées depuis la racine du dépôt listé ci-dessus.
sudo rm -r /data/RpiGenImage/Images/buster/build
sudo CONFIG_TEMPLATE=raspife3-bullseye_19-11-09 ./rpi23-gen-image.sh
Le fichier raspife3-bullseye_19-11-09
dérive de raspife3-buster_19-09-12
mais en diffère sur un certain nombre de points assurant la cohérence entre la procédure-le noyau-le choix effectués. Il se trouve dans le répertoire templates
et contient les informations présentées ci-dessous. Se reporter à la documentation de rpi23-gen-image
pour avoir des précisions sur les paramètres utilisés. Ces informations sont celles qui ont été extraites du fichier de configuration qui a permis de produire l'image proposée au téléchargement. Les paquets listés dans APT_INCLUDES_LATE=""
sont ceux qui sont ajoutés à la construction par défaut pour les besoins du projet. On y trouve les outils de compilation, le langage python et python3, les ressources pour l'affaichage graphique et la manipulation de graphiques et vidéos, firefox et quelques utilitaires ainsi que des paquets ajoutés au coup par coup au cours du développement du projet.
télécharger le fichier raspife3-bullseye_19-11-09
La trace de l'exécution apparait à l'écran, la durée dépend de la puissance de la machine utilisée et peut atteindre une heure ou plus. Lorsque tout se passe bien l'exécution s'achève par les messages suivants :
killing processes using mount point ...
removing temporary mount points ...
/data/RpiGenImage/Images/buster/rpi3-buster.img (4390M) : successfully created
On dispose alors de deux fichiers :
* rpi3-buster.bmap
* rpi3-buster.img
qui peuvent être directement utilisés ou être enrichis comme proposé dans les chapitres suivants. Dans les deux cas il est nécessaire pour poursuivre de copier cette image sur une micro-SD en utilisant la commande bmaptool copy
(installer le paquet bmaptools si nécessaire).
3. Ajustements manuels génériques
La micro-SD qui va être utlisée deviendra le disque dur de la Raspberry Pi, les accès à la partie système doivent donc être privilégiés c'est pourquoi dans ce qui suit il est impératif d'agir en tant qu'utilisateur privilégé pour pouvoir faire les modifications. ATTENTION à ne pas modifer les fichiers de la machine hôte utilisée pour travailler.... Les conséquences seraient dramatiques !
Le tutoriel qui suit est réalisé en plaçant la microSD vierge dans un connecteur de carte SD, sou linux il est en général affecté à /dev/mmcblkO
. Le nom du "device"
utilisé pour la micro-SD peut varier en fonction de la configuration de la machine hôte. ATTENTION l'utilisation d'adapteurs USB fonctionne mais peut prsenter de légères différences avec les situations décrites ci-dessous, notamment le device sera /dev/sd?
(? est une lettre a b c d e f...).
3.1 Copie de l'image sur une micro-SD
Une fois l'image terminée elle est opérationnelle et peut donc être chargée dans une Raspberry Pi qui démarrera avec elle sans interface graphique, le but du travail décrit par ce chapître est de lui fournir une interface graphique ainsi que quelques autres améliorations. On copie d'abord l'image sur une microSD. La création de l'image a fourni un fichier .bmap
qui permet d'utiliser l'outil d'accélération de la copie bmaptools
si on dispose d'un ordinateur équipé de ce logiciel. Le paquet bmap-tools
existe dans la plupart des distributions linux
(en cas de distribution très ancienne la version de bmap-tools peut être incompatible avec celle qui a été utilisée pour fabriquer l'image dans ce cas utiliser la procédure standard avec la commande dd). Quelques exemples de copie de l'image sur la carte SD
, l'option --bmap
est devenue inutile si l'image porte le même nom que la bmap. L'intérêt de bmaptool est de ne pas obliger à décompresser l'image. le nom de support de destination dépend de l'ordinateur utilisé (/dev/mmcblk0 ou /dev/sdg /dev/sdc...) La commande de copie est irréversible elle détruit tout ce qui se trouve à l'adresse de destination toujours vérifier que la destination écrite est bien celle qui est souhaitée pour ne pas perdre de données.
sudo bmaptool copy 2020-02-05-rpi3P-buster-32.img.xz /dev/mmcblk0
sudo bmaptool copy 2020-02-10-rpi4-buster-64.img.xz /dev/mmcblk0
sudo bmaptool copy 2020-02-04-rpi4-bullseye-64.img /dev/mmcblk0
S'il n'est pas possible d'utiliser bmaptool il est toujours possible dedécompresser l'image et de la recopier avec la commande dd
qui ait une copie brute (ne pas utiliser de commande de copie de ficher ou un glisser déposer.
7z x 2020-11-08-rpi4-64-testing.img.xz
dd if=2020-11-08-rpi4-64-testing.img of=/dev/mmcblk0 bs=4M
La valeuer de block size (bs)
dépend de beaucoup de paramètres hard et soft de l'ordinateur utilisé il peut considérablement modifier le temps de copie, éventuellement le modifier pour améliorer les temps de transfert.
Les images créées n'occupent qu'une partie de l'espace disponible, il faut prévoir de redimensionner la partition pour occuper tout l'espace disponible.
3.2 Ajustement de la taille de l'image
L'image qui vient d'être produite est inscrite sur une partition ajustée à la taille de cette image augmentée de quelques mégaoctets. Afin de pouvoir effectuer les modifications suivantes il est impératif d'agrandir la partition pour accomoder l'espace nécessaire pour stocker les différents fichiers de configuration ainsi que tous les nouveaux programmes nécessaires. Pour y parvenir lorsque l'image a été copiée sur une microSD montée sur /dev/mmcblk0
utiliser le commande gparted
:
sudo gparted
Dans le logiciel gparted :
- démonter les deux partitions de la SD
- redimensionner la seconde partition (ext4)
- choisir une dimension compatible avec la SD utilisée ou avec les SD cibles, penser à prendre un peu de marge car toutes les SD ne proposent pas effectivement tout l'espace annoncé et par ailleurs ne pas oublier que les constructeurs annoncent les tailles en unités du Système International (puissances de 10) alors que les ordinateurs mesurent les tailles en binaire (pussances de 2) ainsi une SD achetée pour 8 Gio contiendra au mieux 8 x 10 ^ 9 octets = 8 000 000 000 octets et pas les 8Go 8 x 2 ^ 30 = 8 x 1073741824 = 8 589 934 592 que vous souhaiteriez y mettre ! (Dans cet exemple 7.4 Go est voisin de la limite des 8Gio)
Même si on pent encore en trouver les microSD de taille 8 Go
ont quasiment disparu et on peut raisonnablement adopter une taille allant jusqu'à 16 Go
pour cette image de base sans risque d'empêcher un usager d'utiliser l'image ainsi créée. Suivant les logiciels installés à postériori le système peut dépasser 20 Go
et suivant les usages mis en oeuvre l'espace requis peut être encore plus important. Toujours choisir une taille de SD adaptée aux besoins envisagés ou choisir une autre solution : par exemple utiliser un disque SSD sur l'USB3 de la raspi4.
Une autre méthode est d'utiliser la commande fdisk en tant que superutilisateur.
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
puis2
puisn
puisp
puis2
puis- accepter la valeurs par défaut qui correspondent au premier bloc disponible
+10000M
afin de produire une image qui puisse fonctionner sur une petite cartes SDN
pour "remove signature",- pour finir taper
w
.
puis :
sudo resize2fs /dev/mmcblk0p2
La suite des opérations se déroule à partir de la RaspberryPi "bootée" avec la nouvelle image.
4. Ajustements après le premier démarrage de la Raspberry munie de sa nouvelle image
L'image fournie doit booter normalement et se connecter spontanément au réseau filaire, dans ce cas il est possible de réaliser toutes les installations sans écran ni clavier ni souris. Un réseau WIFI peut aussi être configuré par défaut afin de permettre une connexion wifi, si le réseau wifi n'est pas connu au moment de la création de l'image, il est nécessaire de connecter la raspberryPi
à un clavier et à un écran pour configurer manuellement le wifi.
Pour obtenir l'adresse IP de la raspberry, si le réseau n'est pas trop étendu et ne contient pas trop de raspberries, on peut depuis l'ordinateur d'installation utiliser l'une des commande ci-desous :
- Si l'image utilisée a été configurée avec une IP fixe il va de soi qu c'est elle qui doit être utilisée
- Si on dispose d'un accès à la configuration du DHCP il suffit de s'y connecter et de récupérer l'adresse de la Raspberry dans notre exemple son nom est raspife2, raspife3, raspife3P, raspwife3, raspife4 suivant la configuration choisie
- Si on ne dipose que de l'accès standard au réseau on peut utiliser la commande
sudo nmap -sP -n ***.****.***.0/**
la valeur***.****.***.0/**
représente le réseau sur lequel on se trouve, les valeurs peuvent être obtenues avec la commandeip addr
; si l'on dispose de l'adresse MAC de la Raspberry**:**:**:**:**:**
on peut filtrer la commande ci-dessus avec l'adresse recherchéesudo nmap -sP -n ***.****.***.0/** | grep -e **:**:**:**:**:** -B 2
Une fois l'adresse obtenue se connecter via ssh ; ssh ens-ife@***.****.***.***
(remplacer ens-ife par le nom de l'utilisateur initial choisi dans le fichier de confiuration initiale)
Lors de la première connexion la configuration de l'hôte peut s'avérer inadaptée, modifier le fichier sudo jed /etc/host.conf
en commentant la ligne spoof warn
#spoof warn
multi on
4.1. Modification de la taille de l'espace utilisé (au besoin seulement)
Si cela n'a pas déjà été fait, ou si cela s'avère nécessaire (les images proposées ici font un peu moins de 16Go pour pouvoir être directement recopiées sur une SD d'au moins 16Go une partie de l'espace disque est occupées si on utilise une clef plus grosse), il est possible / souhaitable de redimensionner la partition racine sur la Raspberry Pi fonctionnant avec la nouvelle image. Pour cela une fois la Raspberry Pi opérationnelle et démarrée, se connecter en tant quadministrateur puis 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
puis2
puisn
puisp
puis2
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 une première fois
sudo reboot
puis :
sudo resize2fs /dev/mmcblk0p2
Taper ensuite une seconde fois
sudo reboot
Après ce second redémarrage la racine du système occupe maintenant la totalité de l'espace disponible sur la SD.
4.2 Mises à jour et installation d'utilitaires
L'image installée ne contient pas les paquets non libres pour les rajouter éditer le fichier /etc/apt/sources.list
et ajouter à la fin de chaque ligne active non-free
.
sudo nano /etc/apt/sources.list
Il peut s'être écoulé suffisamment de temps entre la création de l'image et sa mise en oeuvre, certains paquets peuvent avoir évolué, certains paquets peuvent être incomplètement configurés et il est recommandé de faire une mise à jour. Pour cela mettre à jour la liste des paquets et mettre à jour ensuite les nouveaux paquets de la liste :
sudo apt update
sudo apt upgrade
sudo apt dist-upgrade
sudo dpkg-reconfigure locales
sudo dpkg-reconfigure tzdata
Vérifier que tous les utilitaires et autres programmes ont été installés lors de la construction de l'image, utiliser la commande ci dessous. Pour tous les paquets renvoyant le message dpkg-query: aucun paquet ne correspond à *****
, les installer avec la commande standard d'installation de la ligne suivante (tous les paquets sont reportés ici une partie seulement peut-être utilisée:
dpkg -l dirmngr wpasupplicant php-fpm fcgiwrap libfcgi-dev php7.3-mysql ca-certificates-java icedtea-netx openjdk-11-jdk openjdk-11-jre openjdk-11-jre-headless
sudo apt install jed dirmngr wpasupplicant php-fpm fcgiwrap libfcgi-dev php7.3-mysql ca-certificates-java icedtea-plugin icedtea-netx openjdk-11-jdk openjdk-11-jre openjdk-11-jre-headless
Dans une installation buster
ou bullseye
les paquets openjdk-11 sont disponibles :
4.3 Ajout d'une interface graphique
Afin de disposer d'une interface graphique on ajoute un display manager
(lxdm dans ce cas), un window manager
(lxde ou lxqt dans cette proposition). Cette interface graphique a pu être installée par défaut mais des anomalies liées à des dépendances non satisfaites du fat de l'évolution rapide des packages des interfaces graphiaques. L'interface graphique peut ne pas être opérationnelle et dans ce cas supprimer puis réinstaller les paquets (il est possible de choisir un autre display manager
et window manager
, toujours choisir des environnements peu gourmands en ressources.
sudo apt purge lxdm lxde* lxqt*
sudo apt install lxde lxdm lxqt
4.4 Ajout d'utilisateurs et gestion des droits
Lors de la création un seul utilisateur par défaut a été créé ens-ife
, dans notre projet cet utilisateur est l'administrateur de secours et nous proposons de créer :
- un administrateur principal
localadm
, - un utilisateur qui gèrera l'accès à la station météo
weewx
- un utilisateur invité qui servira de test
moon
(ce login est utilisé en référence aux machines de développement ayant un utilisateur jupyter et un utilisateur callisto...) - un administrateur de l'nterface de programmation jupyterhub
callisto
- un créateur par défaut d'un serveur de terminaux
tsuser
. Les groupes et les utilisateurs sont ajoutés avec les commande standard linux debianaddgroup
etadduser
for i in i2c gpio jupyterhub; do sudo addgroup $i; done
for i in localadm weewx moon callisto tsuser; do sudo adduser $i; done
l'utilisateur localadm
doit disposer des droits d'administration :
sudo adduser localadm sudo
Les utilisateurs ens-ife
, localadm
, callisto
, tsuser
et moon
doivent pouvoir en outre utiliser les ressources matérielles de la raspberry on les affecte aux groupes nécessaires :
for i in localadm moon ens-ife callisto tsuser; do for j in i2c gpio netdev plugdev audio video; do sudo adduser $i $j; done; done
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.
Les utilisateurrs localadm
, moon
, ens-ife
, callisto
doivent appartenir au groupe jupyterhub
:
for i in localadm moon ens-ife callisto; do sudo adduser $i jupyterhub; done
4.5 Activation du serveur de terminaux à distance
Depuis le début l'ensemble du travail a pu être réalisé sans connecter clavier/écran/souris à la RaspberryPi. Pour pouvoir continuer dans cette logique tout en profitant d'une interface graphique évoluée nous allons installer un terminal serveur sur la raspi qui pourra être affiché sur n'importe quel ordinateur du même réseau.
4.5.1 Mise en place de tigervnc
Lors de la construction de l'image on a ajouté le logiciel tigervncserver
qui permet d'afficher sur un écran distant l'écran de la raspberry via le protocole VNC
, ce protocole permet de ne pas avoir à connecter un clavier une souris et un écran à une raspberry Pi pour pouvoir l'utiliser. Il est très utile de disposer du serveur de terminaux dès le boot de la raspberry. Pour cela ce logiciel va être installé comme un service et l'écran sera fourni par un user spécialisé tsuser
. Configurer tigervncserver
en décommentant ou modifiant les lignes suivantes du fichier /etc/vnc.conf
.
$fontPath = undef;
$PAMService = "login";
$vncStartup = "$vncUserDir/Xvnc-session";
$geometry = "1280x720";
Avant d'entâmer cette procédure nous allons définir le mot de passe qui sera utilisé par le login tsuser
pour lancer le serveur de terminaux au démarrage. Pour cela se connecter en tant que tsuser sur la raspi et exécuter la commande vncpasswd
. Copier le fichier /etc/X11/Xvnc-session
dans .vnc
.
su tsuser
cd
vncpasswd
cp /etc/X11/Xvnc-session .vnc
Le mot de passe doit être ajouté et par défaut dans ce cas c'est le nom de la machine raspife4
, raspife3
, raspife3P
ou raspife2
qui est utilisé. (Suivant les versions et les configurations le mot de passe peut-être tronqué à 8 caractères). Entrer dans le dossier .vnc
et modifier le fichier .vnc/Xvnc-session
pour qu'il ressemble à ce qui suit (commentez ou décommentez les lignes qui vous intéressent on a choisi ici lxqt
)
nano .vnc/Xvnc-session
:
test x"$SHELL" = x"" && SHELL=/bin/bash
test x"$1" = x"" && set -- default
vncconfig -iconic &
"$SHELL" -l <<EOF
#exec /etc/X11/Xsession "$@"
#exec /usr/bin/startlxde "$@"
exec /usr/bin/startlxqt "$@"
EOF
vncserver -kill $DISPLAY
Vérifier le fonctionnement de vncserver lancé par tsuser
afin de garantir que l'image binaire fonctionnera par défaut, puis éteindre vnc afin de configurer le service.
vncserver
vncserver -kill :1
Vérifier que le fichier soit exécutable puis relancer le serveur.
Vérifier le fonctionnement en utilisant un outil d'affichache de terminaux comme remmina
par exemple.
Dans certains rares cas l'installation de lxqt/lxde/lxdm s'est mal passée il a fallu purger tous les éléments de lxqt/lxde/lxdm et les réinstaller (cf plus haut) de même pour le paquet xfonts-base
, d'autres fois ce sont les paquets openbox-menu openbox-lxde-session obconf lxhotkey-plugin-openbox
qui étaient défectueux. Parfois ce fut lxpanel
et lxpanel-data
. Ces anomalies relèvent probablement d'une instabilité de création _à traiter avec précaution (investigations en cours)._
Pour mettre en place un service on ajoute un fichier de lancement dans le répertoire /etc/systemd/system
avec la commande sudo nano /etc/systemd/system/vncserver@.service
avec le contenu suivant :
[Unit]
Description=TigerVNC remote desktop server
#After=sshd.service
After=syslog.target network.target
[Service]
Type=simple
User=tsuser
Group=root
#PAMName=login
PIDFile=/home/%u/.vnc/%H:%i.pid
ExecStartPre=/bin/sh -c '/usr/bin/tigervncserver -kill :%i > /dev/null 2>&1 || :'
ExecStart=/usr/bin/tigervncserver :%i -geometry 1280x720 -alwaysshared -fg
[Install]
WantedBy=multi-user.target
Pour qu'il soit automatiquement lancé au démarrage il doit être déclaré avec la commande sudo systemctl enable vncserver@1
. Vncserver est alors un service manipulable comme tous les autres services de la machine; ne pas oublier de l'arrêter quand on n'en a plus besoin pour éviter de broadcaster en permanence sur le réseau. Pour trouver la Raspberry Pi proposant un terminal serveur si on ne connait pas son adresse, il suffit de chercher une machine faisant du broadcast sur le port 5901, on trouvera bien sûr 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 on ne compte pas exploiter ce service il faut le désactiver avec la commande sudo systemctl disable vncserver
pour éviter de consommer inutilement des ressources.
Le service ainsi installé est aussi une commodité pour que les usagers qui arrivent pour la première fois sur la plateforme et qui ne sont pas habitués à l'usage de lignes de commande puissent travailler confortablement. Il est 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é intensément 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 d'écran d'affichage 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(choisir le mot de passe notamment).
4.5.2 Allègement de la sécurité ou retour à tightvncserver
le serveur de terminaux installé est tigervncserver
qui impose des règles de sécurité plus strictes que tightvncserver
qui était proposé dans les images précédentes. Par défaut pour plus de simplicité la connection repose sur la mise en place du transfert du port d'affichage via un tunnel sécurisé classique que l'on démarre avec une commande ssh (qui peut sous windows être stockée dans un putty et exécutée avant le connecteur vnc). Si le serveur utilise le premier port (5901) la commande pour créer le tunnel sera :
ssh -L 5901:127.0.0.1:5901 -N -f -l userOnTheServer server.ip
- userOnTheServer est le nom de l'utilisateur de la raspberryPi qui permet de créer le tunnel
- server.ip est l'adresse IP de la raspberryPi serveur VNC
Une fois le tunnel ouvert tout utilisateur de la machine locale pourra ouvrir l'écran à distance de la raspberryPi via VNC.
Il n'y a aucun problème avec l'univers linux mais il est possible que certains systèmes d'exploitation ne permettent pas de faire facilement des tunnels et d'utiliser cette fonctionnalité de tigervnc
dans sa configuration par défaut, les deux protocoles ci-dessous permettent soit de diminuer la sécurité par défaut soit de revenit à tightvncserver
. Ces manipulations ne sont pas recommandées et effectuées aux risques et périls de l'usager.
Pour permettre un service par authentification non sécurisée réalisée par mot de passe simple (comme le propose tightvnc par défaut) changer la ligne ci-dessous de fichier de service /etc/systemd/system/vncserver@.service
ExecStart=/usr/bin/tigervncserver :%i -geometry 1280x720 -alwaysshared -fg
en
ExecStart=/usr/bin/tigervncserver :%i -geometry 1280x720 -localhost no -alwaysshared -fg
Le même changement dans la ligne de commande produit les mêmes effets si tigervnc n'st pas utilisé comme service.
Pour revenir à tightvnc
sudo systemctl stop vncserver@1
sudo systemctl disable vncserver@1
sudo apt remove tiger*
sudo apt install tightvncserver
update-alternatives: utilisation de « /usr/bin/tightvncserver » pour fournir « /usr/bin/vncserver » (vncserver) en mode automatique
update-alternatives: utilisation de « /usr/bin/Xtightvnc » pour fournir « /usr/bin/Xvnc » (Xvnc) en mode automatique
update-alternatives: utilisation de « /usr/bin/tightvncpasswd » pour fournir « /usr/bin/
sudo rm /etc/X11/Xvnc-session
sudo vncserver
Cette commande régénère le fichier /etc/X11/Xvnc-session
dont la nouvelle version est visible avec cat /etc/X11/Xvnc-session
.
#!/bin/sh
#xrdb $HOME/.Xresources
xsetroot -solid grey
#x-terminal-emulator -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" &
#x-window-manager &
# Fix to make GNOME work
export XKL_XMODMAP_DISABLE=1
/etc/X11/Xsession
Reconstruire les fichiers permettant le fonctionnement nominal du dispositif.
sudo su tsuser
rm .vnc/*
vncpasswd » (vncpasswd) en mode automatique
vncserver -geometry 1280x720 -depth 24 :1
New 'X' desktop is raspife3P:1
Creating default startup script /etc/X11/Xvnc-session
Starting applications specified in /etc/X11/Xvnc-session
Log file is /home/tsuser/.vnc/raspife3P:1.log
Redéfinir et renommer le fichier de service en vncserver.service
.
[Unit]
Description=TigerVNC remote desktop server
#After=sshd.service
After=syslog.target network.target
[Service]
Type=simple
User=tsuser
Group=root
PIDFile=/home/tsuser/.vnc/raspife3P:1.pid
ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill :1 > /dev/null 2>&1 || :'
ExecStart=/usr/bin/vncserver -geometry 1280x720 -depth 24 :1
ExecStop=/usr/bin/vncserver -kill :1
[Install]
WantedBy=multi-user.target
4.6 Configuration du réseau
La construction de base de l'image fournit en théorie une raspberryPi opérationnelle sur le réseau filaire, sur notre réseau éducatif MobileClimatEtMeteo
avec comme mot de passe ClimatEtMeteo
. Le gestionnaire de réseau interactif installé par défaut est wicd, il permet de créer une interface pour n'importe quel réseau. Il est possible de changer cet outil (voir plus basune proposition de méthode).
4.6.1 Configuration de systemd-networkd
Pour que la Raspberry prenne automatiquement le réseau filaire il y a deux solutions :
- soit on affecte une IP fixe et dans ce cas on retrouvera la Raspberry à cette adresse
- soit la Raspberry doit obtenir une adresse via le service
DHCP
du réseau
Ces deux solution s'excluent il faudra choisir.
S'il n'existe pas on va d'abord créer un répertoire qui accueillera les fichiers modifiés de configuration du réseau :
sudo mkdir /etc/systemd/network
Si le fichier /etc/resolv.conf
n'existe pas ou s'il s'agit d'un fichier ordinaire ajouter le lien pour le resolver, Attention il est possible que le fichier /run/systemd/resolve/resolv.conf
n'existe pas :
sudo rm /etc/resolv.conf
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
Pour éviter d'avoir plusieurs interfaces réseau il est souhaitable de désactiver les interfaces par défaut du système dans le répertoire /lib/systemd/network
:
cd /lib/systemd/network
sudo mv 10-eth0.network 10-eth0.network-orig
sudo mv 11-wlan0.network 11-wlan0.network-orig
Il existe probablement une solution plus élégante mais celle-ci fonctionne (merci de toute suggestion). La dernière commande permet de revenir à la racine après scette modification.
Vérifier aussi que le répertoire /etc/systemd contient un fichier de configuration resolved.conf
et par précaution ajouter le DNS de google par défaut (on pourra l'enlever si la Raspberry parvient automatiquement à trouver le DNS du réseau).
cd /etc/systemd/
sudo nano resolved.conf
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
#
# Entries in this file show the compile time defaults.
# You can change settings by editing this file.
# Defaults can be restored by simply deleting this file.
#
# See resolved.conf(5) for details
[Resolve]
#DNS=
#FallbackDNS=
#Domains=
#LLMNR=yes
#MulticastDNS=yes
#DNSSEC=allow-downgrade
#DNSOverTLS=no
#Cache=yes
#DNSStubListener=yes
#ReadEtcHosts=yes
Pour cela modifier la ligne suivante comme proposé ci-dessous. on utilise le DNS Quad9
pour des raisons de protection des données privées.
DNS=9.9.9.9
FallbackDNS=9.9.9.9
4.6.1.1 IP fixe
Ajouter dans le répertoire ci-dessus le fichier 50-wired.network
sudo nano /etc/systemd/network/50-wired.network
Fournir la configuration suivante dans laquelle ***.***.***.***
représente successivement les adresses du DNS, du réseau qui sera utilisé et de la passerelle. enx*
est un contournement temporaire permettant de connecter n'importe quelle interface cette valeur devra être changée par la vraie valeur de l'interface dès qu'elle sera connue (voir plus bas) :
[Match]
Name=enx*
Host=raspwife3
Virtualization=no
[Network]
DHCP=no
Address=***.***.***.***/24
Gateway=***.***.***.***
DNS=***.***.***.***
Attention en mettant enplace une telle configuration et en la diffusant il est impératif de réaliser que l'image proposée sera opérationnelle mais ne pourra pas se connecter au réseau via DHCP car il est désactivé. Il est donc impératif d'avoir configuré le réseau pour qu'il puisse accueillir la raspberryPi configurée pour l'adresse fixe choisie dans le fichier ci-dessus.
4.6.1.2 IP dynamique fournie par le DHCP
Pour la Raspberry Pi 3 2 interfaces réseau existent et sont susceptibles de se connecter via dhcp une interface filaire et une interface WIFI. L'interface filaire porte le même nom que dans le cas précédent
sudo nano /etc/systemd/network/50-wired.network
enx*
est un contournement temporaire permettant de connecter n'importe quelle interface cette valeur devra être changée par la vraie valeur de l'interface dès qu'elle sera connue (voir plus bas) :
[Match]
#Name=enx*
Name=
Host=raspife3
[Network]
DHCP=yes
[DHCP]
RouteMetric=10
L'interface WIFI sera créée dans le fichier 55-wireless.network
sudo nano /etc/systemd/network/55-wireless.network
Fournir la configuration suivante le nom wlan0 est générique.
[Match]
Name=wlan0
Host=raspife3
[Network]
DHCP=yes
[DHCP]
RouteMetric=20
Cette configuration est insuffisante pour que le WIFI soit activé directement au démarrage car il faut fournir les paramètres de connection (nom et mot de pase du WIFI).
Pour remédier à ce problème, si on dispose à l'avance des paramètres du réseau cible, il est possible de configurer le réseau à l'aide des commandes nmcli
du logiciel network-manager
qui a été préinstallé. Il y a donc trois solutions pour que la Raspberry puisse se connecter au réseau :
* effectuer la configuration des fichiers network-manager
Avant d'insérer la micros-SD dans la Raspberry à condition de disposer des paramètres nécessaires
* effectuer la configuration depuis un terminal à distance (la connection filaire est automatique) en ligne de commandes avec nmcli
* Utiliser un clavier/écran/souris pour fournir les paramètres à l'interface graphique de ẁicd` une fois la raspberryPi démarrée.
Option Option Option Option Option Option
4.6.2 (Optionnel) Configuration de network-manager
au lieu de wicd
Tout ce qui suit est totalement optionnel le logiciel wicd
est maintenant opérationnel en l'état pour buster
(ce qui n'était pas le cas dans des versions précédentes) par contre les problèmes subsistent pour bullseye
(wicd
est absent)cette partie du tutoriel a été conservée pour bullseye
et au cas où les problèmes réapparaitraient ou si pour des questions de goût ou d'usage l'utilisateur souhaite changer de gestionnaire réseau.
Supprimer le logiciel wicd
et installer à la place network-manager-gnome
.
```shell sudo apt purge wicd sudo apt install network-manager network-manager-gnome at-spi2-core
Le logiciel `networkmanager` est installé pour gérer le réseau. ce logiciel propose une interface ne ligne de commande extrêmement performante `nmcli` pourvue de nombreuses options qui permettent de gérer le réseau très finement. Il est fortement conseillé de booter la première fois avec une connexion réseau ce qui permet àla raspberry de récupérer une date correcte et d'assurer un fonctionnement nominal par la suite.
Le bloc ci-dessous présente les options de premier niveau de `nmcli` il y a jusqu'à 4 niveaux d'options pour certaines commandes, pour connaitre la façon de les utiliser taper la commande suivie de `help` par exemple :
```shell
nmcli -p radio help
Syntaxe : nmcli radio { COMMAND | help }
COMMAND := { all | wifi | wwan }
all | wifi | wwan | wimax [ on | off ]
nmcli -h
Usage: nmcli [OPTIONS] OBJECT { COMMAND | help }
OPTIONS
-o[verview] overview mode (hide default values)
-t[erse] terse output
-p[retty] pretty output
-m[ode] tabular|multiline output mode
-c[olors] auto|yes|no whether to use colors in output
-f[ields] <field1,field2,...>|all|common specify fields to output
-g[et-values] <field1,field2,...>|all|common shortcut for -m tabular -t -f
-e[scape] yes|no escape columns separators in values
-a[sk] ask for missing parameters
-s[how-secrets] allow displaying passwords
-w[ait] <seconds> set timeout waiting for finishing operations
-v[ersion] show program version
-h[elp] print this help
OBJECT
g[eneral] NetworkManager's general status and operations
n[etworking] overall networking control
r[adio] NetworkManager radio switches
c[onnection] NetworkManager's connections
d[evice] devices managed by NetworkManager
a[gent] NetworkManager secret agent or polkit agent
m[onitor] monitor NetworkManager changes
Le paragraphe ci-dessous démontre quelques exemples utiles d'utilisation de nmcli
.
La commande ci-dessous permet de lister les interfaces réseau disponibles et d'obtenir leur état :
nmcli -p device status
==========================
État des périphériques
==========================
DEVICE TYPE STATE CONNECTION
--------------------------------------------------------------------------------------
enxb827eb6e992b ethernet connecté Connexion filaire 1
wlan0 wifi déconnecté --
lo loopback non-géré --
La commande ci-dessous permet de lister les points d'accès wifi disponibles :
nmcli -p device wifi list
===================================
Liste de balayage Wi-Fi (wlan0)
===================================
IN-USE SSID MODE CHAN RATE SIGNAL BARS SECURITY
------------------------------------------------------------------------------------------------------------------
MobileClimatEtMeteo Infra 4 54 Mo/s 95 ▂▄▆█ WPA1
*************** Infra 1 405 Mo/s 94 ▂▄▆█ WPA2
FreeWifi_secure Infra 4 195 Mo/s 50 ▂▄__ WPA2 802.1X
***************** Infra 4 195 Mo/s 49 ▂▄__ WPA2
FreeWifi Infra 4 195 Mo/s 49 ▂▄__ --
La commande ci-dessous permet de lister les connexions actives, en ajoutant le nom de l'interface on obtient la liste et la valeur de tous les paramètres de l'interface :
nmcli -p connection show
=======================================
Profils de connexion NetworkManager
=======================================
NAME UUID TYPE DEVICE
-----------------------------------------------------------------------------------------------------------------------------
Connexion filaire 1 91773701-33bc-31cc-a016-de04999ec61b ethernet enxb827eb6e992b
La commande ci-dessous devrait permettre de se connecter à un des points d'accès wifi disponibles mais comme nous allons le voir l'utilisateur ordinaire ne dispose pas des droits nécessaires :
nmcli device wifi connect MobileClimatEtMeteo password ClimatEtMeteo
Erreur : échec de l'ajout ou de l'activation de la nouvelle connexion : Not authorized to control networking.
On vérifie effectivement que les permissions d'un utilisateur ordinaire sont insuffisantes pour manipuler le réseau :
nmcli general permissions
PERMISSION VALUE
org.freedesktop.NetworkManager.enable-disable-network non
org.freedesktop.NetworkManager.enable-disable-wifi non
org.freedesktop.NetworkManager.enable-disable-wwan non
org.freedesktop.NetworkManager.enable-disable-wimax non
org.freedesktop.NetworkManager.sleep-wake non
org.freedesktop.NetworkManager.network-control auth
org.freedesktop.NetworkManager.wifi.share.protected non
org.freedesktop.NetworkManager.wifi.share.open non
org.freedesktop.NetworkManager.settings.modify.system non
org.freedesktop.NetworkManager.settings.modify.own auth
org.freedesktop.NetworkManager.settings.modify.hostname auth
org.freedesktop.NetworkManager.settings.modify.global-dns auth
org.freedesktop.NetworkManager.reload auth
org.freedesktop.NetworkManager.checkpoint-rollback auth
org.freedesktop.NetworkManager.enable-disable-statistics non
org.freedesktop.NetworkManager.enable-disable-connectivity-check non
Pour permettre à tous les membres du groupe netdev
de modifier le wifi il suffit de créer le fichier d'autorisations adéquat avec la commande sudo nano /etc/polkit-1/localauthority/50-local.d/org.freedesktop.NetworkManager.pkla
et d'ajouter dans ce fichier les lignes suivantes :
[nm-applet]
Identity=unix-group:netdev
Action=org.freedesktop.NetworkManager.*
ResultAny=yes
ResultInactive=no
ResultActive=yes
Vérifier les droits sur ce fichier le groupe netdev doit avoir le droit de lire/écrire
sudo chmod a+rx /etc/polkit-1/localauthority
sudo chown root.netdev /etc/polkit-1/localauthority/50-local.d/org.freedesktop.NetworkManager.pkla
sudo chmod g+rw /etc/polkit-1/localauthority/50-local.d/org.freedesktop.NetworkManager.pkla
Les permissions deviennent :
nmcli general permissions
PERMISSION VALUE
org.freedesktop.NetworkManager.enable-disable-network oui
org.freedesktop.NetworkManager.enable-disable-wifi oui
org.freedesktop.NetworkManager.enable-disable-wwan oui
org.freedesktop.NetworkManager.enable-disable-wimax oui
org.freedesktop.NetworkManager.sleep-wake oui
org.freedesktop.NetworkManager.network-control oui
org.freedesktop.NetworkManager.wifi.share.protected oui
org.freedesktop.NetworkManager.wifi.share.open oui
org.freedesktop.NetworkManager.settings.modify.system non
org.freedesktop.NetworkManager.settings.modify.own oui
org.freedesktop.NetworkManager.settings.modify.hostname oui
org.freedesktop.NetworkManager.settings.modify.global-dns oui
org.freedesktop.NetworkManager.reload oui
org.freedesktop.NetworkManager.checkpoint-rollback oui
org.freedesktop.NetworkManager.enable-disable-statistics oui
org.freedesktop.NetworkManager.enable-disable-connectivity-check oui
Il est alors possible de gérer les interfaces réseau à sa propre convenance.
nmcli device wifi connect MobileClimatEtMeteo password ClimatEtMeteo
Périphérique « wlan0 » activé avec « 1cbd5ef5-159e-4a3e-a5cb-844e7147c1ec ».
nmcli -p device status
==========================
État des périphériques
==========================
DEVICE TYPE STATE CONNECTION
------------------------------------------------------------------------------------
enxb827eb6e992b ethernet connecté Connexion filaire 1
wlan0 wifi connecté MobileClimatEtMeteo
lo loopback non-géré --
Pour allumer ou éteindre le wifi :
nmcli radio wifi on / off
les mêmes commandes sont utilisables dans un shell de façon interactive avec clavier et écran. Dans l'interface graphique l'outil nm-tray
fournit une interface de gestion du réseau.
4.7 Modification des accès au GPIO
et à la caméra
Pour le bon fonctionnement du projet il est souhaitable de répartir les usagers dans des groupes et il faudra donc créer ces groupes. Nous aurons besoin d'un groupe pour gérer les accès au bus GPIO
de la raspberry, pour le moment nous allons configurer les accès aux ressources.
Pour un fonctionnement sécurisé permettant l'accès de plusieurs utilisteurs au bus GPIO
sans privilèges particuliers il est nécessaire d'opérer certainesmodifications donnant à un utilisateur ordinaire membre du groupe gpio
le droit d'accéder aux ressources connectées au bus GPIO
. On rajoute le fichier 50-gpio.rules
au répertoire /etc/udev/rules.d
avec la commande ci-dessous et on ajoute le contenu suivant (on termine avec Ctrl-D):
sudo su
cat > /etc/udev/rules.d/50-gpio.rules
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'"
Lorsque la caméra est connectée, son accès est réservé par défaut à l'administrateur il est nécessaire d'ajouter un fichier de configuration supplémentaire 60-cam.rules
au répertoire /etc/udev/rules.d
avec la commnde ci-dessous et on ajoute le contenu suivant (on termine avec Ctrl-D):
cat > /etc/udev/rules.d/60-cam.rules
SUBSYSTEM=="vchiq", GROUP=="video", MODE="0660"
Dès que la caméra sera détectée (voir plus loin) tous les membres du groupe video
pourront l'utiliser.
5. Utilisation de la Raspberrry en point d'accès web (Hotspot)
Les images proposées permettent d'utiliser la Raspberry Pi au sein d'un réseau existant, il est aussi possible de la transformer en point d'accès sur un WIFI qu'elle crée et administre avec ou pas des fonctions de passerelle vers internet. Ce sujet est abordé dans un autre article de ce blog. Attention mettre en oeuvre cette configuration perturbe les règles de sécurité énoncées ici, veillez à bien configurer votre réseau en fonction de vos besoins et contraintes.
6. Configurations particulières avancées
La suite des configurations ajoute quelques services utiles.
6.1 Image buster ou bullseye "tous terrains Raspberry Pi 3 3B+ou 4" permettant entre autres l'apprentissage de la programmation
6.1.1 Compilation d'un cmake récent
Dans les versions stables de debian
la version de cmake
peut s'avérer en retard si c'est le cas compiler depuis les sources sinon installer le paquet standard.
cd
mkdir -p Logiciels/Cmake
cd Logiciels/Cmake
wget https://github.com/Kitware/CMake/releases/download/v3.19.0/cmake-3.19.0.tar.gz
tar xvfz cmake-3.19.0.tar.gz
cd cmake-3.19.0
./bootstrap && make -j4
sudo make install
6.1.2 Ajout de fontes
Vérifier s'il ne manque pas des fontes, si oui les installer.
sudo dpkg -l fonts-liberation gsfonts libxfont-dev libfontenc-dev ttf-mscorefonts-installer xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xfonts-utils
sudo apt install fonts-liberation gsfonts libxfont-dev libfontenc-dev ttf-mscorefonts-installer xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xfonts-utils
6.1.3 Activation de la caméra raspberry Pi
L'activation de la caméra se passe en deux étapes car par défaut la détection de la caméra n'est pas activée, cette situation est probablement due à la volonté de ne pas "gaspiller les ressources limitées de la Raspberry. Dans cette optique il est conseillé de n'activer la caméra qu'uniquement quand on va l'utiliser car contrairement à d'autres fonctionnalités celle ci immobiliose des ressources.
6.1.3.1 Détection de la caméra
Pour détecter la camera il est nécesaire de modifier la configuration du fichier de boot avec la commande sudo nano /boot/firmware/config.txt
la fin du fichier est recopiée ci-dessous. Pour les Pi4
du fait de l'activation de l'accélérateur 128Mo de mémoire sont déjà affectés au proc graphique il reste seulement à activer le start_x
.
gpu_mem=16
initramfs initramfs-4.13.16-v7 followkernel
dtparam=i2c_arm=on
dtparam=spi=on
La modifier pour lui donner l'aspect suivant
initramfs initramfs-4.13.16-v7 followkernel
dtparam=i2c_arm=on
dtparam=spi=on
gpu_mem=16 # Comment this line when activating the camera to provide more memory
# 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
#
Pour activer la camera il faut commenter la ligne gpu_mem=16
et décommenter les deux lignes start_x=1
et gpu_mem=128
puis impérativement rebooter. Une fois le reboot effectué si la caméra est connectée elle apparait aux côtés des autres périphériques sous le nom /dev/vchiq
6.1.3.2 Ajout des logiciels de pilotage de la caméra
La caméra et le module de pilotage ne sont hélas pas des modules standard de la distribution Debian et il est hélas nécessaire de les compiler. La manipulation a effectuer est détaillée ci-dessous :
Créer un répertoire d'accueil des programmes puis se positionner dans ce dossier. Télécharger les outils de compilation croisée puis les sources des librairies qui seront utilisées.
cd
mkdir -p Logiciels/Cam
cd !$
git clone https://github.com/raspberrypi/tools.git
git clone https://github.com/raspberrypi/userland.git
Les outils de lafamille raspi
sont installés via tools.git
en cas de besoin mais non utiles et non déployés dans ce tutoriel.
se déplacer dans le dossier userland reçu et taper la commande ./buildme
qui lance la création des logiciels nécesaires à la mise en oeuvre de la caméra, pour une architercure 644 bits
ajouter l'option --aarch64
.
cd userland
./buildme [--aarch64]
L'exécution devrait se passer sans encombre et tous les outils nécessaires sont stockés dans le dossier /opt/vc
. Pour que les programmes trouvent ces librairies il est nécessaire de rajouter un fichier dans le répertoire listant les librairies utilisées avec la commande sudo nano /etc/ld.so.conf.d/userland.conf
en ajoutant dans le fichier :
#Access to Userland libraries
/opt/vc/lib
Appliquer la transformation avec sudo ldconfig
Recopier ensuite le contenu des docciers de /opt/vc
hormis lib
et src
dans /usr/local
:
cd build
for i in bin include [sbin] [share]; do sudo cp -r /opt/vc/$i/* /usr/local/$i; done
Pour utiliser la caméra avec un utilisateur non root
et si cela n'a pas été fait dans la phase initiale ne pas oublier d'ajouter dans /etc/udev/rules.d
le fichier 60-cam.rules
avec la commande sudo nano /etc/udev/rules.d/60-cam.rules
avec le contenu suivant :
SUBSYSTEM=="vchiq", GROUP=="video", MODE="0660"
À chaque démarrage le groupe video
sera autorisé à acccéder à la resource /dev/vchiq
; cela peut être fait manuellement pour cela en cas de besoin exécuter les deux commandes suivantes :
sudo chown root.video /dev/vchiq
sudo chmod g+rw !$
6.1.4 Activation du réseau WIFI et du réseau filaire
Comme nous l'avons vu plus haut l'interface réseau filaire est configurée de façon générique pour se connecter à tout réseau disponible. Cette connexion est suffisante pour réaliser toutes les configurations proposées dans ce document mais inadéquate pour une utilisation en production. Cependant la mise en place d'une configuration avancée adaptée à une interface particulière et un réseau particulier "figera" la situation et la Raspberry aura des difficultés pour se connecter à un autre réseau.
Si l'image en cours de création est destinée à être partagée avec d'autres usagers qui la cloneront il est recommandé de ne pas configurer le réseau filaire ni le WIFI comme expliqué ci-dessous, ce devra être fait par l'utilisateur final avec ses paramètres personnels; Si l'image en cours de création est destinée à être directement utilisée la configuration ci-dessous doit être effectuée
6.1.4.1 Configurer le réseau filaire
Pour configurer le réseau filaire il faut supprimer la désignation générique de l'interface et la remplacer par la valeur construite au boot à partir de l'adresse Mac (cette valeur est unique et désigne une et une seule Raspberry Pi "physique" l'image sera donc inadaptée à toute autre Raspberry Pi !). On obtient le nom de l'interface réseau par la commande ip token
.
Si la valeur est eth0
c'est que la version antérieure de la configuration a été utilisée et dans ce cas le nom est de l'interface est unique et toujours le même aucune manipulation ne doit être effectuée.
Si la valeur diffère de eth0
elle doit être substituée à la valeur générique enx*
figurant dans le fichier 50-wired.network
.
Name=enx#########
Host=raspife3
On passe aussi en systemd
en arrêtant le daemon networking
et en veillant à ce que les deux daemons systemd-networkd
et systemd-resolved
soient lancés au boot. si ce n'est pas le cas effectuer la modificatio :
sudo systemctl stop networking
sudo systemctl disable networking
sudo systemctl list-unit-files | grep enabled | grep systemd-
Si besoin
sudo systemctl enable systemd-networkd
sudo systemctl enable systemd-resolved
6.1.4.2 Configurer le WIFI
La configuration du WIFI est plus délicate car il est nécessaire de fournir des mots de passe ou des paramètres propres à chaque réseau. Il est bien sûr possible de "remplir à la main" les fichiers de configuration mais toute erreur même minime (espace oublié, majuscule/minuscule, etc...) entraine l'arrêt du réseau. D'autre part ce travail impose la manipulation de données confidentielles en clair ce qui est à proscrire. Il est donc préférable d'utiliser les outils graphiques standards via la connexion au terminal serveur installé plus haut.
On se connecte avec un outil d'affichage VNC, par défaut le service VNC est activé avec le login tsuser
et le mot de passe configuré plus haut. Cliquer en bas à droite dans la barre de menus sur l'icône réseau, la panneau affiché apparaît configurer le réseau WIFI que l'on souhaite utiliser.
6.2 Mise à jour des librairies upm et mraa depuis github
Les forges libres proposent de nombreux logiciels qui peuvent facilement être ajoutés à la Raspberry Pi, même s'il faut les compiler. La manipulation n'est pas compliquée et requiert des connaissances peu avancées à titre d'exemple nous installerons sur notre image les logiciels mraa
et upm
proposés par intel vi eclipse sur github
. Le premier donne accès à la maîtrise du bus GPIO
le second propose plusieurs centaines de "drivers" pour des leds, capteurs et effecteurs du monde des "makers". C'est l'équivalent de ce que les utilisateurs des arduino appellent des librairies sauf que dans le cas de la Raspberry que nous construisons nous allons réellement construire des librairies au sens programmation du terme dont les composants pourront être appelés depuis les langages C
, C++
, python
, Java
, Node-JS
. Cela permettra d'écrire des programmes simples permettant d'interagir avec des capteurs météo des leds ou tous autres composants électroniques connectables. (voir nos cahiers de programmes pour jupyter.
La première étape consiste à créer un espace pour stocker les codes puis de les télécharger dans cet espace depuis les forges opensource ou libres. Nous allons créer une hierarchie de dossiers dans le dodssier Logiciels
ayant pour racine IoT
(Internet of Things) contenant un dossier mraa
et un dossier upm
.
cd
mkdir -p Logiciels/IoT
cd !$
git clone https://github.com/eclipse/mraa
git clone https://github.com/eclipse/upm
Avant de pouvoir créer ces deux librairies de programmes il est nécessaire de construire des éléments sur lesquels mraa
et upm
dépendent.
6.2.1 Récupération et installation de Node.js
Ce logicielévolue très rapidement et il est souhaitable de vérifier s'il n'existe pas une nouvelle version depuis l'écriture de ce blog, vérifier la version à jour sur le site Node.js nous utiliserons ici la version 10.10.0 avec npm5.5.1). créer le dossier pour accueillir le logiciel et le télécharger.
cd
mkdir -p Logiciels/Node
cd !$
wget https://nodejs.org/dist/v15.0.1/node-v15.0.1-linux-armv7l.tar.xz
# si Pi4 64 bits
wget https://nodejs.org/dist/v15.0.1/node-v15.0.1-linux-arm64.tar.xz
tar xvfJ node-v15.0.1-linux-armv7l.tar.xz
cd node-v15.0.1-linux-armv7l
for i in bin include lib share; do sudo cp -r $i/* /usr/local/$i; done
# si P4 32 bits
wget https://nodejs.org/dist/v15.0.1/node-v15.0.1.tar.gz
tar xvfJ node-v15.0.1.tar.gz
cd node-v15.0.1
./configure
make -j4
make tests-only
sudo make install
sudo ln -s /usr/local/bin/node /usr/local/bin/nodejs
sudo npm install -g --upgrade npm
sudo npm install -g node-gyp
sudo npm install -g configurable-http-proxy
6.2.1.1 Récupération et construction du paquet swig
L'outil swig est complexe et évolue systématiquement après les évolutions des langages qu'il permet de traduire. nodeJS
évolue rapidement et fréquemment et swig n'est pas toujours compatible avc la dernière version. Le tableau ci-dessous présente les combinaisons qui ont été testées opérationnellement. les tests ne sont pas exhaustifs et il peut subsister quelques incompatibilités. Merci de nous les signaler.
version de node | version de swig |
---|---|
10.16.3 | 4.0.1 |
10.19.0 | 4.0.2 |
15.0.1 | 4.1.0 |
cd
mkdir -p Logiciels/Swig
cd !$
git clone -b master --single-branch https://github.com/swig/swig.git
cd swig
./autogen.sh
./configure
SI les choses se passent normalement on obtient le message :
The SWIG test-suite and examples are configured for the following languages:
java javascript perl5 python
poursuivre avec :
make -j4
sudo make install
sudo apt install libjavascriptcoregtk-4.0-dev
sudo ln -s /usr/include/webkitgtk-4.0/JavaScriptCore /usr/include/JavaScriptCore
6.2.1.2 Récupération et construction du paquet libopenzwave
cd
mkdir -p Logiciels/OpenZwave
cd !$
git clone https://github.com/OpenZWave/open-zwave.git
cd open-zwave
make -j4
sudo make install
6.2.1.3 Récupération et construction du paquet modbus
cd
mkdir -p Logiciels/Modbus
cd !$
git clone https://github.com/stephane/libmodbus.git
cd libmodbus/
./autogen.sh
./configure
make -j4
sudo make install
En cas de problème utiliser avant ./configure
.
libtoolize
aclocal
autoheader
autoconf
automake --add-missing
6.2.1.4 Construction de mraa et upm
Certains modules requièrent beaucoup de RAM pour se compiler avec l'option -j4 du make la raspberryPi3 peut se figer, on passe alors avec l'option -j2 (qui utilise seulement 2 des coeurs du processeur). Il est possible d'ajouter un fichier de swap avec les commandes suivantes qui fournissent 512 Mo de swap, la compilation passe en -j4 mais la raspi3 swape choisissez l'option qui vous convient !
sudo su
dd if=/dev/zero of=/swapfile bs=1024 count=524288
chown root:root /swapfile
chmod 0600 /swapfile
mkswap /swapfile
swapon /swapfile
Pour vérifier l'activité :
swapon -s
free -m
Il est maintenant possible de construire la librarie mraa et upm qui permettent de gérer le bus GPIO
et un grand nombre de dispositifs électroniques
Pour une compilation avec buster au 2020-11-11 il est nécessaire d'appliquer le patch suivant :
--- include/version.h~ 2020-11-10 19:47:03.734243366 +0100
+++ include/version.h 2020-11-11 10:43:19.870180059 +0100
@@ -11,8 +11,8 @@
extern "C" {
#endif
-const char* gVERSION;
-const char* gVERSION_SHORT;
+extern const char* gVERSION;
+extern const char* gVERSION_SHORT;
#ifdef __cplusplus
}
cd
cd Logiciels/IoT/mraa
Modifier le fichier CMakelist
comme indiqué ci-dessous :
if (CMAKE_VERSION VERSION_LESS "3.1")
if (CMAKE_C_COMPILER_ID STREQUAL "GNU")
set (CMAKE_C_FLAGS "-std=gnu99 ${CMAKE_C_FLAGS}")
endif ()
else ()
set (CMAKE_C_STANDARD 99)
cmake_policy(SET CMP0078 OLD)
cmake_policy(SET CMP0086 NEW)
endif ()
Puorsuivre la compilation :
mkdir build
cd build
export JAVA_HOME=/usr/lib/jvm/java-11-openjdk-armhf/
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make -j4
sudo make install
En cas de besoin il est possible d'effacer ce qui a été installé par les compilations précédentes.
sudo rm -r /usr/include/mraa* /usr/lib/arm-linux-gnueabihf/pkgconfig/mraa.pc /usr/lib/arm-linux-gnueabihf/libmraa* /usr/lib/python2.7/dist-packages/*mraa* /usr/lib/python3.7/dist-packages/*mraa* /usr/lib/node_modules/mraa /usr/share/mraa/examples /usr/bin/mraa*
sudo rm -r /usr/include/upm /usr/lib/python2.7/dist-packages/upm /usr/lib/python3.7/dist-packages/upm /usr/lib/arm-linux-gnueabihf/pkgconfig/upm* /usr/lib/node_modules/jsupm* /usr/lib/arm-linux-gnueabihf/libupm* /usr/share/upm
cd
cd Logiciels/IoT/upm
mkdir build
cd build
cmake -Wno-dev -DWERROR=off -DCMAKE_INSTALL_PREFIX=/usr ..
make -j4
sudo make install
Dans certaines situations(maintenant peut-être révolues) il a été nécessaire de recopier les modules python depuis build/src/*/python?.?/*.py
vers /usr/lib/dist-packages/upm
# from build folder
for i in python2.7 python3.7 ; do sudo cp src/*/$i/*.py /usr/lib/$i/dist-packages/upm/; done
for i in python2.7 python3.7 ; do sudo cp interfaces/$i/*.py /usr/lib/$i/dist-packages/upm/; done
Les programmes sont directement accessibles depuis les librairies python2, python3, Java, Javascript, C, C++.
6.2.2 Installation de compléments Python
Un certain nombre de logiciels python sont installés par défaut pour satisfaire certains usages. Il est recommandé d'installer si besoin (tester avec dpkg
)les librairies de développement suivantes qui fournissent les fichiers d'en-tête utilisés pour construire les outils python listés ci-dessous, sans ces librairies les installations avec pip
ou pipenv n'aboutissent pas.
dpkg -l ibopenblas-dev libhdf5-dev libnetcdf-dev python3-pandas
sudo apt install libopenblas-dev libhdf5-dev libnetcdf-dev
sudo pip3 install --upgrade setuptools
sudo pip3 install --upgrade spidev
sudo pip3 install --upgrade wheel
sudo pip3 install --upgrade six numpy
sudo pip3 install --upgrade folium
sudo pip3 install --upgrade pillow
sudo pip3 install --upgrade netCDF4
Installation d'un simulateur graphque de réseau :
dpkg -l docker.io openvswitch-switch wireshark imagemagick tk tcllib util-linux
sudo apt install --reinstall docker.io openvswitch-switch wireshark imagemagick tk tcllib util-linux
cd ~/Logiciels
mkdir Imunes
cd Imunes
git clone https://github.com/imunes/imunes.git
cd imunes
sudo make install
Complément pour ADCCAD SPI
sudo python3 -m pip install git+https://github.com/abelectronicsuk/ABElectronics_Python_Libraries.git
Pour avoir les démos du SPI avec la carte ADCDAC Pi zero
cloner le dépôt, les programmes sont disponibles dans les cahiers d'exercices de la version météo de cette image.
cd ~/Logiciels
mkdir ADCDAC-PiZero
git clone https://github.com/abelectronicsuk/ABElectronics_Python_Libraries.git
6.3 Installation de Jupyter et Jupyterhub
Jupyter est un interface graphique de développement et de programmation multilangages qui permet de se familiariser simplement avec la programmation. Il permet d'approcher simplement un langage de programmation sa syntaxe, son vocabulaire et sa logique. Il permet de produire et d'exploiter des cahiers de programmes ipython intégrant code source et commentaire qui s'avèrent être d'excellents outils pédagogiques pour l'apprentissage du code voir les cahiers de programmes du projet Tremplin et par exemple la ministation météo. Jupyterhub est un coutil companion de Jupyterhub qui permet de servir jupyter sur le web à plusieurs usagers en même temps, lors d'un TP ou TD par exemple.
Jupyter et Jupyterhub sont des logiciels python et peuvent donc être installés avec pip, l'option --no-cache-dir
pour installer matplotlib est nécessaire à cause de la faible mémoire de la raspi, jupyterhub requiert python3 :
sudo pip install --upgrade setuptools
sudo pip install --upgrade wheel
sudo pip install Rpi.GPIO
sudo pip install jupyter
sudo pip --no-cache-dir install matplotlib
sudo pip3 install --upgrade setuptools
sudo pip3 install --upgrade wheel
sudo pip3 install Rpi.GPIO
sudo pip3 install jupyter
sudo pip3 install jupyterhub
sudo pip3 install flexx
sudo pip3 install plotly
sudo pip3 --no-cache-dir install matplotlib
sudo pip3 install git+https://github.com/jupyter/sudospawner
sudo pip3 install jupyter_contrib_nbextensions
sudo jupyter contrib nbextension install --system
Pour la compilation en gcc10
(par défaut en bullseye) au 2020-11-11 il est nécessaire de modifier une option de compilation en utilisant la commande sudo CFLAGS="-fcommon" pip3 install Rpi.GPIO
.
6.3.1 Configuration de la sécurité et du lancement par le user callisto
La sécurité est une contrainte importante de tout échange sur un réseau numérique notamment en milieu éducatif. 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 ! (Certaines séries américaines ont d'ailleurs utilisé des Raspberries Pi comme instruments d'attaque numérique, cela est en général romancé mais repose effectivement sur une part de réalité). Il est recommandé de mettre en place quelques éléments basiques de protection qui pourront aussi 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 l'utilisateur choisi pour lancer jupyterhub, pour conserver la configuration proposée c'est donc l'utilisateur callisto qui doit assumer le certificat de sécurité.
sudo su callisto
cd
mkdir -p Utils/Certificates
cd !$
openssl req -new -newkey rsa:2048 -rand /dev/urandom -nodes -keyout meteojuphub.key -out meteojuphub.csr
Répondre aux questions posées en fonction de vos paramètres.
openssl req -new -x509 -days 3652 -key meteojuphub.key -out meteojuphub.pem
On dispose maintenant des fichiers de sécurisaton nécessaires meteojuphub.csr
meteojuphub.key
meteojuphub.pem
qui vont être utilisés pour protéger l'accès à jupyterhub. Par défaut un fichier de sécurisation a été installé pour permettre un fonctionnement immédiat mais chaque nouvel administrateur doit impérativement créer son propre fichier de sécurité. les manipulations qui sivent qui suivent sont génériques et si les mêmes noms de fichier sont utilisés il ne sera pas nécessaire de répliquer les opérations ci-dessous.
cd
mkdir Jupyterhub
cd !$
jupyterhub --generate-config
Éditer le fichier jupyterhub_config.py
nano jupyterhub_config.py
puis décommenter et renseigner les 3 lignes comme indiqué 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
#
# When setting this, you should also set ssl_key
#c.JupyterHub.ssl_cert = ''
c.JupyterHub.ssl_cert = '/home/callisto/Utils/Certificates/meteojuphub.pem'
## Path to SSL key file for the public facing interface of the proxy
#
# When setting this, you should also set ssl_cert
#c.JupyterHub.ssl_key = ''
c.JupyterHub.ssl_key = '/home/callisto/Utils/Certificates/meteojuphub.key'
.../...
## Set of users that will have admin rights on this JupyterHub.
#
# Admin users have extra privileges:
# - Use the admin panel to see list of users logged in
# - Add / remove users in some authenticators
# - Restart / halt the hub
# - Start / stop users' single-user servers
# - Can access each individual users' single-user server (if configured)
#
# Admin access should be treated the same way root access is.
#
# Defaults to an empty set, in which case no user has admin access.
#c.Authenticator.admin_users = set()
c.Authenticator.admin_users = set(['localadm','callisto','ens-ife'])
Pour que Jupyterhub
puisse être lancé par callisto
et fonctionne correctement callisto
(que nous avons choisi comme user pour lancer Jupyterhub
doit disposer de quelques privilèges qui doivent être ajoutés par l'administrateur (et pas par callisto qui n'a pas de privilèges suffisants) au fichier sudoers avec la commande sudo visudo
en ajoutant les lignes suivantes :
# 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 callisto
doit aussi appartenir au groupe shadow.
sudo adduser callisto shadow
Tous les utilisateurs qui vont utiliser jupyter à distance doivent appartenir au groupe jupyterhub
.
for i in moon localadm ens-ife callisto ;do sudo adduser $i jupyterhub; done
6.3.2 Ajout d'un moteur nodeJS dans l'environnement jupyter/jupyterhub
Jupyter
et Jupyterhub
sont programmés en python mais les notebooks
(cahiers d'exercices) qu'ils utilisent 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 administrateur mettre à jour les dépendances nécessaires à l'installation et exécuter les commandes d'installation.
sudo su
npm install -g --upgrade node-gyp
npm install -g --upgrade minimatch
npm install -g --upgrade coffeescript
mkdir -p /usr/local/share/jupyter/jupyter-nodejs/node_modules/zmq/.node-gyp
npm install -g && node install.js /usr/local/share/jupyter/kernels/nodejs
npm run build
npm run build-ext
Si zmq refuse de s'installer
cd /usr/local/share/jupyter/jupyter-nodejs/node_modules/zmq
node-gyp configure
node-gyp build
Installer jupyterlab
.
sudo pip3 install jupyterlab
sudo pip3 install jupyterlab --pre # jypyterlab 3.0 RC
sudo jupyter labextension install @jupyterlab/hub-extension
sudo jupyter labextension install jupyterlab-chart-editor
Pour installer la version 3.0
utiliser la commande :
sudo pip3 install jupyterlab --pre
Dans la version 3 les raspberries n'ont pas assez de mémoire pour permettre d'installer proprement les extensions par défaut avec jupyter lab build
en attendant une nouvelle version on utilise directement webpack
en ligne de commande
sudo npm install -g webpack webpack-cli webpack-bundle-analyzer
cd /usr/local/share/jupyter/lab/staging
sudo su
NODE_OPTIONS="--max-old-space-size=850" webpack --config webpack.prod.minimize.config.js # pour la pi3 1Go
NODE_OPTIONS="--max-old-space-size=3500" webpack --config webpack.prod.minimize.config.js # pour la pi4 4Go
6.3.3 Installation d'un service jupyterhub
ou jupyterlabhub
6.3.3.1 jupyterhub seul
Pour mettre en place un service placer le fichier jupyterhub.service
dans /etc/systemd/system
:
sudo jed /etc/systemd/system/jupyterhub.service
[Unit]
Description=Jupyterhub
After=network-online.target
[Service]
User=callisto
WorkingDirectory=/home/callisto/Jupyterhub
ExecStart=/usr/local/bin/jupyterhub --config=/home/callisto/Jupyterhub/jupyterhub_config.py
[Install]
WantedBy=multi-user.target
Faire prendre en compte le nouveau service avec sudo systemctl daemon-reload
puis contrôler le service avec les commandes habituelles, pour avoir jupyterhub au démarrage sudo systemctl enable jupyterhub
sudo systemctl status jupyterhub
sudo systemctl start jupyterhub
sudo systemctl stop jupyterhub
6.3.3.2 jupyterlabhub
- pour utiliser exclusivement
jupyterlab
et nonjupyter
modifier le fichier de configuration de callistojupyterhub_config.py
en modifiant la valeur du paramètre suivant :
c.Spawner.cmd = ['jupyter-labhub']
- Pour avoir jupyterlab et jupyter-labhub ajouter le fichier
sudospawner-singleuser
contenant le script suivant dans/usr/local/bin
et le rendre exécutable.
sudo jed /usr/local/bin/sudospawner-singleuser
#!/bin/bash -l
# Delegate the notebook server launch to the jupyter-labhub script.
exec "jupyter-labhub" $@
Ne pas oublier de rendre ce fichier exécutable.
sudo chmod a+x /usr/local/bin/sudospawner-singleuser
Le serveur jupyterhub peut-être lancé par callisto
depuis le répertoire /home/callisto/Jupyterhub
par la commande jupyterhub
. Bien veiller à ce que tous les usagers de jupyterhub appartiennent au groupe jupyterhub.
6.3.4 Installation d'une alternative entre jupyterlab et jupyter
La procédure suivante permet de mettre en place deux services l'un pour jupyterlab
l'autre pour jupyter
. Les deux services seront nommés jupyterhub
et jupyterlabhub
.
sudo su
cd /etc/systemd/system
cat > jupyterhub.service
Ajouter
[Unit]
Description=Jupyterhub
After=network-online.target
[Service]
User=callisto
ExecStartPre=+/bin/sh /home/callisto/Jupyterhub/preparehub.sh
ExecStart=/usr/local/bin/jupyterhub --config=/home/callisto/Jupyterhub/jupyterhub_config.py
WorkingDirectory=/home/callisto/Jupyterhub
[Install]
WantedBy=multi-user.target
cat > jupyterlabhub.service
Ajouter
[Unit]
Description=Jupyterlabhub
After=network-online.target
[Service]
User=callisto
ExecStartPre=+/bin/sh /home/callisto/Jupyterhub/preparelab.sh
ExecStart=/usr/local/bin/jupyterhub --config=/home/callisto/Jupyterhub/jupyterhub_config.py
WorkingDirectory=/home/callisto/Jupyterhub
[Install]
WantedBy=multi-user.target
exit
sudo su callisto
cd ~/Jupyterhub
cat > preparehub.sh
Ajouter
#! /bin/sh
if [ -f /usr/local/bin/sudospawner-singleuser ]; then rm /usr/local/bin/sudospawner-singleuser;fi
cat > preparelab.sh
Ajouter
#! /bin/sh
if [ -f /usr/local/bin/sudospawner-singleuser ]; then echo "lab ready"; else cp /usr/local/bin/sudospawner-singleuserlab /usr/local/bin/sudospawner-singleuser ;fi
Recopier le fichier sudospawner-singleuser
dans sudospawner-singleuserlab
sudo cp /usr/local/bin/sudospawner-singleuser /usr/local/bin/sudospawner-singleuserlab
Il y a maintenant deux services de lancement l'un pour jupuyterhub l'autre pour jupyterlabhub fonctionnant de la même façon, Il est souhaitable d'éteindre un service avant de lancer l'autre.
# Jupyterhub
sudo systemctl status jupyterhub
sudo systemctl start jupyterhub
sudo systemctl stop jupyterhub
#Jupyterlabhub
sudo systemctl status jupyterlabhub
sudo systemctl start jupyterlabhub
sudo systemctl stop jupyterlabhub
L'un ou l'autre peut être activé au démarrage avec la commande sudo systemctl enable jupyterhub/jupyterlabhub
un des deux au choix.
6.4 nstallation de Snap!BYOB
Jupyter est un outil très performant pour un apprentissage progressif du codage mais il ne s'adresse pas à des novices absolus. Le logiciel Snap!BYOB est un outil de programmation graphique par blocs plus puissant que Scratch qui permet une introduction à la programmation. Comme Jupyter il propose ue interface web que la Raspberry fournit sans problème. Pour installer Snap télécharger le code depuis un serveur snap en ligne en cliquant en haut à gauche sur le logo Snap qui fait apparaitre un menu déroulant. reopier le logiciel snap.zip
dan un répertoire de la Raspberry pi puis le décompresser dans un dossier de votre choix et le lier à la racine du web /var/www/html
.
cd
mkdir Logiciels/Snap
cd !$
git clone https://github.com/jmoenig/Snap.git
sudo cp -r Snap /opt
sudo ln -s /opt/Snap /var/www/html/snap
Snap!BYOB est maintenant directement accessible sur le serveur web de la Raspberry Pi http://$$$.$$$.$$$.$$$/snap
6.5 Installation de Domoticz pour piloter des objets connectés du commerce
Domoticz est une logiciel de pilotage d'objets connectés du commerce on l'utilisera ici avec le concentrateur RFXCOM RFXtrx433XL
pour installer le logiciel domoticz
il faut un certain nombre de paquets de développement afin de parvenir à le compiler. La première commande permet de lister les paquets absents, la seconde permet de les ajouter (ne traiter que les paquets manquants).
sudo dpkg -l python3-openssl libssl-dev libboost-atomic1.67-dev libboost-chrono1.71-dev libboost-system-dev libboost-thread-dev libboost1.67-dev libcurl4-gnutls-dev curl libusb-dev libconfuse-dev doxygen libftdi-dev
sudo apt install python3-openssl libssl1.0-dev libboost-atomic1.67-dev libboost-chrono1.67-dev libboost-system-dev libboost-thread-dev libboost1.67-dev libcurl4-gnutls-dev curl libusb-dev libconfuse-dev doxygen libftdi-dev
En bullseye
sudo dpkg -l python3-openssl libssl-dev libboost-atomic1.71-dev libboost-chrono1.67-dev libboost-system-dev libboost-thread-dev libboost.dev libcurl4-gnutls-dev curl libusb-dev libconfuse-dev doxygen libftdi-dev
sudo apt install python3-openssl libssl1.0-dev libboost-atomic1.71-dev libboost-chrono1.71-dev libboost-system-dev libboost-thread-dev libboost1.dev libcurl4-gnutls-dev curl libusb-dev libconfuse-dev doxygen libftdi-dev
La version 1.67
peut avoir progressé après le rédaction de cet article, faire les modifications en conséquence.
Créer un répertoire pour recevoir le logiciel domoticz
et tous les logiciels supplémentaires traitant les différents objets de la domotique.
cd ~/Logiciels
mkdir Domoticz
cd Domoticz/
Pour disposer des pilotes telldus
dans domoticz
ajouter le zip le décompresser et le compiler (Il y a des erreurs de compilation et le code source doit être modifié comme précisé c-dessous.
mkdir Telldus
cd Telldus/
wget http://download.telldus.com/TellStick/Software/telldus-core/telldus-core-2.1.2.tar.gz
tar xvfz telldus-core-2.1.2.tar.gz
cd telldus-core-2.1.2
Compilation puis installation.
cmake .
mv CMakeDoxyfile.in Doxyfile.in
cmake .
make
sudo make install
Dans les fichiers de tdtool
, tdadmin
, link.txt
il manque parfois (suivant les versions) le lien avec la librairie pthread
ajouter en fin de ligne -lpthread
dans les deux fichiers concernés.
jed tdtool/CMakeFiles/tdtool.dir/link.txt
jed tdadmin/CMakeFiles/tdadmin.dir/link.txt
Pour disposer d'openzwave
penser à ajouter le chemin dans CMakeLists.txt
de domoticz
.
En x64 il peut s'avérer qu'il n'y ait pas assez de RAM pour compiler domoticz ce qui fige la raspi.
Telldus est issu de logiciels propriétaires, la version partagée semble figée et il subsiste quelques disharmonies avec domoticz empêchant la compilation. les problèmes concernent la non déclaration ou la double déclaration de variables; plusieurs solutions existent celle qui a été expérimentée est de conserver l'inclusion du fichier créé par la compilation séparée de Telldus #include <telldus-core.h>
qui est installé dans /usr/local/include
et de supprimer dans les fichiers de domoticz les doublons. Il est aussi nécessaire d'ajouter #include <telldus-core.h>
dans certains fichiers .cpp
lorsque la déclaration d'une variable est manquante.
cd ../..
git clone https://github.com/domoticz/domoticz.git domoticz
cd domoticz
nano CMakeLists.txt
Ajouter openzwave
compilé ici.
find_library(OpenZWave NAMES libopenzwave.a HINTS "/home/ens-ife/Logiciels/OpenZwave/open-zwave"
cmake -DCMAKE_BUILD_TYPE=Release CMakeLists.txt
make
sudo make install
Ne pas compiler avec plus d'un processeur car la mémoire de la RaspBerry est insuffisante pour compiler en parallèle sur plusieurs processeurs à mons d'utiliser un gros swap et contrôler que les threads
ne soient pas figés.
Pour utiliser Domoticz
on crée l'utilisateur domotic
et le groupe domotic
. Tous les usagers qui pourront lancer le logiciel devront appartenir au groupe domotic et au groupe dialout.
sudo adduser domotic --no-create-home
for i in domotic dialout;
do for j in ens-ife localadm www-data domotic;
do sudo adduser $j $i;
done;
done
Pour que tous les usagers du groupe domotic puissent accéder au RFXCOM
on doit ajouter un fichier dans /etc/uvev/rules.d
:
sudo nano /etc/udev/rules.d/45-usbdomoticz.rules
#ajouter la ligne suivante
SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6015", ACTION=="add", GROUP="domotic", MODE="0664"
#sauvegarder
Pour créer le service domotique et qu'il puisse démarrer seul ajouter le fichier /etc/systemd/system/domoticz.service
:
sudo nano /etc/systemd/system/domoticz.service
#ajouter le contenu suivant
[Unit]
Description=domoticz_service
[Service]
User=domotic
Group=domotic
WorkingDirectory=/opt/Domoticz
ExecStart=/opt/Domoticz/domoticz -www 8080 -sslwww 0 -wwwbind 192.168.10.212
#ExecStartPre=setcap 'cap_net_bind_service=+ep' /opt/Domoticz/domoticz
Restart=on-failure
RestartSec=1m
#StandardOutput=null
[Install]
WantedBy=multi-user.target
Déplacer le contenu durépertoire dans /opt/Domoticz
et modifier les droits d'accès :
cd
cd Logiciels/Domoticz/domoticz
sudo mkdir /opt/Domoticz
sudo cp -r ./* /opt/Domoticz/
sudo chown -R domotic.domotic /opt/Domoticz/
sudo chmod -R g+rwX /opt/Domoticz/
Le service se gère alors comme tous les autres services de la raspberryPi :
sudo systemctl start domoticz
sudo systemctl status domoticz
sudo systemctl stop domoticz
sudo systemctl enable domoticz
sudo systemctl disable domoticz
6.6 Ajout de scripts pour démarrer ou supprimer un service au démarrage
Les services Jupyterhub
, vncserver
, weewx
peuvent tous être mis en route au démarrage mais ils consomment inutilement des ressources si ils ne sont pas utilisés. Les scripts suivants permettent de gérer la mise en route de ces services au démarrage. Par défaut seul le serveur vnc est mis en route. Le contenu de ces scripts est détaillé c dessous.
cd
mkdir Scripts
cd Scripts
6.6.1 Pour jupyterhub
Ajouter le fichier avec nano jupyterhubOnOff
ou une commande équivalente
#!/bin/bash
#script pour activer/désactiver jupyterhub au boot
#
prog=`basename $0`
if [[ $2 == "" ]] ; then
echo "Type " $prog " [on / off] [lab / nbk]"
echo "Start or stop jupyterlabhub or jupyterhub at boot"
exit
else
case $1 in
on )
case $2 in
lab )
sudo systemctl enable jupyterlabhub
;;
nbk )
sudo systemctl enable jupyterhub
;;
esac
;;
off )
case $2 in
lab )
sudo systemctl disable jupyterlabhub
;;
nbk )
sudo systemctl disable jupyterhub
;;
esac
;;
* )
echo "Choice is on or off and lab or nbk"
exit
;;
esac
fi
6.6.2 Pour vncserver
Ajouter le fichier avec nano vncserverOnOff
ou une commande équivalente
#!/bin/bash
# Script pour activer/désactiver vncserver au boot
#
prog=`basename $0`
if [[ $2 == "" ]] ; then
echo "Type " $prog "on / off port to start or stop vncserver at boot on port 5900 + port"
exit
else
case $1 in
on )
sudo systemctl enable vncserver@1
;;
off )
sudo systemctl disable vncserver@1
;;
* )
echo "Choice is on or off"
exit
;;
esac
fi
6.6.3 Pour weewx
Ajouter le fichier avec nano weewxOnOff
ou une commande équivalente
#!/bin/bash
# script pour activer/désactiver weewx au boot
#
prog=`basename $0`
if [[ $1 == "" ]] ; then
echo "Type " $prog "on or off to start or stop weewx at boot"
exit
else
case $1 in
on )
sudo systemctl enable weewx
;;
off )
sudo systemctl disable weewx
;;
* )
echo "Choice is on or off"
exit
;;
esac
fi
Rendre les fichiers exécutables puis les copier les scripts dans le répertoire /usr/local/bin
chmod a+x ./*
sudo cp ~/Scripts/* /usr/local/bin
6.7 Ajout des cahiers de programmes pour apprendre/enseigner la programmation
Ajouter les cahiers de programmes du projet Tremplin des Sciences depuis la forge github
sudo su moon
cd
git clone http://vidal@depot.tremplin.ens-lyon.fr/Tremplin-des-Sciences/CahiersDeProgrammesCodage
exit
sudo su localadm
cd
git clone http://vidal@depot.tremplin.ens-lyon.fr/Tremplin-des-Sciences/CahiersDeProgrammesCodage
exit
cd
git clone http://vidal@depot.tremplin.ens-lyon.fr/Tremplin-des-Sciences/CahiersDeProgrammesCodage
6.8 Image buster sans interface graphique (type serveur) pour le pilotage de la station météorologique et le partage de données
6.8.1 Configuration du logiciel de pilotage de stations météorologiques
7. Propagation des images par clonage
Une fois que tous les programmes souhaités sont ajoutés et toutes les options configurées les images peuvent être diffusées sous forme binaire compressée, il suffit alors à tout usager qui souhaite se les approprier de téchager le fichier et le copier sur une micro-SD qui sera immédiatement opérationnelle. Éteindre la Raspberry pi et extraire la micro-SD puis l'insérer dans un ordinateur (dans le cas ci-dessous elle apparaît sur le device /dev/mmcblk0
. Copier "bit à bit" le contenu de la micro-SD sur le disque dur de l'ordinateur avec les options de maîtrise des espaces vides et le contrôle de la taille; l'image proposée dans ce blog pouvant contenir dans une micro-SD de 8Go. Le nom de l'image utilise les règles de nommage utilisées au chap 1.C. Pour faciliter la copie de l'image on propose de créer le fichier bmap correspondant et de la compresser (le logiciel bmaptools traite directement les images compressées ce qui minimise les temps de téléchargement et évite le temps de décompression)
sudo dd if=/dev/mmcblk0 of=2018-01-07-rpi3-stretch.img bs=4M conv=sparse count=2500
bmaptool create -o 2018-01-07-rpi3-stretch.bmap 2018-01-07-rpi3-stretch.img
7z a -txz 2018-01-07-rpi3-stretch.img.xz 2018-01-07-rpi3-stretch.img
Les usagers devront télécharger les deux fichiers 2018-01-07-rpi3-stretch.img.xz
et 2018-01-07-rpi3-stretch.bmap
et utiliser ensuite bmaptool pour la recopier sur une micro-SD vierge :
sudo bmaptool copy --bmap 2018-01-07-rpi3-stretch.bmap 2018-01-07-rpi3-stretch.img.xz /dev/mmcblk0
Une fois la copie terminée la micro-SD est immédiatement opérationnelle.
Commentaires