Comment créer une image Debian pour Raspberry Pi0 -> Pi4, buster ou bullseye adaptée à vos besoins (exemple : Codage, Météo-Climat, ...)

pour une Raspberry Pi (0 1 2 3 ou 4). les images sont construites pour êtres directement utilisables dans un univers Météo/Climat pour piloter une station Météorologique et gérer les données, apprendre ou enseigner le codage avec les outils SNAP!BYOB (comme scratch) et jupyter pour aborder python et javascript. Les versions debian stretchsont maintenant obsolètes, il subsiste quelques références pour des raisons de compatibilité et les anciennes versions des articles se trouvent dans le répertoire Archives.

Motivations

Le but de cet article est de décrire la procédure technique permettant de construire un système d'exploitation Debian "orthodoxe" (totalement analogue à celui qui est installé sur un ordinateur ordinaire) et qui fonctionne sur une Raspberry Pi. La motivation principale est de disposer d'une distribution standard augmentée de tous les logiciels nécessaires pour piloter le GPIO, gérer une station météorologique, apprendre à coder en python ou C++ à l'aide d'une interface web jupyterou jupyterlab. La seconde motivation est de proposer une explication de TOUT ce qui est fait pour construire le système d'exploitation en évitant les commandes parfois perçues comme "magiques".

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 Pi1 buster pour apprendre à coder (en cours)
  • 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 Pi3 buster pour apprendre à coder
  • Une image raspberry Pi4 buster pour apprendre à coder
  • Deux images raspberry Pi3 Pi4 bullseye tous terrains permettant de suivre tous les aspects innovants du projet et de préparer les migrations à venir

Remerciements

Carole Larose, Myriam Bentoumi, Éric le Jan et Charles-Henri Eyraud.


Sommaire

  1. Stratégie adoptée

    1.1. Trois phases de construction

    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)

    1.3. Mode de classement et moyen de retrouver une information

  2. Construction de l'image avec le script "rpi23genimage" et premiers services

    2.1. Raspberry Pi0 Buster

    2.2. Raspberry Pi1 Buster

    2.3. Raspberry Pi2 Buster

    2.4. Raspberry Pi3 Buster

    2.5. Raspberry Pi3B+ Buster

    2.6. Raspberry Pi3 Buster sans serveur graphique

    2.7. Raspberry Pi3 BullsEye

    2.8. Raspberry Pi4 Buster

    2.9. Raspberry Pi4 BullsEye

  3. Ajustements manuels génériques

    3.1. Copie de l'image sur une micro-SD

    3.2. ajustement de la taille de l'image

    3.3. Particularités de la Pi0

    3.4. Configuration du réseau

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

    4.5. Activation du serveur de terminaux à distance

    4.6 Modification des accès au GPIO et à la caméra

  5. Utilisation de la Raspberrry en point d'accès web (Hotspot)

  6. Configurations particulières avancées

    6.1. Image stretch ou buster ou bullseye "tous terrains Pi3 ou Pi3B+ ou 4" permettant entre autres l'apprentissage de la programmation

    6.2  Installation et mise à jour de l'nvironnement logiciel

    6.3  Installation d'un simulateur graphique de réseau après avoir installé un docker

    6.4  Installation de Jupyterlab et Jupyterhub

    6.5  Installation de Snap!BYOB 6.6  Installation de Domoticz pour piloter des objets connectés du commerce

    6.7  Ajout de scripts pour démarrer ou supprimer un service au démarrage

    6.8  Ajout des cahiers de programmes pour apprendre/enseigner la programmation

    6.9 Ajout d'un media-center

    6.10 Image sans interface graphique (type serveur) pour le pilotage de la station météorologique et le partage de données

  7. Propagation des images


Téléchargements

  1. rpi23-gen-image
  2. g_vidal rpi23-gen-image
  3. logiciel weewx
  4. Images téléchargeables raspberryPi du projet Tremplin
    1. modèle de création d'image raspberry Pi 2 raspife2-buster_19-09-08

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

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 drtyhlprsur 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 pas 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 ou bullseye (des versions stretch 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é localadmest 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 Pi0 Buster

Cette image a été générée en utilisant le fichier template raspife0W-buster_21-01-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=raspife0W-buster_21-01-08   ./rpi23-gen-image.sh

Les particularités liées au processeur armel6 sont précisées dans le texte lorsque nécessaire.

2.2 Raspberry Pi1 Buster

Cette image a été générée en utilisant le fichier template raspife2-buster_20-11-29 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   ./rpi23-gen-image.sh

2.3 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.4 Raspberry Pi3 Buster

Cette image a été générée en utilisant le fichier template raspife3-buster_20-11-21 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_20-11-01 ./rpi23-gen-image.sh

Le fichier raspife3-buster_20-11-21 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_20-11-01.bmap * raspife3-buster_20-11-01.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.5 Raspberry Pi3B+ Buster

Cette image a été générée en utilisant le fichier template raspife3P-buster_20-11-01 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=rraspife3P-buster_20-11-01 ./rpi23-gen-image.sh

Les instructions sont lancées depuis la racine du dépôt listé ci-dessus.

Le fichier raspife3P-buster_20-11-01 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_20-11-01.bmap * raspife3P-buster_20-11-01.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.6 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.bmap * raspife3W-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 bmaptools si nécessaire).

2.7 Raspberry Pi3 BullsEye

Cette image a été générée en utilisant le fichier template raspife3-bullseye_20-11-19 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_20-11-19 ./rpi23-gen-image.sh

Le fichier raspife3-bullseye_20-11-19 dérive de raspife3-bullseye_20-11-19 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.8 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.9 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 puis
    • 2 puis
    • n puis
    • p puis
    • 2 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 SD
    • N pour "remove signature",
    • pour finir taper w.

puis :

sudo resize2fs /dev/mmcblk0p2

3.3 Particularités de la Pi0

La Pi0 n'a pas d'interface filaire et il est donc impératif que l'interface WIFI fonctionne par défaut au démarrage si on ne souhaite/peut pas se connecter à un dispositif écran/souris/clavier, il y a donc 2 possibilités : * si on peut connecter la PiZero à un tel dispositif; vérifier que connman et cmst sont installés et utiliser l'interface graphique pour configurer le réseau ou les réseaux wifi qui seront utilisés * si on ne souhaite pas passer par une interface graphique la configuration est plus délicate car on doit disposer d'informations détaillées sur les propriétés du wifi. Le logiciel connman utilise pour chaque réseau wifi un dossier dans le répertoire /var/lib/connman. Le dossier a pour nom une combinaison du SSID complet du réseau, de l'adresse MAC de l'interface de la raspi et de termes la rendant intelligible elle est de la forme wifi_XX-MAC PiZero-XX_XX-ffull-SSID--réseau-XX_managed_psk. Ce dossier contient deux fichiers data et settings, data est un fichier de contrôle qui peut être reconstruit automatiquement par contre il est impératif de fournir un fichier settings correct,pour le wifi 2.4 GHz. Le SSID contient un nombre hexadécimal à 30 chiffres pour du 5GHz il en contient 8 de plus, le contenu minimal du fichier est précisé sur l'exemple ci-dessous :

[wifi_XXXXXXXXXXXX_yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy_managed_psk]
Name=WIFI_NETWORK_NAME
SSID=yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Frequency=2447
Favorite=true
AutoConnect=true
Modified=2022-01-18T09:27:21.243021Z
Passphrase=passphrase
IPv4.method=dhcp
IPv4.DHCP.LastAddress=###.###.###.###
IPv6.method=auto
IPv6.privacy=disabled

Pour que l'interface soit démarrée au boot il est aussi nécessaire de modifier la configuration du fichier /etc/connman/main.conf comme ci dessous :

cd 
sudo mv main.conf main.conf-orig
sudo su
cat > main.conf
[General]                                                                                                

BackgroundScanning = true                                                                                
DefaultAutoConnectTechnologies = wifi                                                                    
PreferredTechnologies = wifi                                                                             
AlwaysConnectedTechnologies = wifi    

# ctrl-d
  • Pour faire plus simple, plus robuste et éviter la configuration de connman il est possible de se ramener à la situation ssystemd-networkd + wpa_supplicant décrite plus loin et proposée par défaut.

La PiZero utilise le chipset réseau brcmfmac43430 dont le driver est propriétaire il faut impérativement veiller à ce que les fichiers le concernat dans /lib/firmware/brcm ainsi que les le module brcmfmac.ko existent et soient das une version compatible avec le noyau. Il manque parfois simple un lien entre raspberrypi,3-model-b ou cypress/brcm43430... et raspberrypi,model-zero-w car ces deux raspberries utilisent le même chipset mais le lien est parfois oublié lors de la construction par les scripts existants ou alors c'est le nom générique qui est utilisé et pas celui de la PiZero. La liste ci-dessous présente une version maximaliste et opérationnelle du dossiers de dirivers brcm

ls -al /lib/firmware/brcm/*43430* # limité aux fichiers concernant la PiZero (et la Pi3)
/lib/firmware/brcm/brcmfmac43430-sdio.bin -> ../cypress/cyfmac43430-sdio.bin
/lib/firmware/brcm/brcmfmac43430-sdio.clm_blob -> ../cypress/cyfmac43430-sdio.clm_blob
/lib/firmware/brcm/brcmfmac43430-sdio.raspberrypi,3-model-b.txt
/lib/firmware/brcm/brcmfmac43430-sdio.raspberrypi,model-zero-w.bin -> ../cypress/cyfmac43430-sdio.bin
/lib/firmware/brcm/brcmfmac43430-sdio.raspberrypi,model-zero-w.txt -> brcmfmac43430-sdio.raspberrypi,3-model-b.txt
/lib/firmware/brcm/brcmfmac43430-sdio.txt

# Modules du noyau

/lib/modules/5.15.13/kernel/drivers/net/wireless/broadcom/brcm80211/brcmfmac/brcmfmac.ko
/lib/modules/5.15.13/kernel/drivers/net/wireless/broadcom/brcm80211/brcmutil/brcmutil.ko

Un autre point délicat concerne la signature de la base de données regulatory qui doit impérativement être signée comme précisé dans son README :

If you use a custom kernel built from upstream source, it will only
trust this database if it is signed by the upstream maintainer of
wireless-regdb.  To use the upstream database and signature instead of
the Debian version, run:

    update-alternatives --set regulatory.db \
        /lib/firmware/regulatory.db-upstream

Sans cette modification le firmware ne se charge pas et pas de réseau ! Cette modification est obligatoire pour toute image compilée de raspberry PiZero.

Même s'il est possible d'utiliser la Pi0 en terminal ordinaire ses performances sont faibles. Tout ce qui suit fonctionne donc sur écran avec les PiZero mais avec un peu de zénitude...

La suite des opérations se déroule à partir de la RaspberryPi "bootée" avec la nouvelle image.

3.4 Configuration du réseau

La construction de base de l'image fournit en théorie une raspberryPi opérationnelle sur le réseau filaire sauf pour la PiZero (cf. ci-dessus) ainsi que sur notre réseau wifi éducatif MobileClimatEtMeteo avec comme mot de passe ClimatEtMeteo. Le gestionnaire de réseau interactif installé par défaut est connman (wicd précédemment utilisé est obsolète et ne figure plus dans les paquets de la distribution ordinaire). Si on utilise connman avec son interface graphique en mode clavier/écran/souris après le démarrage de raspberry avec sa nouvelle image il permet de créer une interface pour n'importe quel réseau, se reporter aux tutoriaux correspondants si besoin mais l'interface est très intuitive. Il est possible de changer cet outil en fonction de vos besoins ou compétences (voir plus bas quelques propositions).

On passe aussi en systemden 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 modification :

sudo systemctl status networking
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

Les Raspberries autres que la PiZero prennent automatiquement le réseau filaire en DHCP. Si ce n'est pas le cas il y a deux solutions qui peuvent être appliquées avant le démarrage ou après via clavier/écran/souris :

  • 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 l'une l'autre il faudra choisir.

3.4.1 Configuration par défaut connman

le logiciel connman fonctionne identiquement pour toutes les raspberries et la solution proposée ci-dessus pour installer un wifi "standard" sur une PiZero peut s'appiquer à toutes les raspberries.

L'utilisation d'un réseau eduroam requiert d'ajouter un fichier myeduroam.config au dossier /var/lib/connman contenant les informations nécesaires à l'accès à eduroam (configurer en fonction de votre réseau) :

[global]
Name=myeduroam

[service_myeduroam]
Type=wifi
IPv4=dhcp
IPv6=auto
MAC=##:##:##:##:##:##
Name=eduroam
#Passphrase=$$$$$$$$$$$$$$$$$
Security=ieee8021x
EAP=peap
#CACertFile=none
Identity=username@myaddress.com
Phase2 = MSCHAPV2

De même le nom du dossier et le contenu du fichier settings est un peu différent, toujours la Mac de l'interface (hexa à 12 chiffres) et le SSID de l'interface (hexa à 14 chiffres), le terme wifi et les termes "managed_ieee8021x" au lieu de "managed_psk" soit wifi_XXXXXXXXXXXX_YYYYYYYYYYYYYY_managed_ieee8021x.

[wifi_XXXXXXXXXXXX_YYYYYYYYYYYYYY_managed_ieee8021x]
Name=eduroam
SSID=XXXXXXXXXXXX
Frequency=2462
Favorite=true
AutoConnect=true
Modified=2021-11-03T13:35:46.238134Z
Passphrase=$$$$$$$$$$$$$$$$$$
IPv4.method=dhcp
IPv4.DHCP.LastAddress=###.###.###.###
IPv6.method=auto
IPv6.privacy=disabled
Config.file=myeduroam
Config.ident=service_myeduroam

Pour installer un réseau filaire créer un fichier avec le mêmes conventions que pour le wifi mais avec les termes "ethetnet" et "cable" sans SSID de la forme ethernet_XXXXXXXXXXXX_cable. Le fichier `settings prend la forme :

[ethernet_XXXXXXXXXXXX_cable]
Name=Wired
AutoConnect=true
Modified=2021-12-28T15:51:35.232734Z
IPv4.method=dhcp
IPv4.DHCP.LastAddress=###.###.###.###
IPv6.method=auto
IPv6.privacy=disabled
IPv6.DHCP.DUID=0001000yyyyyyyyyXXXXXXXXXXXX

Si si on ne peut pas disposer d'une connection clavier/écran/souris mais si l'on peut accéder à distance il est possible d'interragir avec le logiciel connman via la commande connmancti voir connmanctl --help pour plus de précisions) sous réserves que le service que le service connman soit activé, vérifier avec sudo systemctl status connman.

3.4.2 Configuration via systemd-networkd et wpa_spplicant

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 via systemd-networkd :

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 qui peuvent être créées par certaines configurations dans le répertoire /lib/systemd/network :

cd /lib/systemd/network
sudo mv 10-eth0.network 10-eth0.network-orig
sudo mv 11-wlan0.network11-wlan0.network-orig

Il existe probablement une solution plus élégante mais celle-ci fonctionne (merci de toute suggestion).

Vérifier aussi que le répertoire /etc/systemd contient un fichier de configuration resolved.conf et par précaution ajouter le DNS QUad9 et/ou 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

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

3.4.2.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*
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=wl*
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 (sans passer par connman), si on dispose à l'avance des paramètres du réseau cible, il est possible de configurer le réseau à l'aide de wpa_cli ou de l'interface graphique de wpasupplicant (voir plus loin).

  • effectuer la configuration depuis un terminal à distance (la connection filaire est automatique) en ligne de commandes avec wpa_cli
  • Utiliser un clavier/écran/souris pour fournir les paramètres à l'interface graphique de wicd une fois la raspberryPi démarrée.

3.4.3 Détection de l'interface WIFI

Les deux solutions proposées sont 1. connman ou connmanctl qui sont fournis par défaut et sont préconfiguré sans ce qui rend leur manipulation aisée. 2. wpa_cli qui (d'après son nom cli Command Line Interface ;-) ) est moins convivial mais présente l'avantage de pouvoir pré-configurer l'interface en ligne de commandes et avant la connexion.

Cette interface est à manipuler avec précaution en veillant tout conflit avec connman, toute configuration de wpa_supplicant interfère avec connman et peut empêcher toute connexion wifi. Cela peut-être extrêmement utile si on désire "figer" une interface sur un réseau mais peut s'avérer extrêmement problématique si la même interface est utilisée avec plusieurs outils. Pour éviter cet écueuil désinstaller complètement connman et configurer le fichier /etc/wpa_supplicant/wpa_supplicant-wlan0.conf pour qu'il démarre seulement le réseau choisi (on peut conserver le reste de la configuration par défaut si on le souhaite par exemple pour désactiver l'interface P2P

Uniquement en cas de besoin compilation d'un driver !

Si l'interface wifi n'est pas détectée (elle n'apparait pas avec la commande ip a) c'est qu'il manque un driver pour le wifi, ce qui peut arriver quand on utilise des dongle WIFI récents ou peu utilisés ; par exemple le ACT1200M qui a besoin du driver rtl88x2bu qui n'existe dans aucun paquet debian. Exécuter la série de commandes suivantes expliquées sur le site https://github.com/cilynx/rtl88x2bu ou toutes commandes équivalentes pour une autre interface réseau.

Pour la compilation il est nécessaire d'avoir le paquet linux-source mais suivant le noyau utilisé il peut être nécessaire de disposer de paquets issus de la distribution testing (ou sid) nous allons d'abord ajouter cette ressource car les sources issues de la compilation avec rpi23-genimage sont incomplètes et ne permettent pas de compiler un nouveau module et un nouveau driver :

sudo jed /etc/apt/sources.list
# Le fichier doit avoir cette forme
cat /etc/apt/sources.list
deb http://debian.proxad.net/debian bullseye main contrib non-free
deb http://debian.proxad.net/debian/ bullseye-updates main contrib non-free
deb http://security.debian.org/debian-security bullseye-security main contrib non-free

deb http://debian.proxad.net/debian testing  main contrib non-free
deb-src http://debian.proxad.net/debian testing main contrib non-free
deb http://security.debian.org/debian-security testing-security  main contrib non-free

cat > distribOrder
Package: *                                                                                                                                                             
Pin: release n=bullseye                                                                                                                                                  
Pin-Priority: 900                                                                                                                                                      


Package: *
Pin: release a=testing
Pin-Priority: 100

apt search linux-source

sudo apt update

dpkg -l dpkg-dev
# si besoin
sudo apt install dpkg-dev apt-src

sudo apt-src install linux-source-5.15
# si des paquets supplémentaires sont nécessaires les installer avec
# sudo apt install -t testing 
sudo mv linux-5.15.15 linux
cd linux
make oldconfig
sudo make -j4 modules

Nous disposons maintenant d'une source linux minimale mais complète qui nous permet de compiler le driver du dongle wifi.

cd && mkdir -p Logiciels/RTL88x2BU && cd Logiciels/RTL88x2BU
git clone https://github.com/cilynx/rtl88x2bu
cd rtl88x2bu/
sed -i 's/I386_PC = y/I386_PC = n/' Makefile
sed -i 's/ARM_RPI = n/ARM_RPI = y/' Makefile
VER=$(sed -n 's/\PACKAGE_VERSION="\(.*\)"/\1/p' dkms.conf)
sudo rsync -rvhP ./ /usr/src/rtl88x2bu-${VER}
sudo dkms add -m rtl88x2bu -v ${VER}
sudo dkms build -m rtl88x2bu -v ${VER}
sudo dkms install -m rtl88x2bu -v ${VER}
sudo dkms install --force -m rtl88x2bu -v ${VER}

3.4.3.1 Logiciel connman en bullseye

Par défaut cette solution semble être la plus facile et la plus automatisée via l'interface graphique (via vnc ou xrdp). Il est recommandé d'utiliser les outils graphiques, Il est toutefois possible d'agir en ligne de commandees et de configurer connman comme décrit ci-dessous.

Configurer le fichier /etc/connman/main.conf en décommentant et modifiant la ligne :

AllowHostnameUpdates = false

Il est souvent plus facile de mettre en place le wifi depuis une interface graphique, on peut facilement utiliser l'outil connman pour mettre en place une connection wifi enutilisant xrdp ou vncserver qui sont installés par défaut il suffira de choisisr l'option autoconnect dans l'interface pour que la raspberry se connecte automatiquement au réseau (cette option très pratique n'est toutefois pas dénuée de risques)

Il est aussi possible de configurer le wifi directement en ajoutant un fichier de configuration dans /var/lib/connman

  1. exécuter la commande connmanctl services qui fournit le nom de l'interface qui DOIT être utilisé pour nommer le dossier qui va contenir le fichier de configuration
  2. créer le dossier avec le nom obtenu
  3. recopier les fichiers settings du modèle existant
  4. modifier les paramètres du fichier settings en fonction du réseau souhaité

Le nom de l'interface est construit de la façon suivante :

wifi_[MacAdress sans les séparateurs]_[SSID de l'interface]_managed_psk

[wifi_############_**************************_managed_psk]
Name=ClimatEtMeteo
SSID=**************************
Frequency=2412
Favorite=true
AutoConnect=true
Modified=2021-10-19T08:34:11.692503Z
Passphrase=ClimatEtMeteo
IPv4.method=dhcp
IPv4.DHCP.LastAddress=192.168.***.***
IPv6.method=auto
IPv6.privacy=disabled

3.4.3.2 Logiciel wicd par défaut jusqu'à buster (Seulement si connman échoue)

La façon la plus simple pour configurer l'interface WIFI avec wicd est de démarrer la raspberry connecté au filaire et d'utiliser un clavier-écran-souris. Ouvrir le logiciel wicd dans la barre de menus en bas à droite, élargir la fenêtre et accéder à la configuration des paramètres. Cliquer sur le démarrage par défaut de cette interface. Dès que le filaire sera débranché elle prendra le relais

3.4.3.3 Logiciel wpa_cli en bullseye (Seulement si connman échoue)

Le logiciel wpasupplicant fournit une interface graphique wpa_guiet une interface en ligne de commandes wpa_cli pour configurer le wifi. Verifier la configuration logicielle avec dpkg -l wpagui wpasupplicant network-manager elle soit se présenter comme ci-dessous éventuellement

Souhait=inconnU/Installé?/suppRimé?/Purgé?/H=à? garder
| É?tat=Non/Installé?/fichier-Config/dé?paqUeté?/é?chec-conFig/H=semi-installé?/W=attend-traitement-dé?clen>
|/ Err?=(aucune)/besoin Ré?installation (É?tat,Err: majuscule=mauvais)
||/ Nom             Version      Architecture Description
+++-===============-============-============-==============================================
un  network-manager <aucune>     <aucune>     (aucune description n'est disponible)
ii  wpagui          2:2.9.0-16   armhf        graphical user interface for wpa_supplicant
ii  wpasupplicant   2:2.9.0-16   armhf        client support for WPA and WPA2 (IEEE 802.11i)

Éventuellement effectuer les installations et délétions nécessaires :

sudo apt install wpagui wpasupplicant
sudo apt-purge network-manager

Par défaut le logiciel rfkill empêche de configurer les configurations du WIFI, cela me rappelle le bref moment pendant lequel un usager ordinaire de linux ne pouvait pas accéder à l'interface sans intervention de l'administrateur... On va ici empêcher simplement rfkill de bloquer par hardware ou software la configuration de l'interface wifi, pour que ce soit applicable à tous les utilisateurs on va modifier le fichier sudoers

sudo visudo
# add lines
Cmnd_Alias RFKILL_CMD = /usr/sbin/rfkill
ALL ALL=NOPASSWD: RFKILL_CMD 

Tous les utilisateurs peuvent rtaper maintenant :

sudo rfkill unblock all

Détecter le nom de l'interface avec ipa nous obtenons ici wlan0 et éditer le fichier de configuration correspondant à l'interface traitée wpa_supplicant-NOM_INTERFACE.conf ici avec la commande sudo nano /etc/wpa_supplicant/wpa_supplicant-wlan0.conf et ajouter le contenu suivant qui sert de pré-configuration et de modèle pour un wifi WPA2 perso avec phrase de passe.

## /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
p2p_disabled=1
# network={
#   ssid="__SSID__"
#   psk="__PASS__"
# }

la configuration s'effectue :

  • soit en utilisant l'interface graphique wpa_gui dans une configuration écran-clavier-souris,
  • soit via un terminal serveur (cf plus loin, dans ce cas attention de ne pas couper le réseau qui est en cours d'utilisation...)
  • soit via la ligne de commandes voir ci-dessous
sudo systemctl start wpa_supplicant@wlan0
sudo wpa_cli
[sudo] Mot de passe de ens-ife : 
wpa_cli v2.9
Copyright (c) 2004-2019, Jouni Malinen <j@w1.fi> and contributors

This software may be distributed under the terms of the BSD license.
See README for more details.


Selected interface 'wlan0'

Interactive mode

> scan
OK
<3>CTRL-EVENT-SCAN-STARTED 
<3>CTRL-EVENT-SCAN-RESULTS 
> scan_results
bssid / frequency / signal level / flags / ssid
24:f5:a2:**:**:**   2437    -50 [WPA2-PSK-CCMP][ESS]    MyNetwork
24:95:04:**:**:**   2442    -89 [WPA-PSK-CCMP+TKIP][WPS][ESS]   SFR_F228
98:e7:f4:**:**:**   2462    -92 [WPA2-PSK-CCMP][WPS][ESS]   DIRECT-31-HP ENVY 7640 series
> add_network
0
> set_network 0 ssid "MyNetwork"
OK
> set_network 0 psk "secret"
OK
> enable_network 0
OK
> quit

(re)Lancer Pour tester le fonctionnement puis installer au démarrage.

sudo systemctl restart wpa_supplicant@wlan0
sudo systemctl enable wpa_supplicant@wlan0

En cas de problème notamment avec la pi4-64bit bullseye

Veiller à ce que lors de l'install les paquets firmware-brcm80211, firmware-misc-nonfree, rfkill aient été convenablement installés. Ne pas installer connman et vérifier que les services wpa_supplicant et wpa_supplicant@wlan0 soient activés au boot (enabled).

Option Option Option Option Option Option

3.4.4 (Optionnel) Configuration de network-manager (au lieu de wicd ou connman s'ils échouent)

Tout ce qui suit est totalement optionnel le logiciel wicd est maintenant opérationnel en l'état pour busteret connman pour bullseye. Cette partie du tutoriel a été conservée 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. La combinaison systemd-networkd + wpa_supplicantest plus robuste mais moins conviviale et requiert l'utilisation de lignes de commande. Supprimer le logiciel wicd désactiver l'interface systemd-networkd (sinon la machine acquiert 2 IP sur la même interface réseau sans bridge, la seconde interface est en état secondary. Installer à la placenetwork-manager et nm-tray pour l'interface graphique.

sudo apt purge # (wicd ou connman)
sudo apt install network-manager nm-tray

Le logiciel networkmanager est installé pour gérer le réseau. ce logiciel propose une interface en 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 filaire 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 :

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. 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 commande ip addr ; si l'on dispose de l'adresse MAC de la Raspberry **:**:**:**:**:** on peut filtrer la commande ci-dessus avec l'adresse recherchée sudo 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 puis
    • 2 puis
    • n puis
    • p puis
    • 2 puis
    • accepter les valeurs par défaut qui correspondent à la taille effectivement disponible sur la cartes SD et écrire N pour "remove signature",
    • pour finir taper w.

Redimensionner le système de fichiers puis rebooter pour que ce soit pris en compte :

sudo resize2fs /dev/mmcblk0p2
sudo reboot (facultatif)

Après ce 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.4-mysql ca-certificates-java icedtea-netx openjdk-11-jdk openjdk-11-jre openjdk-11-jre-headless openjdk-17-jdk openjdk-17-jre openjdk-17-jre-headless

sudo apt install jed dirmngr wpasupplicant php-fpm fcgiwrap libfcgi-dev  php7.4-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 16 et 17 sont disponibles; à partir de la version 16 JNIdisparait veiller aux compatibilités.

4.3 Ajout d'une interface graphique

Une interface a été ajoutée par défaut mais des problèmes d'insatisfaction de dépendances emporaires peuvent empêcher la construction correcte de l'interface graphique. Dans ce cas seulement appliquer la procédure ci-dessous.

Afin de disposer d'une interface graphique on ajoute un display manager (lxdm dans ce cas), un window manager (lxqt dans cette proposition). Cette interface graphique est installée par défaut lorsque c'est possible mais des anomalies liées à des dépendances non satisfaites du fait de l'évolution rapide des packages des interfaces graphiques peuvent conduire à des situations cahotiques Si l'interface graphique n'est pas opérationnelle 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 lxqt*
sudo apt install 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 debian addgroup et adduser
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, tsuseret 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.

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 symbole d'instruments d'attaque numérique, cela est en général romancé mais repose tout de même 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. Ces éléments de sécurité sont notamment importants quand on permet l'accès à des interfaces avancées (graphiques) dont la complexité augmente la vulnérabilité. La procédure ci-dessous sera réutilisée pour l'installation de JupyterHub (voir plus loin) L'authentification permet ici de disposer d'un accès avec une interface graphique sur un ordinateur client, c'est une commodité qui doit êre remplacée par une sécurisation personnalisée dès que possible.

tsuser est l'utilisateur choisi pour lancer tigervnc, pour assumer la configuration proposée c'est donc l'utilisateur tsuser qui doit créer le certificat de sécurité. Répondre aux questions posées en fonction de vos paramètres, l'exemple fourni correspond au certificat de base créé pour l'usage de l'IFÉ par l'auteur.

sudo apt install tigervnc-standalone-server tigervnc-viewer
sudo su tsuser
cd
mkdir -p Utils/Certificates
cd !$
openssl req -new -newkey rsa:2048 -rand /dev/urandom -nodes -keyout meteotigervnc.key -out meteotigervnc.csr
openssl req -new -x509 -days 3652 -key meteotigervnc.key -out meteotigervnc.pub

On dispose maintenant des fichiers de sécurisaton nécessaires meteotigervnc.csr meteotigervnc.key meteotigervnc.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é. 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.

cd
vncpasswd

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

Configurer tigervncserver

vncserver -localhost no
vncserver -list
vncserver -kill :1
cp /etc/X11/Xtigervnc-session .vnc/xstartup (pas obligatoire)
exit

À ce stade la connexion n'est pas sécurisée et il est impératif de se connecter via un tunnel ssh qui est initié pr le client (remmina par exemple).

L'autre solution est d'utiliser l'option TLSVnc vncserver -SecurityTypes TLSVnc

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). Si la connexion TLS fonctionne il est possible de la mettre pr défaut dans le fichier /etc/tigervnc/vncserver-config-defaults

sudo jed /etc/tigervnc/vncserver-config-defaults
# ajouter dans le para graphe correspondant à la sécurité
$SecurityTypes = "TLSVnc";  

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 remminapar exemple.

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

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 1440x810 -alwaysshared -fg -SecurityTypes TLSVnc

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

sudo systemctl status vncserver@1
sudo systemctl start vncserver@1
sudo systemctl list-unit-files | grep vnc
sudo systemctl list-units | grep vnc

Notez que l'on peut lancer en parallèle plusieurs serveurs vnc sur plusieurs displays en augmentant son numéro d'ordre : vncserver@1, vncserver@2, vncserver@3, etc... Ne pas oublier d'arrêter ce ou ces service(s) 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... La façon la plus simple est d'accéder via un tunnel ssh pour respecter les règles de sécurité, une fois sur la machine l'accès au display vnc se fait par mot de passe par défaut.

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 au démarrage il faut le désactiver avec la commande sudo systemctl disable vncserver@1 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 Mise en place de xrdp

Un second protocole a été ajouté pour afficher l'écran de la raspberry à distance : xrdp. Ce protocole est utilisé par défaut par le système d'exploitation windows et peut aussi être utlisé sous linux. Ce dispositif est fourni par le logiciel xrdp qui permet d'afficher sur un écran distant l'écran de la raspberry comme le protocole VNC. Comme pour la solution précédente, ce protocole permet de ne pas avoir à connecter un clavier une souris et un écran à une raspberry Pi pour pouvoir l'utiliser. Vérifier si xrdp est installé.

sudo dpkg -l xrdp   
#si non
sudo apt install xrdp

Ajout de l'utilisateur xrdp dans le groupe ssl-cert.

sudo adduser xrdp ssl-cert

xrdpest installé et préconfiguré pour fonctionner comme un service géré comme les autres services par systemctl. Les 3 fichiers de configuration du service se trouvent dans /lib/systemd/system :

xrdp-sesman.service
xrdp session manager 
xrdp.service                                                                          

Les fichiers de configuration de l'application sont dans /etc/xrdp, on modifie ci dessous le port et la profondeur de l'image.

sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak
sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini
sudo sed -i 's/max_bpp=32/#max_bpp=32\nmax_bpp=128/g' /etc/xrdp/xrdp.ini
sudo sed -i 's/xserverbpp=24/#xserverbpp=24\nxserverbpp=128/g' /etc/xrdp/xrdp.ini

Démarrage du service :

systemctl status dbus
# s'il n'est pas actif 
sudo su
systemctl enable dbus
exit
sudo systemctl start dbus
# dbus activé
sudo systemctl start xrdp

Vérification du fonctionnement avec sudo systemctl status xrdp, vérification que xrdp est activé au démarrage avec sudo systemctl is-enabled xrdp̀.

L'affichage se fait à l'aide d'un client de serveur de terminaux remmina par exemple ou l'outil connexion de bureau à distance sur le port 3390 soit : IP.de.la.raspi:3390.

4.5.3 (Seulement si besoin incontournable) Dégradation de la sécurité ou retour à tightvncserver

Le serveur de terminaux VNC 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 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 GPIOsans privilèges particuliers il est nécessaire d'opérer certainesmodifications donnant à un utilisateur ordinaire membre du groupe gpiole 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'"

Pour l'urtilisation du SPI Le fichier 50-gpio.rules prend la forme :

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/fe200000.gpio && chmod -R 770 /sys/devices/platform/soc/fe200000.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=="spidev*", PROGRAM="/bin/sh -c 'chown -R root:gpio /sys/class/spidev && chmod -R 770 /sys/class/spidev; \
chown -R root:gpio /sys/devices/platform/soc/fe204000.spi/spi_master/spi0/spi0.0/spidev && \
chmod -R 770 /sys/devices/platform/soc/fe204000.spi/spi_master/spi0/spi0.0/spidev; \
chown -R root:gpio /dev/spidev0.0  && chmod -R 770 /dev/spidev0.0'"

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'"

on modifie aussi la ligne de commande dans /boot/cmdline.txt en ajoutant en fin de ligne spidev.bufsiz=32768 et enfin on ajoute l'activation du bus SPI et le contrôle de la fréquence dans le fichier /boot/config.txt pour contrôler un rubande leds librairie rpi_ws281x

dtparam=spi=on # activation du bus SPI
# to use SPI for ledstrip
core_freq_min=500 # pour la raspi4
# core_freq=250 # pour la pi3

Attention aux conflits en activant le bus SPI

Tout comme le GPIO l'USB n'est pas accessible aux utilisateurs de base , l'utilsateur weewx est un utilisateur non privilégié qui doit pouvoir accéder à la station via une interface USB on ajoute au même endroit le fichier 40-usbweewx.rules avec la commande

cat >  /etc/udev/rules.d/40-usbweewx.rules

on ajoute le contenu suivant :

# make any te923 station connected via usb accessible to non-root
SUBSYSTEM=="usb", ATTR{idVendor}=="1130", ATTR{idProduct}=="6801", ACTION=="add", GROUP="weewx", MODE="0664"

# make any Vantage Pro2 station connected via usb accessible to non-root
#SUBSYSTEM=="usb", ATTR{idVendor}=="10c4", ATTR{idProduct}=="ea60", ACTION=="add", GROUP="weewx", MODE="0664"

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 sudo nano ./etc/udev/rules.d/60-cam.rules et on ajoute le contenu suivant :

cat >  /etc/udev/rules.d/60-cam.rules
SUBSYSTEM=="vchiq", GROUP="video", MODE="0660"
SUBSYSTEM=="vc-sm",GROUP="video",MODE="0660"
SUBSYSTEM=="bcm2708_vcio",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. Il est possible grace à l'interface graphique de connman de créer un réseau wifi dont la raspberry est le routeur, suivre la documentation pour activer le tethering.

Construire soi même une interface réseau avec des contraintes particulières 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. Attention les compilations peuvent s'avérer extrêmement longues sur les petits modèles de raspis (PI0 P1 notamment).

cd
mkdir -p Logiciels/Cmake
cd Logiciels/Cmake
wget https://github.com/Kitware/CMake/releases/download/v3.21.5/cmake-3.21.5.tar.gz
tar xvfz cmake-3.21.5.tar.gz
cd cmake-3.21.5
./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 et accélération graphique

Pour détecter la camera ou permettre l'accélération graphique pour la Pi4 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

Pour l'accélération graphique de la Pi4 la configuration est correcte (caméra non activée) elle doit être de la forme :

# uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800
force_turbo=1
boot_delay=1
dtoverlay=pi3-disable-bt
enable_uart=0
initramfs initramfs-5.10.7-v8 followkernel
dtparam=i2c_arm=on
dtparam=spi=on
max_framebuffers=2
arm_64bit=1
cmdline=cmdline.txt
dtparam=audio=on
gpu_mem=128
dtoverlay=vc4-fkms-v3d, cma-128

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/userland.git

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 !$
# En cas de problème pour avoir les infos sur /dev/vchiq
sudo  udevadm info --name=/dev/vchiq

Pour prendre une photo utiliser la commande : raspistill -q 100 -o tetst.jpg -w 1280 -h 720 -v (de nombreuses options sont disponibles). Pour streamer une video sur le serveur rtmp tremplin de l'ENS : raspivid -t 0 -w 640 -h 360 -o - | ffmpeg -re -i - -c:v libx264 -f flv rtmp://visioweb.tremplin.ens-lyon.fr/live/XXXXXX ; XXXXX est le mot de passe servant à ouvrir le flus de lecture. Il est certainement possible d'améliorer le rendu et la fluidité mais la gestion des paramètres reste délicate. Il est possible aussi que les paramètres de boot notamment la mémoire vidéo aient une importance.

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, attention le déploiement de ces outils occupe une place importante.

git clone https://github.com/raspberrypi/tools.git

6.1.4  Activation du réseau WIFI et du réseau filaire pour la production

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 il faudra reconfigurer l'interface pour se connecter à un autre réseau. On devra réutiliser une des méthodes décrites dans le chapitre consacré au réseau adaptée aux besoins des utilisateurs

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

Si lors de la configuration une interface secondaire parasite est créée utiliser les commandes suivantes pour s'en débarrasser :

ip addr flush dev wlan0
sudo shutdown -r

6.1.4.1  Configurer le réseau filaire

Pour configurer le réseau filaire il peut être nécessaire de supprimer la désignation générique de l'interface (eth0) et la remplacer par la valeur construite au boot à partir de l'adresse Mac (Attention Cette valeur est unique et désigne 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 lors de la création de l'image et dans ce cas le nom de l'interface est 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

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 comme cela a été décrit plus haut. 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...) risque d'entrainer l'arrêt du réseau. D'autre part ce travail impose la manipulation par l'administrateur de données confidentielles en clair ce qui est à proscrire pour un usager ordinaire. Il est donc préférable d'utiliser les outils graphiques standards via la connexion au terminal serveur installé plus haut. (La seule exception à cette règle concerne la création d'une connexion via eduroam qui requiert que l'on ajoute à la main le fichier spécifique pour l'eduroam utilisé dans /var/lib/connman)

On se connecte avec un outil d'affichage de terminal à distance utilisant le protocole VNC ou xrdp, par défaut les services VNC et xrdp sont portés par tsuser et le mot de passe configuré plus haut. Le logiciel installé par défaut est connman (cf 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. Si l'icone réseau n'apparait pas lancer dans le menu des applications connmanUI.

6.2  Installation et mise à jour de l'environnement logiciel

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 initiés par Intel et maintenus par 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 informatique 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 de l'installation consiste à créer pour chaque logiciel 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 ayant pour racine le dossier Logiciels; on y retrouvera par exemple un dossier IoT (Internet of Things) contenant un dossier mraa et un dossier upm.

6.2.1  Récupération et installation de Node.js

ATTENTION-1 en ce moment 2022-01 la compilation croisée de mraa et upm avec nodejs ne fonctionne qu'avec l'application d'un patch (voir plus bas).

ATTENTION-2 il n'existe pas de version nodeJS pour armel, la compilation croisée standard sur debian échoue ainsi que la compilation sur la PiZero nodeJS est désactivésur la PiZero

Node.js évolue très rapidement avec un souci peu prononcé pour la compatibilité ascendante, il est souhaitable de vérifier s'il n'existe pas une nouvelle version compatible depuis l'écriture de ce blog, vérifier la version à jour sur le site Node.js nous utiliserons ici la version 16.11.0 avec npm 8.0.0).

Il y a deux stratégies possibles pour utiliser nodejs la première est une stratégie par utilisateur qui est la plus souple en utilisant nvm qui permet de disposer de plusieurs versions de node en parallèle et de s'adapter aux compatibilités/incompatibilités entre node et le reste de l'environnement. Pour le projet Tremplin il nous semble plus pertinent d'installer ce logiciel comme une ressource commune afin que tous les usagers soient dans la même situation et en cas de besoin il est simple pour chacun d'ajouter nvm dans son espace personnel.

6.2.1.1  Récupération et installation de nvm (stratégie par utilisateur non déployée par défaut)

Vérifier la version à jour de nvm sur la forge github puis télécharger installer avec la commande suivante :

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash

Pour lancer nvm la première fois exécuter les 3 commandes ci-dessous si elles n'ont pas été automatiquement exécutées par le script ou si elles eont généré des messages d'erreur :

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  

verifier la situation et charger les versions de nodejs désirées (ici la dernière stable tet la LTS puis on utilise la dernière version).

source ~/.bashrc
nvm ls
#            N/A
#iojs -> N/A (default)
#node -> stable (-> N/A) (default)
#unstable -> N/A (default)
nvm install 16.11.0
#Downloading and installing node v16.11.0...
#Downloading https://nodejs.org/dist/v16.11.0/node-v16.11.0-linux-armv7l.tar.xz...
####################################################################### 100,0%
#Computing checksum with sha256sum
#Checksums matched!
#Now using node v16.11.0 (npm v8.0.0)
#Creating default alias: default -> 16.11.0 (-> v16.11.0)
nvm install 14.18.0
#Downloading and installing node v14.18.0...
#Downloading https://nodejs.org/dist/v14.18.0/node-v14.18.0-linux-armv7l.tar.xz...
####################################################################### 100,0%
#Computing checksum with sha256sum
#Checksums matched!
#Now using node v14.18.0 (npm v6.14.15)
ens-ife@raspife4:~$ nvm use 16.11.0
#Now using node v16.11.0 (npm v8.0.0)

Pour supprimer nvm et toutes les versions installées enlever les lignes contenant NVM dans .bashrc pui supprimer le dossier .nvm :

rm -r ~/.nvm

6.2.1.2  Récupération et installation de nodejs

Créer le dossier pour accueillir le logiciel et le télécharger.

cd
mkdir -p Logiciels/Node
cd !$

Deux méthodes sont possibles soit on utilise les binaires précompilés soit on utilise les source sque l'on recompile pour les raspi 2-3 les versions précompilées fonctionnent correctement ainsi que pour les pi4 32 bits et Pi4-64 bits, pour la Pi0 il faut recompiler.

Vérifier la version et télécharger depuis le site le binaire ou les sources de la version choisie (ici 16.11.0)

#Téléchargement des binaires pour PI3 32 bits
wget https://nodejs.org/dist/v17.0.1/node-v17.0.1-linux-armv7l.tar.xz
tar xvfJ node-v17.0.1-linux-armv7l.tar.xz
cd node-v17.0.1-linux-armv7l
for i in bin include lib share; do sudo cp -r $i/* /usr/local/$i; done

#Téléchargement des binaires pour PI4 en 64 bits
# wget https://nodejs.org/dist/v17.0.1/node-v17.0.1-linux-arm64.tar.xz
# tar xvfJ node-v17.0.1-linux-arm64.tar.xz
# cd node-v17.0.1-linux-arm64
# for i in bin include lib share; do sudo cp -r $i/* /usr/local/$i; done
#

#Téléchargement des binaires pour PiZero
#wget https://unofficial-builds.nodejs.org/download/release/v17.5.0/node-v17.5.0-linux-armv6l.tar.xz
#tar xf node-v17.5.0-linux-armv6l.tar.xz
#for i in bin include lib share; do sudo cp -r $i/* /usr/local/$i; done


#Téléchargement de la source
# Si PiO ou Pi1 ou PI4-64 les versions récentes peuvent ne pas  contenir  de version binaire compilée il faut utiliser la source.
# wget https://nodejs.org/dist/v17.3.0/node-v17.3.0.tar.gz
#tar xvfJ node-v17.3.0.tar.gz
#cd node-v17.3.0
#./configure
#make
#sudo make install
# la compilation se chiffre en ... jours sur la Pi0!

Création des liens supplémentaires

sudo ln -s /usr/local/bin/node /usr/local/bin/nodejs
sudo npm install -g --upgrade npm node-gyp configurable-http-proxy

6.2.2  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. De même les versions de C++ se succèdent et proposent de nouvelles fonctionnalités utilisées dans les compilations croisées. La création d'un jeu de compilations croisées est délicate et doit être menée avec précaution. 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
16.11.0 4.1.0
17.0.1
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 qui indique que nous pourrons utiliser nos librairies croisées avec les 4 langages :

The SWIG test-suite and examples are configured for the following languages:
java javascript perl5 python 

poursuivre avec :

make -j4
sudo make install
sudo dpkg -l libjavascriptcoregtk*
sudo apt install libjavascriptcoregtk-4.0-dev
sudo ln -s /usr/include/webkitgtk-4.0/JavaScriptCore /usr/include/JavaScriptCore

6.2.3  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
sudo doxygen -u

6.2.4  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.5  Récupération et construction du paquet tinyb

dpkg -l libglib2.0-dev
# si manquante
sudo apt install libglib2.0-dev
cd ~/Logiciels
mkdir Tinyb
cd Tinyb
git clone https://github.com/intel-iot-devkit/tinyb.git
cd tinyb/
mkdir build
cd build/
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make -j4
sudo make install

6.2.6  Récupération et 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 les libraries mraa et upm qui permettent de gérer le bus GPIO et un grand nombre de dispositifs électroniques

cd
mkdir -p Logiciels/IoT
cd !$
git clone https://github.com/eclipse/mraa
git clone https://github.com/eclipse/upm

Au 14/02/2022 le patch de @nxhack pour swig et javascript est nécessaire pour parvenir à compiler mraa. Fixer ensuite l'environnement java et lancer la compilation. Ajouter la compilation des interfaces java et nodejs en modifiant le fichier CMakeLists avec les valeurs ci-dessous.

Il est nécessaire de prendre en compte l'existence de /dev/i2c-1 sans /dev/i2c-0 car le code requiert qu'il existe le bus 0 (une demande de modification est en cours sur ecclipse), modifier le fichier src/mraa.c . Il est aussi nécessaire de créer le lien symbolique de /dev/i2c-1 vers /dev/i2c-0 la solution sudo ln -s /dev/i2c-1 /dev/i2c-0 est opérationnelle mais ne fonctionne que pour la session en cours, pour créer un lien définitif il est nécessaire de créer une règle udev.

jed CMakeLists.txt
option (BUILDSWIGNODE "Build swig node modules." ON)
option (BUILDSWIGJAVA "Build Java API." ON)
option (USEPYTHON3TESTS "Force tests to run with python3" ON) 
jed src/mraa.c
#transformer
if (mraa_file_exist("/sys/class/i2c-dev/i2c-0"))
#en
if (mraa_file_exist("/sys/class/i2c-dev/i2c-0") || mraa_file_exist("/sys/class/i2c-dev/i2c-1"))
wget https://patch-diff.githubusercontent.com/raw/eclipse/mraa/pull/1064.patch
patch -p1 < 1064.patch
mkdir build
cd build
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-armhf
#export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-arm64 # pi4-64
# cmake -Wno-dev -DCMAKE_INSTALL_PREFIX=/usr ..
cmake .. -Wno-dev -DCMAKE_INSTALL_PREFIX=/usr -DENABLEEXAMPLES=0 -DBUILDSWIGNODE=ON -DSWIG_EXECUTABLE=/usr/local/bin/swig -DV8_ROOT_DIR=/usr/local/include/node -DNODE_ROOT_DIR=/usr/local/include/node     -DPYTHON2LIBS_FOUND=FALSE   -DPYTHON2INTERP_FOUND=FALSE
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*
ls
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 ~/Logiciels/IoT/upm
wget https://github.com/eclipse/upm/pull/703/commits/c7d7718c21828883a4d8eea585b89185a1eaf150.patch
mv c7d7718c21828883a4d8eea585b89185a1eaf150.patch upmNXHack.patch
patch -p1 < upmNXHack.patch

Ajouter la compilation des interfaces nodeJS java en modifiant le fichier CMakeLists comme indiqué ci-dessous et modifier la version du compilateur 11 -> 17 :

jed CMakeLists.txt
option (BUILDSWIGNODE "Build swig node modules." ON)
option (BUILDSWIGJAVA "Build Java API." ON)
set (CMAKE_CXX_STANDARD 17) #instead of 11
set (CMAKE_C_STANDARD 17) #instead of 11

Créer le dossier de travail et lancer la compilation.

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.9 ; do sudo cp src/*/$i/*.py /usr/lib/$i/dist-packages/upm/; done
for i in python2.7 python3.9sudo  ; 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.7  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 libopenblas-dev libhdf5-dev libnetcdf-dev python3-pandas python3-rpi.gpio python3-netcdf4 python3-numpy python3-six python3-wheel python3-setuptools python3-folium
sudo apt install libopenblas-dev libhdf5-dev libnetcdf-dev python3-pandas python3-rpi.gpio python3-netcdf4 python3-numpy python3-six python3-wheel python3-setuptools python3-folium
sudo pip3 install --upgrade pandas  netCDF4 numpy six wheel setuptools spidev folium pillow
export CFLAGS=-fcommon
sudo pip3 install RPi.GPIO
# installer aussi dans l'environnement virtuel  pour jupyter
sudo su callisto
cd ~/JupyterLab/
pipenv shell
export MAKEFLAGS="-j$(nproc)"
pipenv install pandas  netCDF4 numpy six wheel setuptools spidev folium pillow matplotlib
export CFLAGS=-fcommon
pipenv install RPi.GPIO
export PIP_NO_CACHE_DIR=off
pipenv lock --clear

Pour la PiZero ajouter la bibliothèque 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  (Optionnel) Installation d'un simulateur graphique de réseau après avoir installé un docker

sudo apt purge docker lxc-docker docker-engine docker.io
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg -o docker.gpg
sudo gpg --import docker.gpg
sudo add-apt-repository \
   "deb [$(dpkg --print-architecture)] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable"
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
dpkg -l openvswitch-switch wireshark imagemagick tk tcllib util-linux
sudo apt install  --reinstall 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

6.4  Installation de Jupyterlab 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 ou pipenv, jupyterhub requiert python3. Les commandes concernant python2 sont maintenant obsolètes. depuis jupyterlab 3.0 on utilise exclusivement python3 et jupyter est de moins en moins utilisé. Il est possible de réaliser une installation faisant appel à pipenv cette stratégie crée un environnement virtuel dans lequel la compatibilité et l'interopérabilité entre les paquets python est garantie sans perturber le fonctionnement du python global du système. L'inconvénient est que l'environnement virtuel duplique l'espace occupé par python. Pour installer en utilisant n processeurs en parallèle utiliser export MAKEFLAGS="-j$(nproc)".

sudo apt install rustc
sudo su callisto
cd
mkdir JupyterLab
cd JupyterLab
pipenv install jupyterlab
pipenv shell
export MAKEFLAGS="-j$(nproc)"
pip install --upgrade pip setuptools wheel
pip install jupyterhub
pip install --upgrade matplotlib flexx plotly matplotlib git+https://github.com/jupyter/sudospawner jupyter_contrib_nbextensions

Il est nécessaire de rapatrier les librairies mraa et upm compilées sur le python du système général.

cd /lib/python3.9/dist-packages/
ls upm/*.py
# if no file is found hey must be copied from source
exit;exit
cd ~/Logiciels/IoT/upm/build
sudo cp  src/*/python3.9/*.py /lib/python3.9/dist-packages/upm/
sudo su callisto
cd ~/JupyterLab
pipenv shell
cd /lib/python3.9/dist-packages
cp -r *mraa* upm ~/.local/share/virtualenvs/JupyterLab-RHxiRMZV/lib/python3.9/site-packages/

La commande suivante est devenue inutile avec jupyterlab : sudo jupyter contrib nbextension install --system

6.4.1  Configuration de la sécurité et du lancement par le user callisto

Comme pour tigervncla sécurité est une contrainte importante de jupyterhub pour les mêmes raisons. La configuration est ici légèrement différente et 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 assumer la configuration proposée c'est donc l'utilisateur callisto qui doit créer 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 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 = /home/callisto/.local/share/virtualenvs/JupyterLab-RHxiRMZV/bin/sudospawner

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

L'utilisateur callisto doit aussi appartenir au groupe shadow.

sudo adduser callisto shadow

6.4.2  Ajout de moteurs nodeJS et java 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.

La version 3 de jupyterlab résoud tous les problèmes d'extensions en permettant d'ajouter les extensions depuis l'interface web. En cas de besoin le contournement qui avait été utilisé précédemment pour permettre d'installer proprement les extensions en ligne de commande avec jupyter lab build, pour les raspberries PI3 et en dessous est proposé, . Le contournement foncctionne avec webpack.

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

Pour que les usagers choisis puissent ajouter leurs extensions il est nécessaire de modifier les permissions des dossiers de .local/share/virtualenvs/JupyterLab-RHxiRMZV/share/jupyter/lab. Dans notre cas tous les usagers ayant ce droit appartiennent au groupe "jupyterhub" la solution choisie a donc été la suivante :

sudo su callisto
cd ~/.local/share/virtualenvs/JupyterLab-RHxiRMZV/share/jupyter/lab
ls 
# If those folder do not exist
mkdir extensions settings staging
for i in extensions settings staging; do chmod -R g+w $i; chgrp jupyterhub $i; done

Installation voila pour extraire un notebook

cd ~/JupyterLab/
pipenv shell
pip install voila

Installation d'un autre moteur js

sudo su
npm install -g [--unsafe-perm] ijavascript
sudo su callisto
cd ~/JupyterLab
pipenv shell
pip install jupyter ipywidgets
ijsinstall

Le moteur s'isnstalle par défaut dans .local/share/jupyter/kernels/ alors qu'il devrait se positionner dans ~/.local/share/virtualenvs/JupyterLab-RHxiRMZV/share/jupyter/kernels il faut donc le déplacer à la main.

ls ~/.local/share/jupyter/kernels
cp -r ~/.local/share/jupyter/kernels/javascript ~/.local/share/virtualenvs/JupyterLab-RHxiRMZV/share/jupyter/kernels

Installation d'un moteur java.

pip install kotlin-jupyter-kernel

6.4.3  Installation d'un service jupyterhub ou jupyterlabhub

Vérifier que les logiciels nécessaires à la production de sorties textes au format pdf drpuis jupyter ou jupyterlab est possible avec la commancde sudo dpkg -l pandoc python3-pypandoc python3-pandocfilters texlive-xetex texlive-latex-recommended texlive-lang-other, la réponse doit être du type :

||/ Nom                       Version         Architecture Description
+++-=========================-===============-============-=====================================
ii  pandoc                    2.2.1-3+b2      armhf        general markup converter
ii  python3-pandocfilters     1.4.2-1         all          python3 bindings for Pandoc's filters
ii  python3-pypandoc          1.4+ds0-1.1     all          Thin wrapper for pandoc (Python 3.x)
ii  texlive-lang-other        2018.20190227-2 all          TeX Live: Other languages
ii  texlive-latex-recommended 2018.20190227-2 all          TeX Live: LaTeX recommended packages
ii  texlive-xetex             2018.20190227-2 all          TeX Live: XeTeX and packages

Si ce n'est pas le cas installer les paquets manquants avec sudo apt install ... et les paquets python avec pip

sudo apt install texlive-lang-other texlive-latex-recommended texlive-xetex
sudo su callisto
cd ~/JupyterLab/
pipenv shell
pip install --upgrade pandoc pandocfilters pypandoc

6.4.3.1  Mise en place de jupyterhub

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=pipenv run 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.4.3.2  Mise en place de jupyterlabhub

  • pour utiliser exclusivement jupyterlab et non jupyter modifier le fichier de configuration de callisto jupyterhub_config.py en modifiant la valeur du paramètre suivant :
sudo su callisto
cd ~/Jupyterhub/
jed jupyterhub_config.py
# change to
c.Spawner.cmd = ['jupyter-labhub']

Lors de la dernière installation (2021-10-16) cette option éait inopérante. Pour y remédier changement de la commande de démarrage par défaut.

sudo su callisto
cd /home/callisto/.local/share/virtualenvs/JupyterLab-RHxiRMZV/bin
mv jupyterhub-singleuser jupyterhub-singleuser-std
cp jupyter-labhub jupyterhub-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.4.4  (Option obsolète) Installation d'une alternative entre jupyterlab et jupyter

  • 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

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

Rendre les fichiers exécutables puis quitter le user callisto et recopier le fichier sudospawner-singleuser dans sudospawner-singleuserlab :

chmod a+x *.sh`
exit
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/jupyterlabhubun des deux au choix.

6.5  Installation 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.6  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.74-dev libboost-chrono1.74-dev libboost-system-dev libboost-thread-dev libboost1.74-dev libcurl4-gnutls-dev curl libusb-dev libconfuse-dev doxygen libftdi-dev
sudo apt install python3-openssl libssl1.0-dev libboost-atomic1.74-dev libboost-chrono1.74-dev libboost-system-dev libboost-thread-dev libboost1.74-dev libcurl4-gnutls-dev curl libusb-dev libconfuse-dev doxygen libftdi-dev

En bullseye

sudo dpkg -l python3-openssl libssl-dev libboost-atomic1.74-dev libboost-chrono1.74-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.74-dev libboost-chrono1.74-dev libboost-system-dev libboost-thread-dev libboost-dev libcurl4-gnutls-dev curl libusb-dev libconfuse-dev doxygen libftdi-dev

La version 67 ou 74 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 openzwavecompilé 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 (1Go) 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, la compilation en -j4 passe sur la Pi4 avec 4Go de mémoire..

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.7  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.7.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 [[ $1 == "" ]] ; then
  echo "Type " $prog " [on / off]"
  echo "Start or stop jupyterhub at boot"
  exit
else
  case $1 in
    on )
      sudo systemctl enable jupyterhub      
    ;;
    off )
      sudo systemctl disable jupyterhub    
    ;;
    * )
      echo  "Choice is on or off"
      exit
    ;;
  esac
fi

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

6.7.3  Pour domoticz

Ajouter le fichier avec nano domoticzOnOff ou une commande équivalente

#!/bin/bash
# script pour activer/désactiver domoticz au boot
#
prog=`basename $0`
if [[ $1 == "" ]] ; then
  echo "Type " $prog "on or off to start or stop domoticz at boot"
  exit
else
  case $1 in
    on )
      sudo systemctl enable domoticz
    ;;
    off )
      sudo systemctl disable domoticz
    ;;
    * )
      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.8  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
git clone http://vidal@depot.tremplin.ens-lyon.fr/Tremplin-des-Sciences/CahiersDeProgrammesClimat
exit
sudo su localadm
cd
git clone http://vidal@depot.tremplin.ens-lyon.fr/Tremplin-des-Sciences/CahiersDeProgrammesCodage
git clone http://vidal@depot.tremplin.ens-lyon.fr/Tremplin-des-Sciences/CahiersDeProgrammesClimat
exit
cd
git clone http://vidal@depot.tremplin.ens-lyon.fr/Tremplin-des-Sciences/CahiersDeProgrammesCodage
git clone http://vidal@depot.tremplin.ens-lyon.fr/Tremplin-des-Sciences/CahiersDeProgrammesClimat

6.9 Ajout d'un media-center

La raspberryPi peut aussi être utilisée en media-center pour y parvenir il suffit de disposer d'une bibliothèque de médias accessibles depuis la raspberry et du logiciel kodi. La manipulation du media-center se fait via l'interface intuitive de kodi.

Pour installer :

sudo apt install kodi kodi-bin kodi-data

6.10 Image sans interface graphique (type serveur) pour le pilotage de la station météorologique et le partage de données

Cette image n'a pas de serveur X ni la suite de logiciels du poste de travail de programmation ou de traitement des données climat. Elle est créée avec un script largement simplifié.

6.10.1 Configuration du réseau statique

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=raspife3W
Virtualization=no

[Network]
RouteMetric=10
IPv6PrivacyExtensions=true
DHCP=no
Address=***.***.***.***/24
Gateway=***.***.***.***
DNS=***.***.***.***

Changer le port de connection /etc/ssh/sshd_config. Rajouter le user weewx et la clef d'accès aux serveurs Ajouter les permissions udev

6.10.2 Configuration du logiciel de pilotage de stations météorologiques

Le logiciel weewx récupère les données de la station météorologique qui lui est connectée et fournit des pages web affichant les mesures réalisées.Une version à jour à la date de création de l'image est installée par défaut ou téléchargé depuis le site d'origine. télécharger les mises à jour et les installer au besoin. Après avoir créé le répertoire Logiciels s'il n'existe pas encore, on récupère ici à titre conservatoire une copie du paquet weewx.

Attention ! le logiciel weewx ne figure pas dans les dépôts debian par défaut, les mises à jour doivent être faites à la main en téléchargeant le paquet http://weewx.com/downloads/released_versions/python3-weewx_4.2.0-1_all.deb et en l'installant avec la commande dpkg -i python3-weewx_4.2.0-1_all.deb, lors d'une telle mise à jour de weewx le fichier de configuration /etc/weewx/weewx.conf est réécrit en tenant compte de son contenu avant mise à jour. Toutefois, faire une copie de ce fichier AVANT d'entreprendre la mise à jour, puis comparer et modifier si nécessaire le nouveau fichier (le fichier existant étant utilisé comme modèle les paramètres sont théoriquement conservés mais une erreur même minime de syntaxe peut entrainer la perte de paramètres, il est souhaitable de vérifier attentivement).

cd
mkdir -p Logiciels/Weewx
cd !$
wget http://weewx.com/downloads/released_versions/python3-weewx_4.5.1-1_all.deb

6.10.3 Ajout des cadrans interactifs

Il est possible de proposer plusieurs modes d'affichage. Nous avons choisi d'ajouter ici un affichage par cadrans et un affichage par semaine ou mois téléchargeables depuis la forge github. Les deux ambiances graphiques (skins) qui sont utilisées ici pour afficher les données sont highcharts et Steel-Series. Elles sont intégrées sous la forme d'extensions du logiciel weewx en utilisant la procédure wee_extension.

cd ~/Logiciels/Weewx
mkdir Skins
cd Skins
wget -P . https://github.com/gjr80/weewx-highcharts/releases/download/v0.3.0/hfw-0.3.0.tar.gz
wget -P . https://github.com/gjr80/weewx-steelseries/releases/download/v2.7.5/steelseries-2.7.5.tar.gz
wget -P . https://github.com/gjr80/weewx-realtime_gauge-data/releases/download/v0.4.2/rtgd-0.4.2.tar.gz
sudo systemctl stop weewx
sudo wee_extension --install=hfw-0.3.0.tar.gz
sudo wee_extension --install=steelseries-2.7.5.tar.gz
sudo wee_extension --install=rtgd-0.4.2.tar.gz

Les éléments de configuration sont intégrés aufichier /etc/weewx/weewx.conf parmi les modifications de configuration déjà effectuées. Il est nécessaire de modifier les paramètres intégrés automatiquement en fonctions des choix d'affichage personnalisés de chacun (notamment les unités). les sections nouvellement installées à modifier sont les suivantes :

    [[Highcharts]]
        skin = Highcharts
        [[[Units]]]
            [[[[StringFormats]]]]
            [[[[Groups]]]]

.../...

    [[SteelSeries]]
        skin = ss
        HTML_ROOT = /var/www/html/ss
        [[[Units]]]
            [[[[StringFormats]]]]
            [[[[Groups]]]]

Les affichages améliorés sont maintenant disponibles.

cd ~/Logiciels/Weewx
mkdir Utils
cd !$
git clone https://github.com/mcrossley/SteelSeries-Weather-Gauges.git
cd SteelSeries-Weather-Gauges/

Créer ensuite dans la hiérarchie weewx le dossier qui contiendra le graphisme de l'interface et recopier les fichiers téléchargés.

sudo mkdir /etc/weewx/skins/ss
sudo cp weather_server/WeeWX/skin.conf /etc/weewx/skins/ss
sudo cp weather_server/WeeWX/index.html.tmpl /etc/weewx/skins/ss
sudo cp weather_server/WeeWX/gauge-data.txt.tmpl /etc/weewx/skins/ss

S'ils n'existent pas encore ajouter les répertoires suivants et leur contenu

sudo mkdir /etc/weewx/skins/ss/css
sudo cp web_server/css/*.css /etc/weewx/skins/ss/css
sudo mkdir /etc/weewx/skins/ss/scripts
sudo cp web_server/scripts/*.js /etc/weewx/skins/ss/scripts

Éditer ensuite le fichier /etc/weewx/skins/ss/scripts/gauges.js et le modifier en fonction des paramètres locaux et des choix d'affichage.

weatherProgram : 6,
imgPathURL : '',
stationTimeout : 10,        // set to twice archive interval, in minutes
showUvGauge : true,         // false if there is no UV sensor
showSolarGauge : true,      // false if there is no solar radiation sensor
showRoseGauge : false,      // true if field WindRoseData is populated

Pour afficher les mesures en temps réel il est nécessaire de synchroniser la Raspberry Pi avec le serveur web des opendata, cela se fait en modifiant les paramètres [[RSYNC]] de weewx.conf; les modifications sont commentées pour éviter que la synchronisation échoue tant que le réseau n'est pas correctement configuré(il s'agit d'une précaution) :

    [[RSYNC]]
        #delete = 1
        #HTML_ROOT = /var/www/html/ss
        #server = stationsdata.climatetmeteo.fr
        #path = folder_name_path_on_server
        #user = opendata

6.10.4 Installation et configuration du pare-feu

La Raspberry va être exposée sur le net il est important d'être attentifs à la sécurité de cette machine. Une première méthode est de mettre en place un pare-feu mais cette opération est délicate et difficile à faire à la main; nous utiliserons donc un logiciel d'asssitance à la création de pare-feu nftables. Ce logiciel permet d'établir des règles de filtrage avec une syntaxe (relativement) intelligible dans un fichier de configuration, il se charge ensuite de construire et activer les règles de filtrage correspondant aux instructions de l'usager. L'installation du paquet se fait avec la procédure habituelle.

sudo apt install nftables

Activer nftables au démarrage par défaut:

sudo systemctl enable nftables.service

Le fichier de configuration se trouve ici /etc/nftables.conf. À titre d'exemple la configuration du pare-feu pour le projet tremplin est proposée ci-dessous commentée afin de permettre le fonctionnement par défaut de l'image. Le pare-feu doit être configuré avec les paramètres locaux de l'usager, si la configuration ne correspond pas à l'environnement réseau de la Raspberry cette dernière peut devenir inaccessible ! Soyez prudents. En cas de problème il est toujours possible d'accéder au contenu de la microSD depuis une machine GNU/linux et de modifier le fichier de configuration; si vous êtes sous un autre système d'exploitation il est possible de démarrer votre ordinateur en utilisant une clef USB GNU/linux live qui fournit un ordinateur opérationnel sans rien toucher de ce qui est installé par exemple debian live.

Propositions de fichier de configuration nftables.conf.

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
        set ALLOWED_SSH {
        type ipv4_addr
        flags interval
        # Institution : ***.***.***.0/24
        # Individual : ***.***.***.***  
        # Internal : ***.***.***.0/24, ***.***.***.0/23
        # outbound : ***.***.***.*** 
        elements = {
            ***.***.***.0/24, \
            ***.***.***.***, \
            ***.***.***.0/24, ***.***.***.0/23, \
            ***.***.***.*** 
        }
    }

    chain input {
        type filter hook input priority 0;
        policy drop;
        # established/related connections
        ct state established,related accept
        # invalid connections
        ct state invalid drop
        # loopback interface
        iif lo accept
        # ICMP & IGMP
        ip protocol icmp icmp type { echo-request, echo-reply, destination-unreachable, router-solicitation, router-advertisement, time-exceeded, parameter-problem } accept
        ip protocol igmp accept
        # SSH (port #####)
        tcp dport ##### ip saddr @ALLOWED_SSH accept
        # HTTP (ports 80, #####, #####:#####)
        tcp dport { http, https } accept
        # HTTPS (ports 443, #####)
        tcp dport { https, ##### } accept
        # mysql
        tcp dport ##### accept
        # email
        tcp dport { 25, 587 } accept        
    }
    chain forward {
        type filter hook forward priority 0;
        policy drop;
    }
    chain output {
        type filter hook output priority 0;
        policy accept;
    }
}

6.10.5 Installation et configuration de la base de données relationnelle mariadb

Par défaut weewx utilise une base sqlite, pour des raisons d'interopérabilité et de facilitation du partage des données nous installons les composants serveur et client de la base mariadb. Nous effectuons un installation par défaut, au moment de la rédaction (27/11/2020) la dernière version disponible est 10.3.25-0+deb10u1.

sudo apt install mariadb-client mariadb-server  mariadb-common

La base de données est maintenant installée, il est nécessaire de la configurer. On ajoute un mot de passe à l'utilisateur root, on ajoute ensuite un utilisateur admin avec privilèges qui évite d'utiliser root pour la configuration le mot de passe Achanger1$ est utilisé pour tous les comptes cette valeur est à changer comme son nom l'indique !

sudo systemctl stop mariadb
sudo mysqld_safe --skip-grant-tables --skip-networking &
sudo mysql -u root
FLUSH PRIVILEGES;
MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY 'AChanger1$';
MariaDB [(none)]> \q
sudo mysql -u root -p
Welcome to the MariaDB monitor.  Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.1.26-MariaDB-0+deb9u1 Debian 9.1

Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

MariaDB [(none)]> select password ('AChanger1$');
+-------------------------------------------+
| password ('AChanger1$')                   |
+-------------------------------------------+
| *695008F6BF1536D1C456BC7B1226080345359BB9 |
+-------------------------------------------+
1 row in set (0.01 sec)

MariaDB [(none)]> SET PASSWORD FOR mysql =  PASSWORD('AChanger1$');
MariaDB [(none)]> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed

MariaDB [mysql]>  CREATE USER 'admin'@'localhost' IDENTIFIED BY PASSWORD '*695008F6BF1536D1C456BC7B1226080345359BB9';
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> CREATE USER 'admin'@'%' IDENTIFIED BY PASSWORD '*695008F6BF1536D1C456BC7B1226080345359BB9';
Query OK, 0 rows affected (0.01 sec)

MariaDB [mysql]> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)

MariaDB [mysql]> select host, user, default_role, is_role, password from mysql.user;
+-----------+-------+--------------+---------+-------------------------------------------+
| host      | user  | default_role | is_role | password                                  |
+-----------+-------+--------------+---------+-------------------------------------------+
| localhost | root  |              | N       | *9FDA0930AF881812755F2746906A517D7C892BA6 |
| localhost | admin |              | N       | *695008F6BF1536D1C456BC7B1226080345359BB9 |
| %         | admin |              | N       | *695008F6BF1536D1C456BC7B1226080345359BB9 |
+-----------+-------+--------------+---------+-------------------------------------------+
3 rows in set (0.00 sec)

MariaDB [mysql]> \q
Bye

Nous souhaitons pouvoir accéder à la base depuis des machines extérieures (pour partager les données dans le cadre du projet par exemple), pour cela il est nécessaire de modifier quelques paramètres du fichier de configuration /etc/mysql/mariadb.conf.d/50-server.cnf.

sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf

Pour avoir un accès distant ajouter le paramère skip-bind-address et pour changer le port le paramètre port. Sans changement la base écoute sur le port par défaut et seulement sur localhost.

[mysqld]

port            = ****

Les options ci-dessous sont obsolètes et le remplacement par défaut en cours de test

.../...
skip-networking=0
skip-bind-address

Relancer le serveur pour vérifier que les paramètres sont priss en compte.

sudo systemctl restart mysqld
sudo systemctl status mysqld

Le système doit être chargé et fournir une réponse du type suivant.

● mariadb.service - MariaDB database server
   Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-01-19 01:27:45 CET; 6s ago
  Process: 3616 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
  Process: 3613 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
  Process: 3496 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= ||   VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ]   &&
  Process: 3491 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
  Process: 3487 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
 Main PID: 3586 (mysqld)
   Status: "Taking your SQL requests now..."
   CGroup: /system.slice/mariadb.service
           └─3586 /usr/sbin/mysqld

janv. 19 01:27:42 raspwife3 systemd[1]: Starting MariaDB database server...
janv. 19 01:27:43 raspwife3 mysqld[3586]: 2018-01-19  1:27:43 1996341248 [Note] /usr/sbin/mysqld (mysqld 10.1.26-MariaDB-0+deb9u1) start
janv. 19 01:27:45 raspwife3 systemd[1]: Started MariaDB database server.

La suite des interventions sur la base de données peut alors se faire depuis un outil à ditance comme DBeaver, pour augmenter la sécurité PHPmyadmin n'est pas installé toutes les fonctionnalités étant fournies par le client DBeaver

Pour obtenir un bon fonctionnement il est impératif de synchroniser la configuration de weewx et celle de mariadb. Ces éléments de configuration ne sont pas génériques et doivent être réalisés en fonction des besoins de chaque usager. On pourra notamment :

  • créer un nouvel utilisateur pour les données issues du collège1 (user_college1)
  • créer une nouvelle base de données dédiée aucollège1 (OpenMetEdu_College1)
  • donner tous les privilèges au nouvel utilisateur sur la nouvelle base
  • vérifier que weewx est configuré avec ces mêmes paramètres

En fonctionnement sur une base locale weewx requiert une base sqlite3 opérationnelle, les paquets sont installés par défaut mais il faut configurer la base en lançant weewx avec la configuration weewx_binding avant de lancer le dispositif opérationnel avec la base mariadb locale wx_mariadblocal_binding.

6.10.6 Mise en place d'un serveur web

Nous allons utiliser la base de données locale mariadb installée ci dessus et les outils proposés par le site météo Villarzel. Le site web est installé dans le répertoire /opt/WeatherWeb. Le fichier à configurer est /opt/WeatherWeb/mysql_connect.php

sudo mkdir /opt/WeatherWeb
sudo nano /opt/WeatherWeb/mysqli_connect.php

Le fichier est de la forme suivante en remplaçant les * par les valeurs correspondant à votre situation :

<?php
$server ="localhost:********";
$user="**********";
$pass="***********";
$db="******************";
mysql_connect($server,$user,$pass) or die ("Erreur SQL : ".mysql_error() );
mysql_select_db($db) or die ("Erreur SQL : ".mysql_error() );
?>

Il est aussi nécessaire de configurer le serveur web nginx installé par défaut en éditant le fichier /etc/nginx/sites-available/meteoRaspWife3.

sudo nano /etc/nginx/sites-available/meteoRaspWife3

Le contenu du fichier doit être du type :

server {
    listen   80 default_server;
    listen [::]:80 default_server;

    root /opt/WeatherWeb/;
    index index.html index.htm index.php;

    server_name _;

    location / {
        try_files $uri $uri/ /index.html;
        }

    location ~ \.php$ {
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        # With php7-fpm:
        fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
        fastcgi_index index.php;
        include fastcgi_params;
    }
}

Pour terminer modifier le fichier de configuration par défaut du serveur web nginx.

sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/meteoRaspWife3 /etc/nginx/sites-enabled/

6.10.7 Mise en place d'une connexion WIFI

Ce système a été conçu sans accès à un serveur DHCP pour des raisons de sécurité. Il est possible qu'il soit nécessaire d'accéder temporairement à un WIFI pour cela il est nécessaire de faire les manipulations suivantes : * ajouter un fichier de pilotage du réseau wifi * installer et configurer le driver du chipset wifi * installer et configurer un outil de gestion du wifi

Ajout du pilotage du wifi

cat > /etc/systemd/network/51-wireless.network
[Match]
Name=wlan0
Host=hostname

[Network]
DHCP=yes

[DHCP]
RouteMetric=20

Installation et configuration du driver

sudo apt install firmware-brcm80211 rfkill iw

À la date de test (18/09/2022) le module du noyau ne fonctionne pas il est nécessaie de changer de module opérationnel en ajoutant le lien suivant :

cd  /lib/firmware/brcm/
sudo ln -s ../cypress/cyfmac43430-sdio.bin brcmfmac43430-sdio.raspberrypi,3-model-b.bin

Installation et configuration dde wpasupplicant

sudo apt install wpasupplicant

Ajouter le réseau wifi dans le fichier de configuration

le fichier /etc/wpa_supplicant/wpa_supplicant-wlan0.conf doit avoir la forme :

ctrl_interface=/run/wpa_supplicant GROUP=netdev
update_config=1
p2p_disabled=1
eapol_version=1
ap_scan=1
fast_reauth=1

network={
       ssid="DDID name"
       psk="Passphrase"
}

7. Propagation des images

7.1. Organisation des services au démarrage

Tous les services et logiciels décrits ci-dessus sont opérationnels mais par défaut une partie seulement sont activés au démarrage. Il est possible de les démarrer à tout moment soit par localadm (qui dispose des droits de root via le sudo soit en ligne de commande soit en utilisant les scripts préparés à cet effet. Ci dessous le statut des services par défaut :

  • jupyter is set sudo systemctl enable jupyterhub
  • xrdp is set sudo systemctl enable xrdp
  • vncserveris set sudo systemctl enable vncserver
  • mariadb is not set sudo systemctl disable mariadb
  • domotix is not set sudo systemctl disable domoticz
  • weewx is not set sudo systemctl disable weewx
  • nginx is set sudo systemctl enable nginx
  • kodi is available

weewx and mariadb ne sont pas configurés car leur configuration dépend fortement des paramètres locaux liés à l'utilisateur et à l'usage qui en est fait. xrdp et vncserver permettent de se connecter via des serveurs de terminaux respectivement dans le monde windows ou le monde unix/linux. Une connexion vérifiée est configurée dans le fichier /etc/wpa_supplicant/wpa_supplicant-wlan0.conf. Attention dans certains cas le nom de l'interface n'est pas le nom générique wlan0 mais un nom translaté en fonction de l'adresse MAC de l'interface de type wlx############ il faut dans ce cas renommer le fichier

7.2. Clonage et mise à disposition

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.


Webographie

  1. Site principal Raspberry Pi
  2. Scripts de création de l'image
  3. Image Debian Live
  4. Comment créer une clef USB bootable Debian
  5. nmcli authorization management
  6. nmcli examples
  7. wpa_cli configuration

Commentaires