Création d'une image Debian pour Raspberry Pi3 stable (testing ou oldstable) adaptée au pilotage d'une station météo.

Par @Gérard Vidal dans
Le : révisé le :
Tags : #RaspberryPi-3, #debian, #observation, #météorologie, #climat, #nano-ordinateur, #trixie,
Google+ Linkedin Mail

Translation : false Status: draft Summary: Construire d'une image debian stable (ou debian testing ou debian oldstable) standard pour une Raspberry Pi3. Les images sont construites pour être directement utilisables dans un univers scolaire (collège) pour piloter une station météorologique gérer les données, apprendre ou enseigner des bases scientifiques au travers de la météorologie et des csiences du climat. les images sont mises à disposition sous licence GPL3.0.

Motivations

Le but de cet article est de décrire la procédure qui a permis de construire un système d'exploitation Debian "orthodoxe" (analogue à celui qui est installé sur un ordinateur ordinaire) et qui fonctionne sur une Raspberry Pi.

La motivation principale est de partager une distribution standard augmentée des logiciels nécessaires pour piloter et gérer une station météorologique et les données qu'elle fournit.

La seconde motivation est de proposer à des fins pédagogiques une explication de TOUT ce qui a été fait en toute transparence pour construire le système d'exploitation en évitant de masquer des scripts ou des commandes en ligne parfois perçues comme "magiques".


Remerciements

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


Table des matières

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. Origines et stratégie du projet

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 expose la création de l'image dédiée au pilotage de la station météo et à la gestion des données météorologiques fournies par la station.

La procédure décrite ci-dessous a été réalisée à partir d'ordinateurs fonctionnant sous système d'exploitation debian stable ou testing. si on ne dispose pas d'une telle machine 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é qui a été construit à partir du travail de drtyhlpr disponible sur le dépôt github rpi23-gen-image,
  • ensuite réalisation d'un certain nombre d'ajustemts génériques à l'image brute obtenue, dont une partie est réalisable directement sur la micro-SD montée en tznt que disque dur externe, l'autre devant être exécutée lors du premier démarrage
  • enfin configuration de chacune des fonctions attendues pour la raspberry Pi considérée

1.1.1 Construction de l'image avec le script automatisé rpiGenImage et premiers services chap. 2

Cette opération est totalement automatisée grâce aux scripts modifiés d'après le travail de drtyhlpr`sur github. La maintenance et 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), quelques profils particuliers dont celui qui a été utilisé sont disponibles (ou en cours de révision) sur le dépôt tremplin des sciences.

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/testées lors de la création. Pour faciliter son usage 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 Pi3 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'interface graphique 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 Cinq générations de RaspberryPi (rpi0-rpi2-rpi3-rpi3B+-rpi4), deux familles d'images (codage-station météo) et plusieurs 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 sont proposées pour les anciennes versions. 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 des images

Le nom des images de raspberries crées dans le projet tremplin est formé en suivant la règle suivante :

  • modèle : rpi2, rpi3, rpi3P (3 BPlus) ou rpi4
  • fonction : Met pour la raspberry weewx de pilotage de la station météo
  • distribution de debian utilisée trixie au 01-01-26
  • date : AA-MM-JJ
  • extension type de fichier : conf img ou bmap (éventuellement compression xz)

Ainsi l'mage du 1er janvier 2026 pour une RaspberryPi3 en trixie pour le pilotage d'une station météo avec weewx a pour nom : rpi3-Met-trixie_25-12-31 avec les extensions bmap, img et conf.

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

Le Travail reporté ci-dessous a été effectivement réalisé à partir d'un ordinateur linux. Windows a finalement intégré la possibilité d'utiliser linux au sein d'applications dédiée (voir l'un des nombreux tutoriaux sur comment installer une distribution linux dans windows). L'unix de MacOs est suffisamment proche de linux pour que beaucoup de choses soient aussi faisables depuis cette plateforme. Toutefois, une solution "non intrusive" consiste à utiliser une clef bootable Linux live et d'appliquer les commandes proposées, cela peut s'avérer extrêmemnt utile pour la copie de l'image sur une micro-SD.

Le dépôt Vidal rpiGenImage est un clône de rpi23-gen-image de drtyhlpr 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 sont effectuées en urgence pour respecter l'évolution des environnements. La version en ligne 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 le dossier reproduisant la hiérarchie de fichiers obtenue par clonage du dépôt Vidal rpiGenImage.

rpiGenImage/
├── bootstrap.d
│   ├── 10-bootstrap.sh
│   ├── 11-apt.sh
│   ├── 12-locale.sh
│   ├── 13-kernel.sh
│   ├── 14-fstab.sh
│   ├── 15-rpi-config.sh
│   ├── 20-networking.sh
│   ├── 21-firewall.sh
│   ├── 30-security.sh
│   ├── 31-logging.sh
│   ├── 32-sshd.sh
│   ├── 41-uboot.sh
│   ├── 42-fbturbo.sh
│   ├── 43-videocore.sh
│   ├── 44-nexmon_monitor_patch.sh
│   ├── 50-firstboot.sh
│   └── 99-reduce.sh
├── files
│   ├── apt
│      ├── 02nocache
│      ├── 03compress
│      ├── 04norecommends
│      ├── 10proxy
│      └── sources.list
│   ├── boot
│      ├── config.txt
│      └── uboot.mkimage
│   ├── dpkg
│      └── 01nodoc
│   ├── etc
│      ├── 99-com.rules
│      └── rc.local
│   ├── firstboot
│      ├── 10-begin.sh
│      ├── 20-expandroot.sh
│      ├── 21-regenerate-initramfs.sh
│      ├── 23-restart-dphys-swapfile.sh
│      ├── 30-generate-ssh-keys.sh
│      ├── 40-generate-machineid.sh
│      ├── 41-create-resolv-symlink.sh
│      ├── 42-config-ifnames.sh
│      └── 99-finish.sh
│   ├── initramfs
│      ├── crypt_unlock.sh
│      ├── expand_encrypted_rootfs
│      ├── expand-premount
│      └── expand-tools
│   ├── iptables
│      ├── flush-ip6tables.sh
│      ├── flush-iptables.sh
│      ├── ip6tables.rules
│      ├── ip6tables.service
│      ├── iptables.rules
│      ├── iptables.service
│      ├── nftables6.rules
│      └── nftables.rules
│   ├── locales
│      └── locale
│   ├── modules
│      ├── raspi-blacklist.conf
│      └── rpi2.conf
│   ├── mount
│      ├── crypttab
│      └── fstab
│   ├── network
│      ├── eth0.network
│      ├── eth.network
│      ├── host.conf
│      ├── hostname
│      ├── hosts
│      ├── interfaces
│      ├── wlan0.network
│      └── wlan.network
│   ├── sysctl.d
│      ├── 81-rpi-vm.conf
│      ├── 82-rpi-net-hardening.conf
│      ├── 83-rpi-printk.conf
│      └── 84-rpi-ASLR.conf
│   └── xorg
│       └── 99-fbturbo.conf
├── functions.sh
├── LICENSE
├── README.md
├── rpiGenImage.sh
└── templates
    ├── rpi3-Met-trixie_25-12-31.conf
    └── rpi3-Met-trixie.conf

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 6.12 pour trixie.

L'utilisateur privilégié initial (créé par défaut lors de la construction de l'image) s'appelle ens-ife dans les fichiers de configuration. Il est pourvu d'une clef ssh pour éviter l'utilisation de mots de passe (un mot de passe temporaire de secours est toutefois prévu dans la configuration). L'utilisateur privilégié ens-ife est réservé au constructeur de l'image, un autre utilisateur privilégié localadmest créé pour fournir à un tiers installateur de l'image les droits d'administration.

2.1 Raspberry Pi3 trixie

Cette image a été générée en utilisant le fichier template rpi3-Met-trixie.conf (copie de l'état du template au 31/12/2025) et le script standard rpiGenImage.sh. Ce travail est réalisé dans le cadre du maintien en conditions opéraionnelles des stations déployées lors du projet Météo Climat Tremplin pour l'enseignement des Sciences.

L'utilisation de la distribution trixie permet d'assurer la synchronisation avec la distribution Debian et suivre les changements de certains paquets utilisés pour le projet. 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 pour s'adapter à l'environnement numérique des collèges, à la maintenance à distance des raspberriesPi et à la gestion centralisée des données collectées.

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

sudo rm -r ../Images/trixie/build
sudo CONFIG_TEMPLATE=rpi3-Met-trixie.conf ./rpiGenImage.sh &> trace_25-12-31.txt

Le fichier rpi3-Met-trixie.conf contient de nombreux paramètres listés dans la documentation. Cette variété permet de construire un noyau dimensionné aux besoins, la solution proposée ici est vérifiée mais ne convient certainement pas à tous les besoins envisageables pour cette RaspberryPi.

Se reporter à la documentation de rpiGenImage 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.

télécharger le fichier rpi3-Met-trixie.conf

La trace de l'exécution est stockée dans le fichier trace_25-12-31.txt, la durée de compilation et de création de l'image 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 ...
/****/trixie/***********.img (####M) : successfully created

On dispose alors de deux fichiers : * 2025-12-31-rpi3-trixie.bmap * 2025-12-31-rpi3-trixie.img

qui peuvent être directement utilisés ou être enrichis comme proposé dans les chapitres suivants. Pour éviter toute confusion et revenir facilement au résultat de la construction on travaille avec des copies respectivement : * rpi3-Met-trixie_25-12-31.bmap * rpi3-Met-trixie_25-12-31.img

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 lecteur de carte SD, afin qu'il se comporte comme un disque externe amovible, sous linux il est en général affecté à /dev/mmcblkO. Ce nom peut varier en fonction de la configuration de la machine hôte et de la distribution linux. 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...). ATTENTION à bien vérifier la lettre correspondant au bon device

3.1 Copie de l'image sur une micro-SD

L'image brute issue du processus rpiGenImage est opérationnelle et peut donc être directement insérée dans une Raspberry Pi qui démarrera avec elle sans window manger ni display manager, le but du travail décrit par ce chapître est de fournir quelques améliorations à cette image.

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. Un des intérêts de bmaptool est de ne pas obliger à décompresser l'image si elle est fournie en version compréssée, l'autre est un gain de temps en ne copiant que les blocs effectivement utilisés. le nom de support de destination dépend de l'ordinateur utilisé (/dev/mmcblk0 ou /dev/sdg /dev/sdc... On utilisera ici sd# le # doit être remplacé par la valeur correcte du système utilisé c, d ,e f, g...).

Attention -> 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 d'écriture est bien celle qui est souhaitée pour ne pas perdre de données.

sudo bmaptool copy --bmap rpi3-Met-trixie_25-12-31.bmap rpi3-Met-trixie_25-12-31.img /dev/sd#
sudo bmaptool copy --bmap rpi3-Met-trixie_25-12-31.bmap rpi3-Met-trixie_25-12-31.img.xz /dev/sd#

S'il n'est pas possible d'utiliser bmaptool il est toujours possible de décompresser l'image (quand elle est compressée) et de la recopier avec la commande dd qui réalise une "copie brute" (ne pas utiliser de commande de copie de ficher ou un glisser déposer car la copie obtenue ne sera pas opérationnelle).

7z x rpi3-Met-trixie_25-12-31.img.xz
dd if=rpi3-Met-trixie_25-12-31.img of=/dev/mmcblk0 bs=4M

La valeur de block size (bs) dépend de beaucoup de paramètres hardware et software de l'ordinateur utilisé elle peut considérablement modifier le temps de copie, éventuellement la modifier pour améliorer les temps de transfert en fonction des propriétés de l'ordinateur utilisé.

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 qui a été ajustée à la taille de cette image augmentée de quelques mégaoctets par sécurité. Afin de pouvoir effectuer les modifications proposées ici il est impératif d'agrandir la partition pour accommoder l'espace afin de stocker les 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 ou /dev/sd# deux solutions sont proposées ici :

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 peut 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 de l'utiliser. Suivant les logiciels installés à postériori le système peut finalement 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'un des ports USB.

Une autre méthode est d'utiliser la commande fdisk en tant que superutilisateur.

sudo fdisk /dev/mmcblk0
sudo fdisk /dev/sd#

(remplacer mmcblk0 par sd# dans la suite si c'est un device sd qui est utilisé)

  • 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
    • accepter la valeurs par défaut qui correspondent au dernier bloc disponible ou alors +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 Modifications de la configuration du réseau

Tant que l'image est montée comme un disque externe, il est possible d'effectuer un certain nombre de changements qui permettront à la rasbberryPi de se connecter directement au réseau auquel elle sera connectée; pour être joignable en ssh sans besoin de lui connecter un écran.

3.3.1 Configuration du réseau

  • renommer le fichier /lib/systemd/network/10-eth0.network en 10-eth0.stdnetwork
  • ajouter le fichier /etc/systemd/network/50-wired.network avec le contenu suivant (pour fournir une IP fixe à la raspberry)
[Match]
Name=enx*

Host=[raspberrypi name]
Virtualization=no

[Network]
DHCP=no
DNS=192.168.###.###

[Address]
Address=192.168.###.###/##

[Route]
Gateway=192.168.###.###

enx* est une wildcard qui permet d'accepter n'importe quel nom de device au premier boot il est prudent d'envisager de changer ce nom après le premier démarrage quand le "vrai" nom est connu. Les "#" doivent être remplacés par les valeurs du réseau utilisé (de même le réseau en 192... peut être remplacé par un réseau en 10...)

  • ajouter un nom de DNS dans le fichier /etc/systemd/resolved.conf par exemple DNS=192.168.###.### 9.9.9.9

4. Ajustements après le premier démarrage de la Raspberry (avec écran)

L'image fournie doit booter normalement et se connecter spontanément au réseau filaire, cependant il est probable que la raspberry refuse les connexions ssh pour au moins deux raisons connues : 1. le socket sssh.socket n'est pas démarré par défaut 2. ce n'est pas le bon fuseau horaire défini dans la configuration

(ces deux points sont probablement possibles à améliorer en modifiant la configuration, cela retse à faire). Il est souhaitable (nécesaaire) de réaliser la première connexion avec un écran et un clavier connectés. Un réseau WIFI peut aussi être configuré dans l'étape suivante afin de permettre une connexion wifi pour teminer l'installation, mais l'opération est plus complexe.

  • Si la procédure de redimensionnement n'a pas été effectuée elle peut être faite maintenant ave les commandes décrites plus haut.
  • Vérifier les mises à jour sudo apt update puis sudo apt upgrade et sudo apt dist-upgrade au cas où de nouvelles versions aient été mises en ligne depuis la création de l'image
  • Vérifier la localisation sudo dpkg-reconfigure tzdata choisir les paramètres souhaités
  • Vérifier la langue sudo dpkg-recongure locales choisir les paramètres souhaités
  • Activer ssh.socket sudo enable ssh.socket
  • Vérifier l'acivation et le fonctionnement du réseau sudo systemctl status systemd-networkd et sudo systemctl status systemd-resolved
  • Si cela n'a pas été fait dans l'étape précédente ajouter les adresses des DNS
  • Pour obtenir/vérifier 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 :

    • sudo nmap -sP -n 192.168.***.0/** la valeur 192.168.***.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 192.168.***.0/** | grep -e **:**:**:**:**:** -B 2
    • En cas de besoin il est possible de changer le port de connexion, il doit être modifié dans le fichier /etc/ssh/sshd_config ET /lib/systemd/system/ssh.socket

Une fois l'adresse obtenue il est possible de se connecter via ssh depuis un ordinateur du même réseau; ssh ens-ife@192.168.***.*** (remplacer ens-ife par le nom de l'utilisateur initial choisi dans le fichier de confiuration initiale)

4.1 Ajout d'utilisateurs et gestion des droits

Lors de la création un seul utilisateur par défaut a été créé ens-ife dans les scripts par défaut, dans notre projet cet utilisateur est l'administrateur de secours et nous proposons de créer :

  • un administrateur principal localadm sudo adduser localadm,
  • un utilisateur qui gèrera l'accès à la station météo weewx sudo adduser weewx

On affecte les groupes des utilisateurs avec les commande standard linux debian.L'utilisateur localadm doit disposer des droits d'administration :

sudo adduser localadm sudo
sudo adduser ens-ife weewx

Pour des raisons de sécurité l'utilisation de mots de passe est interdite et on impose l'utilisation de clefs ssh.

sudo jed /etc/ssh/sshd_config
# dans le fichier de config.
PasswordAuthentication no  

4.2 Configuration du réseau

Le réseau est configuré en utilisant exclusivement les services systemD. les fichiers par défaut se trouvent dans /lib/systemd/network, les fichiers sont chargés dans l'odre de tri alphanuménumérique. Le système n'explore pas d'autre fichiers dès que le premier fichier permettant une configuration avec succès est chargé. Nous utilisons un fichier de configuration commençant par 50, il faut donc qu'il n'y ait aucun fichier qui porte un nom d'ordre inférieur dans /lib/systemd/network. Si cela n'a pas été fait renommer le fichier /lib/systemd/network/10-eth0.network

4.2.1 Configuration de systemd-networkd

Si les procédures précédentes ont été suivies cette raspberryPi est configurée pour prendre automatiquement le réseau filaire en prenant une adresse IP fixe car le projet impose qu'elle soit installée sur un sous-réseau isolé sans DHCP.

Si les choses ne se sont pas passées correctement, ce chapitre permet d'aller plus loin dans la confiduration manuelle. S'il n'existe pas on va d'abord créer un répertoire qui accueillera les fichiers modifiés de configuration du réseau :

sudo mkdir /etc/systemd/network

Si le fichier /etc/resolv.conf n'existe pas ou s'il s'agit d'un fichier ordinaire ajouter le lien pour le resolver, Attention il est possible que le fichier /run/systemd/resolve/resolv.conf n'existe pas, il sera créé automatiquement au redémarrage du réseau dans la configuraton choisie :

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

Pour éviter d'avoir plusieurs interfaces réseau il est souhaitable de désactiver les interfaces par défaut du système dans le répertoire /lib/systemd/network :

cd /lib/systemd/network
sudo mv 10-eth0.network 10-eth0.stdnetwork

Vérifier aussi que le répertoire /etc/systemd contient un fichier de configuration resolved.conf et par précaution ajouter le DNS Quad9 par défaut (on pourra l'enlever si la Raspberry parvient automatiquement à trouver le DNS du réseau).

4.2.2 IP fixe présélectionnée

Ajouter dans le répertoire ci-dessus le fichier 50-wired.network

sudo nano /etc/systemd/network/50-wired.network

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.

5. Ajout du logiciel weewx interface météo

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, Il est nécessaire de rajouter un fichier de configuration /etc/apt/sources.list.d/weewx.sources (cf. plus loin)

Situation au 01-01-2025 :

Le paquet debian est seulement en buster, il n'existe pas de version plus récente. On a donc deux alternatives soit installer le paquet dans une version obsolète, soit installer weewx à partir de git.

5.1 Installation du paquet debian buster

Il faut ajouter le serveur de paquets de weewx et ensuite installer le aquet weewx comme tout autre paquet.

wget -qO - https://weewx.com/keys.html | \
    sudo gpg --dearmor --output /etc/apt/trusted.gpg.d/weewx.gpg
echo "deb [arch=all] https://weewx.com/apt/python3 buster main" | \
    sudo tee /etc/apt/sources.list.d/weewx.list
sudo apt update
sudo apt install weewx

5.2 Installation à partir de la version source sur git

le tutoriel se trouve ici.

Avant d'installer weewx, que l'administrateur installe quelques paquets debian dont certains imposent d'utiliser des versions antérieures à la version actuelle. Pour faciliter cette opération on installe l'utilitaire aptitude. weewx est écrit en python et il est aussi nécessaire d'installer un gestionnaire d'environnement virtuel python, poetry a été choisi.

sudo apt install aptitude libfreetype-dev wget gpg gcc libjpeg-tools libjpeg-dev
# libfreetype-dev doit être installé et configuré avant l'installation de pythn3-pil
sudo apt install python3-poetry python3-pil 
sudo aptitude install git libc6-dev zlib1g-dev libpython3-dev libffi-dev

Se placer en user weewx

5.2.1 Créer un environnement virtuel poetry puis installer les modules requis

poetry init
This command will guide you through creating your pyproject.toml config.
Package name [weewx]:  
Version [0.1.0]:  5.2
Description []:  
Author [None, n to skip]:  n
License []:  
Compatible Python versions [>=3.13]:  
Would you like to define your main dependencies interactively? (yes/no) [yes] no
Would you like to define your development dependencies interactively? (yes/no) [yes] no
Generated file
[project]
name = "weewx"
version = "5.2"
description = ""
authors = [
    {name = "Your Name",email = "you@example.com"}
]
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
]
[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"
Do you confirm generation? (yes/no) [yes] 

Add necessary dependencies

poetry add setuptools pillow  ct3 configobj  pyserial pyusb ephem pymysql
Creating virtualenv weewx-KkoA0Itm-py3.13 in /home/weewx/.cache/pypoetry/virtualenvs
Using version ^3.4.0.post5 for ct3
Using version ^5.0.9 for configobj
Using version ^12.1.0 for pillow
Using version ^3.5 for pyserial
Using version ^1.3.1 for pyusb
Using version ^4.2 for ephem
Using version ^1.1.2 for pymysql

Updating dependencies
Resolving dependencies... (1.0s)

Package operations: 7 installs, 0 updates, 0 removals

  - Installing configobj (5.0.9)
  - Installing ct3 (3.4.0.post5)
  - Installing ephem (4.2)
  - Installing pillow (12.1.0)
  - Installing pymysql (1.1.2)
  - Installing pyserial (3.5)
  - Installing pyusb (1.3.1)

Writing lock file

Utiliser le module PIL du système

rm -r .cache/pypoetry/virtualenvs/weewx-KkoA0Itm-py3.13/lib/python3.13/site-packages/PIL
ln -s /lib/python3/dist-packages/PIL .cache/pypoetry/virtualenvs/weewx-KkoA0Itm-py3.13/lib/python3.13/site-packages/PIL

Télécharger le code depuis _git_. `git clone https://github.com/weewx/weewx`, 

Création de la configuration pour la station

Cette dernière commande dispose de nombreuses options qui permettent de configurer finement la configuration de la station sans éditer le fichier de configuration /home/weewx/weewx-data/weewx.conf. Liste des commandes :

python3 weewx/src/weectl.py station  --help

usage: weectl station create [WEEWX-ROOT]
            [--driver=DRIVER]
            [--location=LOCATION]
            [--altitude=ALTITUDE,(foot|meter)]
            [--latitude=LATITUDE] [--longitude=LONGITUDE]
            [--register=(y,n) [--station-url=URL]]
            [--units=(us|metricwx|metric)]
            [--skin-root=DIRECTORY]
            [--sqlite-root=DIRECTORY]
            [--html-root=DIRECTORY]
            [--user-root=DIRECTORY]
            [--examples-root=DIRECTORY]
            [--no-prompt]
            [--config=FILENAME]
            [--dist-config=FILENAME]
            [--dry-run]

       weectl station reconfigure
            [--driver=DRIVER]
            [--location=LOCATION]
            [--altitude=ALTITUDE,(foot|meter)]
            [--latitude=LATITUDE] [--longitude=LONGITUDE]
            [--register=(y,n) [--station-url=URL]]
            [--units=(us|metricwx|metric)]
            [--skin-root=DIRECTORY]
            [--sqlite-root=DIRECTORY]
            [--html-root=DIRECTORY]
            [--user-root=DIRECTORY]
            [--weewx-root=DIRECTORY]
            [--no-backup]
            [--no-prompt]
            [--config=FILENAME] 
            [--dry-run]

       weectl station upgrade
            [--examples-root=DIRECTORY]
            [--skin-root=DIRECTORY]
            [--what ITEM [ITEM ...]
            [--no-backup]
            [--yes]
            [--config=FILENAME]
            [--dist-config=FILENAME]]
            [--dry-run]

Manages the station data area, including the configuration file and skins.

options:
  -h, --help            show this help message and exit

Which action to take:
  {create,reconfigure,upgrade}
    create              Create a new station data area, including a configuration file.
    reconfigure         Reconfigure an existing station configuration file.
    upgrade             Upgrade any combination of the examples, utility files,
                        configuration file, and skins.
`poetry env activate`
python3 weewx/src/weectl.py station create

Sur le \home du user weewx il existe maintenant un dossier weewx-data qui contient le logiciel weewx :

weewx-data/
├── bin
│   └── user
├── examples
│   ├── alarm.py
│   ├── basic
│   ├── colorize
│   ├── fileparse
│   ├── lowBattery.py
│   ├── mem.py
│   ├── pmon
│   ├── tests
│   ├── vaporpressure.py
│   └── xstats
├── scripts
│   └── setup-daemon.sh
├── skins
│   ├── Ftp
│   ├── Mobile
│   ├── Rsync
│   ├── Seasons
│   ├── Smartphone
│   └── Standard
├── util
│   ├── apache
│   ├── default
│   ├── i18n
│   ├── import
│   ├── init.d
│   ├── launchd
│   ├── logrotate.d
│   ├── logwatch
│   ├── newsyslog.d
│   ├── nginx
│   ├── rsyslog.d
│   ├── solaris
│   ├── syslog.d
│   ├── systemd
│   ├── tmpfiles.d
│   └── udev
└── weewx.conf

On ajoute une base de données sqlite par defaut elle estinstallée dans /home/weewx/weewx-data/archive/ -> weewx.sdb

python3 weewx/src/weectl.py database create 

5.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 weectl.py extension.

Depuis le 01-06-2025 le dépôt de gjr80 a disparu les ressources ne sont plus accessibles, la procedure obsolète ci-dessous est conservée au cas où les dépôts seraient repris.

sudo su weewx
cd
mkdir -p Logiciels/Weewx/Skins
cd Logiciels/Weewx/Skins
wget -P . https://github.com/gjr80/weewx-highcharts/releases/download/v0.3.2/hfw-0.3.2.tar.gz
wget -P . https://github.com/gjr80/weewx-steelseries/releases/download/v2.7.6/steelseries-2.7.6.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 weectl extension --install=hfw-0.3.2.tar.gz
sudo weectl extension --install=steelseries-2.7.6.tar.gz
sudo weectl extension --install=rtgd-0.4.2.tar.gz

cd /var/www/html/
sudo chown -R weewx.weewx weewx
cd weewx
sudo mkdir ss
sudo chown -R weewx.weewx ss
sudo mkdir seasons
sudo chown -R weewx.weewx seasons

Workaround : On utilise les dernières versions mises en ligne par gjr80 et recopiées dans les stations opérationnelles.

scp hfw-0.3.2.tar.gz steelseries-2.7.6.tar.gz  weewx@192.168.###.###:/home/weewx/Logiciels/Weewx/Skins

python3 weewx/src/weectl.py extension  --help
usage: weectl extension list
            [--config=FILENAME]

       weectl extension install (FILE|DIR|URL)
            [--config=FILENAME]
            [--dry-run] [--yes] [--verbosity=N]

       weectl extension uninstall NAME
            [--config=FILENAME]
            [--dry-run] [--yes] [--verbosity=N]

Manages WeeWX extensions

options:
  -h, --help            show this help message and exit

Which action to take:
  {list,install,uninstall}
    list                List all installed extensions
    install             Install an extension contained in FILE (such as pmon.tar.gz),
                        directory (DIR), or from an URL.
    uninstall           Uninstall an extension

Il est nécessaire de faire les installations en tant que weewx dans l'environnement virtuel

sudo su weewx
`poetry env activate`
python3 weewx/src/weectl.py extension install Logiciels/Weewx/Skins/hfw-0.3.2.tar.gz
python3 weewx/src/weectl.py extension install Logiciels/Weewx/Skins/steelseries-2.7.6.tar.gz 
deactivate
exit

5.4 Installation du daemon systemd et modification de udev/rules.d

sudo cp /home/weewx/weewx-data/util/systemd/weewx.service /etc/systemd/system

Ajouter dans /etc/udev/rules.d un fichier de configuration permettant aux utilisateurs du groupe weewx d'acceder au port USB relié à la console de la station météo.

cat /etc/udev/rules.d/40-usbweewx.rules
# make any te923 station connected via usb accessible to non-root
SUBSYSTEM=="usb", ATTRS{idVendor}=="1130", ATTRS{idProduct}=="6801", ACTION=="add", GROUP="weewx", MODE="0664"

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

5.5 Modifications du fichier de configuration /home/weewx/weewx-data/weewx.conf

Les éléments de configuration sont intégrés au fichier /home/weewx/weewx/weewx-data/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 dans le dossier /home/weewx/weewx-data/skins. Éditer le fichier /home/weewx/weewx-data/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 Activation de la caméra raspberry Pi

Si outre la station, la raspberry utilise une webcam ou la camera standard.

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 immobilise des ressources.

6.1 Détection de la caméra

Pour détecter la camera il est nécesaire de modifier la configuration du fichier de boot avec la commande sudo nano /boot/firmware/config.txt la fin du fichier est recopiée ci-dessous.

gpu_mem=16
initramfs initramfs-4.13.16-v7 followkernel
dtparam=i2c_arm=on
dtparam=spi=on

La modifier pour lui donner l'aspect suivant

initramfs initramfs-4.13.16-v7 followkernel
dtparam=i2c_arm=on
dtparam=spi=on

gpu_mem=16 # Comment this line when activating the camera to provide more memory
# camera activation
# To activate camera at least uncomment the two following lines
# AND comment the line above gpu_mem=16
#
#start_x=1             # essential
#gpu_mem=128           # at least, or maybe more if you wish
#

Pour activer la camera il faut commenter la ligne gpu_mem=16 et décommenter les deux lignes start_x=1 et gpu_mem=128 puis impérativement rebooter. Une fois le reboot effectué si la caméra est connectée elle apparait aux côtés des autres périphériques sous le nom /dev/vchiq

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

cd userland
./buildme

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 !$

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

7 Reconfiguration du réseau filaire

Comme nous l'avons vu plus haut l'interface réseau filaire est configurée de façon générique pour se connecter à un réseau particulier sur ue adresse précise. Cette connexion est suffisante pour réaliser toutes les configurations proposées dans ce document. La mise en place d'une configuration avancée adaptée à une interface particulière et un réseau particulier "fige" la situation et la Raspberry ne peut pas se connecter à un autre réseau.

Si l'image en cours de création est destinée à être partagée avec d'autres usagers qui la cloneront il est recommandé de ne pas configurer le réseau 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

Pour configurer le réseau filaire il faut supprimer la désignation générique de l'interface (avec une * dans le nom) et la remplacer par la valeur construite au boot à partir de l'adresse Mac (cette valeur est unique et désigne une et une seule Raspberry Pi "physique" l'image sera donc inadaptée à toute autre Raspberry Pi !). On obtient le nom de l'interface réseau par la commande ip token.

Si la valeur est eth0 c'est que la raspberrypi a été construite avec une version antérieure des scripts 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

Le passage en systemD est parfois encore incomplet et quelques manipulations suppémentaires sont alors nécessaires. Par exemple le paquet systemd-resolved n'est pas forcément installé par défaut. 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 stop networking
sudo systemctl disable networking
sudo systemctl restart systemd-networkd
sudo systemctl restart systemd-resolved
sudo apt purge ifupdown
sudo systemctl list-unit-files | grep enabled | grep systemd-

Si besoin

sudo systemctl enable systemd-networkd
sudo systemctl enable systemd-resolved

redémarrer pour vérifier la configuration réseau

sudo systemctl reboot

8 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 dpkg -l nftables
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 le suelette de 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
        # ENS de lyon : 
        # Gerard Vidal :   
        # Intenal : 
        # outbound :  
        elements = {
            ***.***.***.***/24, \
        ***.***.***.***/##
        }
    }

    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;
    }
}

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

dpkg -l mariadb-client mariadb-server
sudo apt install mariadb-client mariadb-server
# En cas de problème de dépendances
sudo aptitude install mariadb-client mariadb-server

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 mysql -u root
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)]> 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]> UPDATE user SET password=PASSWORD("*695008F6BF1536D1C456BC7B1226080345359BB9") WHERE User='root';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

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            = ****
.../...
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.

10 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.0-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/

11. Configuration personnalisée de la Raspberry Pi par site

Changement du port ssh et suppression du login par mot de passe (après avoir vérifié le fonctionnement du login par clef ssh) modifier le fichier sshd_config.

sudo jed /etc/ssh/sshd_config

Port=******
.../...
PasswordAuthentication no

Modification de l'aspect de l'invite de commandes et alias de base pour root afin de retrouver un comportement identique à la console utilisateur et afficher en rouge l'invite lorsqu'on passe en mode administration.

sudo su
cd
jed .bashrc

# PS1='${debian_chroot:+($debian_chroot)}\h:\w\$ '
PS1='${debian_chroot:+($debian_chroot)}\[\033[01;31m\]\u\[\033[00m\][\w]\[\033[01;31m\]\h.$

# umask 022

# You may uncomment the following lines if you want `ls' to be colorized:
export LS_OPTIONS='--color=auto'
eval "$(dircolors)"
alias ls='ls $LS_OPTIONS'
alias ll='ls $LS_OPTIONS -l'
alias la='ls $LS_OPTIONS -lA'
#

12. Propagation des images par clonage

12.1. Changement des noms et des paramètres locaux

Dans le cadre du réseau météo il est nécessaire de nommer le système d'exploitation en fonction de l'établissement où il doit être installé. Les modifications suivantes doivent être effectuées. Le nom par défaut est raspi3W il est nécessaire de changer son nom dans les fichiers suivants pour obtenir un changement opérationnel du nom de la machine.

  • Mise à jour des fichiers de nommage /etc/hosts et /etc/hostname
  • Mise à jour des fichiers de gestion du réseau 50-wired.network
  • Mise à jour du pare-feu /etc/nftables.conf
  • Mise à jour du fichier de configuration de weewx
  • Changement des mots de passe
sudo jed /etc/hosts
sudo jed /etc/hostname
sudo jed /etc/systemd/network/50-wired.network # ou 50-wired.network-std
sudo jed /etc/nftables.conf
sudo jed /etc/weewx/weewx.conf

12.2 Copie et conversion

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. 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/sde of=rpi3-Met-trixie_26-01-05.img bs=64M conv=sparse count=3200
sudo dd if=/dev/mmcblk0 of=rpi3-Met-trixie_26-01-05.img bs=64M conv=sparse count=3200
bmaptool create -o rpi3-Met-trixie_26-01-05.bmap rpi3-Met-trixie_26-01-05.img
7z a -txz rpi3-Met-trixie_26-01-05.img.xz rpi3-Met-trixie_26-01-05.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

Comments !