Mise en route de l'image pour Raspberry Pi ENS-IFÉ pour piloter une station météo et partager les données en ligne.

Motivations

Le but de cet article est de décrire la procédure de mise en oeuvre d'une Raspberry Pi utilisant l'image proposée par le projet Tremplin de l'ENS-IFÉ pour piloter une station météo. Il est impératif de réaliser quelques réglages dépendant de l'environnement où sera utilisée la station et la Raspberry Pi avant de pouvoir démarrer, ces réglages ne pouvant être faits sur l'image générique et l'automatisation n'étant pas envisageable pour la plupart des paramètres. Pour obtenir les informations techniques sur l'image utilisée voir le blog décrivant la création de l'image et la page de présentation des images disponibles. Le processus est détaillé ici de la récupération en ligne de l'image à la mise à disposition de données.

Cet article décrit l'utilisation de l'image "raspberry Pi3 stretch pour piloter une station météo" 2018-03-07-rpi3-stretchW.img


Remerciements

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


Sommaire

  1. Récupération de l'image en ligne et copie sur la micro-SD de la Raspberry Pi

    a. Formattage de la SD sous GNU/Linux

    b. Formattage de la SD avec un autre OS

    c. Téléchargement de l'image mise à disposition

    d. Préparation de la micro-SD

    • Copier l'image téléchargée sur la microSD sous linux
    • Copier l'image téléchargée sur la microSD (autre OS)
  2. Modifications sur la SD pour que la Raspberry Pi puisse se connecter au réseau

  3. Premier démarrage et configuration opérationnelle de la Raspberry Pi

    a. Modifications des paramètres de la base de données locale

    • utilisateurs connus
    • interfaces réseau disponibles
    • Nom de la Raspberry
    • Modification du pare-feu

    b. Configuration du logiciel d'interface avec la station météorologique : weewx

    a. Modifications des paramètres de la base de données locale


Téléchargements

  1. image proposée par le projet Tremplin de l'ENS-IFÉ
  2. g_vidal rpi23-gen-image
  3. logiciel weewx
  4. Images raspberryPi du projet Tremplin

1. Récupération de l'image en ligne et copie sur la micro-SD de la Raspberry Pi

La procédure proposée ici est homologue de celle utilisée pour installer n'importe quel système d'exploitation pour une Raspberry Pi. Le principe est de recopier un système d'exploitation de la famille Linux Debian sur une micro-SD qui est l'espace de stockage de la Raspberry Pi. Avant d'effectuer une instalation nous allons vérifier que la carte micro-SD est correctement formattée. Le travail est effectué avec une autre Raspberry déjà opérationnelle (et un adaptateur USB-SD pour lire la carte micro-SD) ou une autre machine debian disposant d'un lecteur de cartes SD.

1.a Formattage de la SD sous GNU/Linux

Formatter la micro-SD avec une seule partition FAT32 occupant la totalité de l'espace disponible. Attention si la mico-SD contient des données que vous souhaitez conserver sauvegardez-les AVANT le formattage.

sudo gparted

Si la carte n'est pas montée automatiquement utiliser la commande dmesg pour obtenir des nformations sur l'erreur; si le message est du type :

mmc0: cannot verify signal voltage switch
mmc0: error -110 whilst initialising SD card

c'est que la carte est physiquement abimée, la meilleure solution est d'en prendre une neuve ! Toutefois en cas de besoin absolu il est possible de tenter d'utiliser un adaptateur mico-SD-> USB pour outrepasser les alertes et forcer l'utilisation à vos risques et périls; dans beaucoup de cas la carte est montée comme une clef USB, ce qui supprime quelques tests automatiques et permet d'effectuer les opérations proposées ci-dessous. La micro-SD construite a des chances de fonctionner correctement (mais ce n'est pas du tout garanti il s'agit vraiment d'une situation de secours si vous ne disposez pas d'une carte neuve opérationnelle).

1.b Formattage de la SD avec un autre OS

Windows ne reconnait pas et ne sait pas traiter les systèmes de fichiers ext4, il est donc nécessaire d'installer sur votre ordinateur un logiciel fournissant cette fonctionnalité, par exemple SD Card Formatter) voir image ci-dessous.

SD Card Formatter

1.c Téléchargement de l'image mise à disposition

L'image Raspberry Pi3 se trouve sur le serveur de media du projet Tremplin des Sciences. Les chiffres YYYY-MM-DD représentent la date de création à paramétrer en fonction de ce qui est disponible en ligne pour obtenir ce numéro se connecter avec un navigateur web à l'adresse Raspberry Pi3 http://mediaserv.climatetmeteo.fr/images/RaspBerry/. Pour télécharger l'image il suffit de copier coller le nom de l'image dans la barre d'adresse et le téléchargement sera lancé, ou alors utiliser la commande linux wget ou curl.

wget http://mediaserv.climatetmeteo.fr/images/RaspBerry/DebianStretchPi3W/2018-03-07-rpi3-stretchW.bmap 
wget http://mediaserv.climatetmeteo.fr/images/RaspBerry/DebianStretchPi3W/2018-03-07-rpi3-stretchW.img.xz  

1.d Préparation de la micro-SD

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

L'image est en format compressé (.xz), si on utilise l'outil bmaptool proposé ici il n'est pas nécessaire de la décompresser pour la copier on utilise donc :

  • le fichier avec l'extension bmap qui est un fichier de configuration permettant une copie accélérée par l'utilitaire bmap-tool (ce fichier est inutile si vous utilisez un sytème d'exploitation moins puissant ne sachant pas exploiter le descriptif de l'image)

  • l'image compressée avec l'extension .img.xz gait une taille de l'ordre de 2.2 Go alors que la taille originelle est l'ordre de 7.5Go et l'extension .img.

L'utilitaire bmap-tools utilise la description de l'image et raccourcit le temps nécessaire en ne copiant pas les blocs vides et en optimisant la taille des blocs copiés. Ci-dessous exemple de trace de la copie en utilisant un adapteur USB (/dev/sdc) avec un adaptateur SD on aurait un autre device cible (/dev/mmcblk0) pour la copie. les commandes ci-dessous sont exécutées depuis le répertoire où ont été téchargés les fichiers. Attention bien copier l'intégralité de la ligne de commande si un ascenseur horizontal apparait au pied.

sudo bmaptool copy --bmap 2018-03-07-rpi3-stretchW.bmap 2018-03-07-rpi3-stretchW.img.xz /dev/mmcblk0 
bmaptool: info: block map format version 2.0
bmaptool: info: 1894400 blocks of size 4096 (7.2 GiB), mapped 1806336 blocks (6.9 GiB or 95.4%)
bmaptool: info: copying image '2018-03-07-rpi3-stretchW.img.xz' to block device '/dev/mmcblk0' using bmap file '2018-03-07-rpi3-stretchW.bmap'
bmaptool: info: 100% copied
bmaptool: info: synchronizing '/dev/mmcblk0'
bmaptool: info: copying time: 10m 47.4s, copying speed 10.9 MiB/sec

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

L'image téléchargée depuis le site est en format compressé (img.xz) elle ne doit pas être recopiée sous forme compressée, pour la décompresser utiliser un logiciel de décompression come par exemple 7z.

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

Logiciel Win32diskmanager

2. Modifications sur la SD pour que la Raspberry Pi puisse se connecter au réseau

Les modifications ci-dessous sont cruciales pour la connexion au réseau de l'image lors de son premier démarrage, elles doivent être faites directement sur la SD depuis un environnement capable de lire les partitions ext4 (si on a utilisé une machine linux pour faire la copie il suffit de continuer à l'utliser). Éditer le fichier /etc/systemd/network/50-wired.network de la micro-SD Attention à ne pas modifier le /etc/systemd/network/50-wired.network de l'ordinateur utilisé pour faire la configuration s'il existe. Par défaut le fichier contient des *** à la place des numéros de l'IP fixe qui sera utilisée, et un domaine local est utilisé 192.168.***.***.

[Match]
Name=enx*

[Network]
DHCP=no
Address=192.168.***.***/24
Gateway=192.168.***.***
DNS=192.168.***.***

Il doit être transformé avec l'adresse IP fixe choisie pour la Raspberry Pi, l'adresse de la passerelle du serveur de noms de noms du réseau qui va l'accueillir. Dans notre exemple la Raspberry Pi est installée dans le réseau 10.5.10.0/24 à l'adresse 10.5.10.111/24 la passerelle et le DNS se trouvent à l'adresse 10.5.10.253 qui conduit au fichier suivant :

[Match]
Name=enx*

[Network]
DHCP=no
Address=10.5.10.111/24
Gateway=10.5.10.253
DNS=10.5.10.253

tant que l'adresse de l'interface réseau n'est pas connue on conserve le nom d'adresse générique enx*.

Éditer ensuite le fichier /etc/hosts pour mattribuer la bonne adresse au nom de la Raspberry pi (encore par défaut pour le moment.

127.0.0.1       localhost
10.5.10.111       raspwife3

::1             localhost ip6-localhost ip6-loopback
ff02::1         ip6-allnodes
ff02::2         ip6-allrouters

L'image est pré-configurée pour qu'elle puisse démarrer et se connecter au réseau filaire. Cette image n'est pas configurée pour utiliser le réseau WIFI pour des raisons de sécurité (contrôle du traffic sur une IP fixe), si vous savez ce que vous faites et s'il est nécessaire d'utiliser le WIFI voir la configuration de l'image tous terrains

3. Premier démarrage et configuration opérationnelle de la Raspberry Pi

Démonter et retirer la micro-SD puis l'installer dans la Raspberry Pi, connecter au réseau filaire puis brancher l'alimentation, la Raspberry démarre et se connecte avec l'adresse fixe qui lui a été fournie. Si aucune erreur n'a été faite dans la pré-configuration on se connecte avec la commande suivante (dans cet exemple la Raspberry se trouve à l'IP 10.5.10.111) on fournit le mot de passe par défaut "AChanger1$" et on accède à la Raspberry.

ssh localadm@10.5.10.111


localadm@10.5.10.111's password: 
Linux raspwife3 4.13.16-v7 #1 SMP Sun Jan 14 17:46:47 CET 2018 armv7l

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

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

3.a Changement de nom des mots de passe, finnalisation du réseau et du système

La Raspberry démarre avec le nom générique raspwife3 et le même mot de passe générique pour tous les utilisateurs et tous les services sauf moon. Pour réaliser les modifications de configuration il est utile d'avoir un aperçu de l'état de la Raspberry puis en fonction des informations recueillies de faire les modifications nécessaires.

utilisateurs connus

Liste des utisateurs (seule les utilisateurs créés pour le projet seront touchés.

localadm@raspwife3:~$ cat /etc/passwd

.../...

ens-ife:x:1000:1000:ens-ife,,,:/home/ens-ife:/bin/bash
localadm:x:1001:1003:admin local,,,:/home/localadm:/bin/bash
weewx:x:1002:1004:weewx user,,,:/home/weewx:/bin/bash
moon:x:1003:1005:guest user,,,:/home/moon:/bin/bash
mysql:x:107:113:MySQL Server,,,:/nonexistent:/bin/false

On conserve à moon son mot de passe par défaut et on change les mots de passe de localadm, ens-ife et weewx.

localadm@raspwife3:~$ sudo passwd ens-ife
Entrez le nouveau mot de passe UNIX : 
Retapez le nouveau mot de passe UNIX : 
passwd: password updated successfully
localadm@raspwife3:~$ sudo passwd localadm
Entrez le nouveau mot de passe UNIX : 
Retapez le nouveau mot de passe UNIX : 
passwd: password updated successfully
localadm@raspwife3:~$ sudo passwd weewx
Entrez le nouveau mot de passe UNIX : 
Retapez le nouveau mot de passe UNIX : 
passwd: password updated successfully

En cas de besoin pour des connexions sécurisées ajouter les cls ssh des utilisateurs dans le répertoire .ssh des usage(par exemple weewx pour accéder à la base de données).

interfaces réseau disponibles

Liste des interfaces disponibles, on n'utilise pas l'interface wifi wlan0, on édite le fichier /etc/systemd/network/50-wired.network.

localadm@raspwife3:~$ ip token
token :: dev enxb123eb4b567d
token :: dev wlan0

Le début du fichier devient :

[Match]
Name=enxb123eb4b567d

Il est possible pour des raisons de sécurité de choisir pour les connexions ssh un autre port que le port 22 en modifiant le paramètre port du fichier /etc/ssh/sshd_config.

Port xxxxx

Nom de la Raspberry

On obtient le nom de la Raspberry par la commande hostname, on cherche ensuite toutes les occurrences de ce nom dans le répertoire de confguration /etc

localadm@raspwife3:~$ hostname
raspwife3

localadm@raspwife3:~$ sudo rgrep -e 'raspwife3' /etc

.../...

/etc/hosts:10.5.10.111       raspwife3
/etc/hostname:raspwife3

On modifie les fichiers trouvés en remplaçant raspwife3 par le nom choisi pour cette Raspberry (ici deux fichiers doivent être modifiés). Pour terminer on réalise une mise à jour du système et on vérifie la langue ansi que le fuseau horaire utilisés.

sudo nano /etc/hosts
sudo nano /etc/hostname
localadm@raspwife3:~$ sudo apt-get update
Ign:1 http://debian.mirrors.ovh.net/debian stretch InRelease
Réception de:2 http://debian.mirrors.ovh.net/debian stretch-updates InRelease [91,0 kB]
Réception de:3 http://security.debian.org stretch/updates InRelease [63,0 kB]
Réception de:4 http://debian.mirrors.ovh.net/debian stretch Release [118 kB]
272 ko réceptionnés en 2s (94,1 ko/s)                       
Lecture des listes de paquets... Fait
localadm@raspwife3:~$ sudo apt-get upgrade
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Calcul de la mise à jour... Fait
0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour.
localadm@raspwife3:~$ sudo apt-get dist-upgrade
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances       
Lecture des informations d'état... Fait
Calcul de la mise à jour... Fait
0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour.

Rien à faire ce qui est logique puisque cet article a été écrit peu de temps après avoir construit l'image. La commande suivante permet de reconfigurer les langues français-UTF8 et anglais-UTF8 dans cet exemple. Puis fuseau horaire Europe/Paris.

localadm@raspwife3:~$ sudo dpkg-reconfigure locales
Generating locales (this might take a while)...
  en_US.UTF-8...
 done
  fr_FR.UTF-8... done
Generation complete.

localadm@raspwife3:~$ sudo dpkg-reconfigure tzdata

Current default time zone: 'Europe/Paris'
Local time is now:      dimanche 21 janvier 2018, 17:09:29 (UTC+0100).
Universal Time is now:  Sun Jan 21 16:09:29 UTC 2018.

Modification du pare-feu

Cette Raspberry va être exposée sur le réseau pour diffuser les mesures effectuées, il est souhaiable de configurer le pare-feu afin de protéger les accès aux services qui vont être mis en place. Un fichier pré-configuré a été installé pour utiliser le logiciel firehol il faut remplacer les *** par les paramètres du réseau local utilisé. On édite le fichier /etc/firehol/firehol.conf.

sudo jed /etc/firehol/firehol.conf

Dans l'exemple ci_dessous on a utilisé des xxx pour indiquer le remplacement des étoiles et ne pas afficher les valeurs utilisées par la Raspberry de test.

# FireHOL configuration file
#
# See firehol.conf(5) manual page and FireHOL Manual for details.
#
# This configuration file will allow all requests originating from the
# local machine to be send through all network interfaces.
#
# No requests are allowed to come from the network. The host will be
# completely stealthed! It will not respond to anything, and it will
# not be pingable, although it will be able to originate anything
# (even pings to other hosts).
#

version 6

# Accept all client traffic on any interface
#interface any world
#   client all accept
#        server all accept

## Configure log
FIREHOL_LOG_PREFIX="firehol: "

#ENABLE_IPV6=0

# Configure AUthorized IPs
ENS_IFE="xxx.xxx.xxx.0/22 xxx.xxx.xxx.0/21"
#ETAB="192.168.xxx.0/24"
INTERNE=192.168.xxx.0/24
# Rescue 
RESCUE="xxx.xxx.xxx.xxx"

#known_ips="${ENS_IFE} ${INTERNE} ${ETAB} ${RESCUE}"
known_ips="${ENS_IFE} ${INTERNE}  ${RESCUE}"
public_ip=192.168.xxx.xxx

# Configure client and server
server_http_ports="tcp/80 tcp/xxxxx tcp/xxxxx:xxxxx"
server_https_ports="tcp/xxxxx"
server_ssh_ports="tcp/xxxxx"
#server_ftp_ports="tcp/****"
client_http_ports="default"

## Open mysql port xxxxx 
server_mysql_ports="tcp/xxxxx"
##

ipv4 interface enxxxxxxxxxxx KnownMachines src "${known_ips}" dst ${public_ip}
  policy reject
   protection strong
   server "icmp ssh http https mysql netbios_ns" accept
   client all accept

ipv4 interface enxxxxxxxxxxx restOfTheNet src not "${UNROUTABLE_IPS} ${known_ips}" dst  ${public_ip}
   policy reject
   protection strong
   server "icmp http" accept
   client all accept

Le système doit maintenant être correctement configuré, avant de passer à la configuration des logiciels et des services on effectue un redémarrage pour vérifier que toutes les modifications ont abouti à ce qui est souhaité avec la commande sudo systemctl reboot.

3.b Configuration du logiciel d'interface avec la station météorologique : weewx

Le logiciel weewx permet de gérer un grand nombre de stations météorologiques, nous utiliserons dans cet exemple une statation TFA Meteotime Duo. La préconfiguration de l'image installe weewx comme un service activé par défaut. Pour vérifier l'état du service deux commandes sont possibles l'ancienne en voie de disparition sudo service weewx status et la nouvelle en cours de déploiement sudo systemctl status weewx.

sudo systemctl status weewx
● weewx.service - LSB: weewx weather system
   Loaded: loaded (/etc/init.d/weewx; generated; vendor preset: enabled)
   Active: active (exited) since Sun 2018-01-21 17:11:22 CET; 1h 11min ago
     Docs: man:systemd-sysv-generator(8)
  Process: 1607 ExecStart=/etc/init.d/weewx start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/weewx.service

On arrête le système avec la commande sudo systemctl stop weewx

localadm[~] raspiw1-ife-€ :  sudo systemctl stop weewx
localadm[~] raspiw1-ife-€ :  sudo service weewx status
● weewx.service - LSB: weewx weather system
   Loaded: loaded (/etc/init.d/weewx; generated; vendor preset: enabled)
   Active: inactive (dead) since Sun 2018-01-21 18:26:00 CET; 3s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 2506 ExecStop=/etc/init.d/weewx stop (code=exited, status=0/SUCCESS)
  Process: 1607 ExecStart=/etc/init.d/weewx start (code=exited, status=0/SUCCESS)

La connection à la station météorologique est maintenant interrompue il est possible de modifier le fichier de configuration /etc/weewx/weewx.conf, les modifications des éléments suivants sont effectuées

    [[RSYNC]]
        server = xxxxx.xxxxx..fr
        path = /xxxxx/xxxxx/xxxxx
        user = xxxxxx

[StdReport]

    # Where the skins reside, relative to WEEWX_ROOT
    SKIN_ROOT = /etc/weewx/skins

    # Where the generated reports should go, relative to WEEWX_ROOT
    HTML_ROOT = /var/www/html/weewx

    # The database binding indicates which data should be used in reports.
    data_binding = wx_mariadbextern_binding

    [[archive_mysql]]
        database_type = MySQL
        database_name = MABase

    [[MySQL]]
        driver = weedb.mysql
        host = stationsdata.climatetmeteo.fr
        user = Mon_user
        password = MonMotdePasse
        port = xxxxx

On redémarre le service weewx qui va se connecter à la base de données fournie dans le fichier de configuration et si besoin créer toutes les tables nécessaires pour le bon fonctionnement du dispositif et l'enregistrement des données.

localadm[~] raspiw1-ife-€ :  sudo systemctl start weewx

3.c Modifications des paramètres de la base de données locale

La base mariadb est disponible mais sommairement configurée. en l'état elle ne peut pas être utilisée comme lieu de stockage pour le logiciel weewx, de plus il est impératif d changer les mots de passe des utilisateurs déjà configurés et ajouter les utilisateurs nécessaires au fonctionnement du dsispositif station-météo-nano-ordintaeur. L'ajout d'utilisateurs a déjà été présenté dans l'article Comment créer une image Debian pour Raspberry Pi 2 ou 3, stretch ou buster adaptée à vos besoins (exemple Météo-Climat)., la modification des mots de passe est illustrée ci-dessous.

MariaDB [(none)]> SET PASSWORD FOR admin = '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
Query OK, 0 rows affected (0.00 sec)


MariaDB [(none)]> SET PASSWORD FOR admin@localhost = '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> SET PASSWORD FOR admin@127.0.0.1 = '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx';
Query OK, 0 rows affected (0.00 sec)

MariaDB [(none)]> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Pour que les échanges entre la base de données et ses clients les paramètres du pare-feu doivent nécesairement correspondre aux paramètres de configuration de mariadb en particulier les numéros de port des paaramètres suivants

server_mysql_ports="tcp/xxxxx" du fichier /etc/firehol/firehol/conf
 et
port            = xxxxx du fichier  /etc/mysql/mariadb.conf.d/50-server.cnf

Pour raccorder cette base au logiciel weewx modifier le paramètre /etc/weewx/weewx.conf en affectant la base utilisée à la base locale.


Webographie

  1. Création de l'image
  2. présentation des images disponibles
  3. weewx

Commentaires