Comment créer une image Debian pour Raspberry Pi 2 ou 3, stretch ou buster adaptée à vos besoins (exemple Météo-Climat)

Motivations

Le but de cet article est de décrire la procédure technique conduisant à un système d'exploitation Debian "orthodoxe" (totalement analogue à celui qui serait installé sur un ordinateur ordinaire) fonctionnant sur une Raspberry Pi. La motivation principale est de disposer d'une distribution standard Debian comparable à toutes celles qui fonctionnent sur d'autres appareils que des raspberries et aussi de proposer une explication de TOUT ce qui est fait sans cacher à l'usager des commandes parfois perçues comme magiques et dans la plupart des cas conduisant à une incompréhension toatale de leurs conséquences.

Cet article décrit la construction de quatre images apparentées, chacune dédiée à un mode de fonctionnement particulier :

  • Une image raspberry Pi3 stretch pour apprendre à coder
  • Une image raspberry Pi2 stretch pour apprendre à coder
  • Une image raspberry Pi3 stretch pour piloter une station météo et partager des données
  • Une image raspberry Pi3 buster tous terrains permettant de suivre tous les aspects du projet et de préparer les migrations à venir

Remerciements

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


Sommaire

  1. Stratégie adoptée

    a. Trois phases de construction

    b. Deux générations de RaspberryPi (rpi2 rpi3), deux familles d'images (codage station météo) et deux distributions (stretch buster)

    c. Mode de classement et moyen de retrouver une information

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

    a. Raspberry Pi2 Stretch

    b. Raspberry Pi3 Stretch

    c. Raspberry Pi3 Stretch sans serveur graphique

    d. Raspberry Pi3 Buster

  3. Ajustements manuels génériques

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

    b. ajustement de la taille de l'image

    c. Configuration du réseau

    d. Configuration du logiciel de pilotage des stations météorologiques

    e. Ajout de l'affichage de pages web "standard" et "par cadrans"

    f. Ajout des groupes et modification des accès au GPIO, à la station météo via l'USB et à la caméra

    g. Ajout du service de pilotage de la station météo

  4. Ajustements après démarrage de la Raspberry munie de sa nouvelle image

    a. Utilisation de la totalité de l'espace disque disponible

    b. Mises à jour et installation d'utilitaires

    c. Ajout d'utilisateurs et distribution des droits

  5. Configuration particulière avancée

    a. Image stretch ou buster "tous terrains Pi2 ou Pi3" permettant notamment l'apprentissage de la programmation

    • Ajout des utilisateurs supplémentaires pour l'utilisation en codage ou en terminal serveur
    • Activation de la caméra raspberry Pi
    • Activation du serveur de terminaux à distance
    • Activation du réseau WIFI et du réseau filaire
    • Mise à jour des librairies upm et mraa depuis github
    • Installation de Jupyter et Jupyterhub
    • Installation de Snap!BYOB

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

    • Ajout des cadrans interactifs
    • installation et configuration du pare-feu
    • Installation et configuration de la base de données relationnelle mariadb
    • Mise en place d'un serveur web
  6. Propagation des images

En cours se référer pour le moment à :

A Debian Buster image for Raspberry Pi 3 to learn or teach coding with JupyterHub (python, JS), Snap!BYOB (bloc-programming), MRAA and UPM (maker world)


Téléchargements

  1. rpi23-gen-image
  2. g_vidal rpi23-gen-image
  3. logiciel weewx
  4. Images raspberryPi du projet Tremplin

1. Stratégie adoptée

Lors du développement du projet "Météo et Climat tremplin pour l'enseignement des sciences et dès que l'utilisation d'objets connectés (Raspberry Pi Odroïd Intel edison, Intel joule) a été entérinée, des images ont été construites au coup par coup pour soutenir les fonctions attribuées à chacun des objets connectés. cet article regroupe tous les travaux de création d'images pour raspberries Pi en une seule entité structurée afin d'éviter de se disperser dans les articles réalisés lors de chaque développement :

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 existants. 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.a 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,
  • 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

Construction de l'image avec le script automatisé "rpi23genimage" chap. 2

Cette opération est totalement automatisée grâce au travail piloté par drtyhlprsur github, le développement de ces scriptsa 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).

Ajustements manuels génériques chap. 3

Dans cette partie du travail sont réalisés tous les ajustements possibles avant et 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 l future raspberry et quelques fonctionnalités qui ne peuvent être ajoutées lors de la création

Configuration particulière avancée chap. 4

Les Raspberries Pi sont d'admirables petites machines mais leur puissance reste limitée et il est judicieux de les cantonner à un nombre limité de fonctions en supprimant autant que possible tout ce qui est superflu. par exemple l'image qui pilote la station n'a pa besoin d'écran et toute l'infrastructure d'affichage graphique est supprimée ce qui améliore grandement les performances de pilotage de la station et de manipulation des données.

1.b Deux générations de RaspberryPi (rpi2-rpi3), deux familles d'images (codage-station météo) et deux distributions (stretch-buster)

Au cours du projet nous avons manipulé des raspbrries Pi 2 et 3 afin de conserver une compatibilité avec les premiers matériels installés des images pour raspberries Pi 2 et 3 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 ompilation n'apparaissent pas)

1.c Mode de classement et moyen de retrouver une information

les images des raspberries sont classées successivement :

  • par date 2018-MM-JJ
  • par modèle rpi3 ou rpi2
  • par fonction W pour la raspberry WEEWX de pilotage de la station météo et rien pour les autres
  • par distribution de debian utilisée

Ainsi l'mage du 7 janvier 2018 stretch pour la programmation sera nommée : 2018-01-07-rpi3-stretch. Dans cet article cette logique a été respectée et les différentes options possibles pour chaque stade de production sont regroupées.

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

Toutes les constructions d'images 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érrachie 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  12-locale.sh   14-fstab.sh        20-networking.sh   30-security.sh  41-uboot.sh     50-firstboot.sh 11-apt.sh        13-kernel.sh   15-rpi-config.sh   31-logging.sh   42-fbturbo.sh   99-reduce.sh
21-firewall.sh     32-sshd.sh

./files:
apt/  boot/  dpkg/  etc/  firstboot/  initramfs/  iptables/  locales/  modules/  mount/  network/  sysctl.d/  xorg/

./files/apt:
02nocache  03compress  04norecommends  10proxy  flash-kernel  sources.list

./files/boot:
config.txt  uboot.mkimage

./files/dpkg:
01nodoc

./files/etc:
rc.local*

./files/firstboot:
10-begin.sh 22-expandroot.sh 24-generate-machineid.sh 26-config-ifnames.sh 21-generate-ssh-keys.sh  23-regenerate-initramfs.sh  25-create-resolv-symlink.sh  99-finish.sh

./files/initramfs:
expand_encrypted_rootfs  expand-premount*  expand-tools*

./files/iptables:
flush-ip6tables.sh  flush-iptables.sh  ip6tables.rules  ip6tables.service  iptables.rules  iptables.service

./files/locales:
locale

./files/modules:
raspi-blacklist.conf  rpi2.conf

./files/mount:
crypttab  fstab

./files/network:
eth.network  host.conf  hostname  hosts  interfaces

./files/sysctl.d:
81-rpi-vm.conf  82-rpi-net-hardening.conf

./files/xorg:
99-fbturbo.conf

./packages:
weewx_3.8.0-1_all.deb

./templates:
raspife3-buster-arm64 rpi2stretch raspife2-stretch raspife3-jessie raspife3W-stretch README.md rpi3buster raspife3-stretch rpi2buster rpi3jessie raspife3-buster  rpi2jessie           rpi3stretch

Pour construire les images on met en place le noyau linux 4.13 proposé par le dépôt officiel RaspberrryPi/linux.

Les 4 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'utiisateur 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)

2.a Raspberry Pi2 Stretch

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

Le fichier raspife2-stretch 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.

# Configuration file raspi2 Stretch IFÉ 2017/12/28
#
APT_SERVER=debian.mirrors.ovh.net
APT_INCLUDES=""
APT_INCLUDES_LATE="gnupg,firmware-linux-nonfree,firmware-linux,dh-autoreconf,\
gettext,build-essential,git,cmake,libjson-c-dev,unzip,usbutils,\
bison,libboost-all-dev,automake,autoconf,autogen,libtool,libtool-bin,\
pkg-config,checkinstall,menulibre,libnotify-bin,pandoc,\
python3,python3-dev,python3-pypandoc,python3-scipy,python3-tk,python3-pandocfilters,\
python3-geopy,python3-pip,\
python,python-dev,python-pypandoc,python-scipy,python-tk,python-pandocfilters,\
python-geopy,python-pip,python-tk,pandoc,\
python-configobj,python-cheetah,python-imaging,python-serial,python-usb,\
pcre2-utils,libpcre++-dev,libpcre2-dev,libjpeg-dev,i2c-tools,python-smbus,policykit-1,\
pmount,ntpdate,ntp,rsync,automake,autotools-dev,\
texlive,texlive-xetex,nginx-extras,ffmpeg,wicd,wicd-gtk,console-data,keyboard-configuration,\
libqtwebkit-dev,libqt5webkit5-dev,\
libudev-dev,libzzip-dev,zlib1g-dev,libcanberra-gtk-module,libnss-myhostname,libfreetype6-dev,libpng16-16,\
nmap,libltdl-dev,dbus-user-session,debian-archive-keyring,\
xutils-dev,lxsession,openbox-lxde-session,lxde,x11proto-randr-dev,lxrandr,\
tightvncserver,geany,geany-plugin-py,firefox-esr,firefox-esr-l10n-fr,jed,terminator,automake"
#ca-certificates-java,icedtea-plugin,icedtea-netx,\
#openjdk-8-jdk,openjdk-8-jre,openjdk-8-jre-headless,\
#openjdk-9-jdk,openjdk-9-jre,openjdk-9-jre-headless"
#----------------------
RPI_MODEL=2 
RELEASE="stretch"
RELEASE_ARCH="armhf"
HOSTNAME="raspife2" 
PASSWORD="*****"
USER_PASSWORD="*****"
DEFLOCAL="fr_FR.UTF-8" 
TIMEZONE="Europe/Paris"
EXPANDROOT=false
#-----------------------
XKB_MODEL="pc105" 
XKB_LAYOUT="fr" 
XKB_VARIANT="latin9" 
XKB_OPTIONS=""
#------------------------
ENABLE_DHCP=true 
#------------------------
ENABLE_CONSOLE=false
ENABLE_I2C=true
ENABLE_SPI=true
ENABLE_IPV6=true 
ENABLE_SSHD=true 
ENABLE_NONFREE=true 
ENABLE_WIRELESS=false
ENABLE_RSYSLOG=true 
ENABLE_SOUND=true 
ENABLE_HWRANDOM=true 
ENABLE_MINGPU=true 
ENABLE_DBUS=true 
ENABLE_XORG=true
ENABLE_WM="lxdm" 
#------------------------
ENABLE_MINBASE=false
ENABLE_REDUCE=false
ENABLE_UBOOT=false
ENABLE_FBTURBO=true
ENABLE_IPTABLES=false
ENABLE_USER=true 
USER_NAME=ens-ife
ENABLE_ROOT=true 
ENABLE_HARDNET=true
ENABLE_INITRAMFS=true 
ENABLE_IFNAMES=true
#------------------------
ENABLE_ROOT_SSH=false  
SSH_LIMIT_USERS=false
SSH_ROOT_PUB_KEY="/home/*****/.ssh/id_rsa.pub"
SSH_USER_PUB_KEY="/home/*****/.ssh/id_rsa.pub"
#------------------------
BUILD_KERNEL=true
KERNEL_BRANCH=rpi-4.13.y
KERNEL_REDUCE=false
KERNEL_HEADERS=true
KERNEL_REMOVESRC=true
KERNELSRC_CLEAN=true
KERNELSRC_CONFIG=true
#------------------------
REDUCE_APT=false 
REDUCE_DOC=true 
REDUCE_MAN=false 
REDUCE_HWDB=true
REDUCE_BASH=false 
REDUCE_SSHD=false
REDUCE_LOCALE=false
#-------------------------
ENABLE_CRYPTFS=false
#-------------------------
BASEDIR=/data/RpiGenImage/Images/${RELEASE}
DATE=`date +%Y-%m-%d`
IMAGE_NAME=${BASEDIR}/${DATE}-rpi${RPI_MODEL}-${RELEASE}

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/stretch/rpi2-stretch.img (4390M) : successfully created

On dispose alors de deux fichiers : rpi2-stretch.bmap rpi2-stretch.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 microSDen utilisant la commande bmaptool copy (installer le paquet bmaptools si nécessaire).

2.b Raspberry Pi3 Stretch

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

Le fichier raspife3-stretch est homologue de raspife2-stretch 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.

# Configuration file raspi3 Stretch IFÉ 2017/12/28
#
APT_SERVER=debian.mirrors.ovh.net
APT_INCLUDES=""
APT_INCLUDES_LATE="gnupg,firmware-linux-nonfree,firmware-linux,dh-autoreconf,\
gettext,build-essential,git,cmake,libjson-c-dev,unzip,usbutils,\
bison,libboost-all-dev,automake,autoconf,autogen,libtool,libtool-bin,\
pkg-config,checkinstall,libnotify-bin,pandoc,\
python3,python3-dev,python3-pypandoc,python3-scipy,python3-tk,python3-pandocfilters,\
python3-geopy,python3-pip,\
python,python-dev,python-pypandoc,python-scipy,python-tk,python-pandocfilters,\
python-geopy,python-pip,python-tk,\
python-configobj,python-cheetah,python-imaging,python-serial,python-usb,\
python-mysqldb,python-smbus,\
pcre2-utils,libpcre++-dev,libpcre2-dev,libjpeg-dev,i2c-tools,policykit-1,\
pmount,ntpdate,ntp,automake,autotools-dev,\
texlive,texlive-xetex,nginx-extras,ffmpeg,wicd,wicd-gtk,console-data,keyboard-configuration,\
libqtwebkit-dev,libqt5webkit5-dev,\
libudev-dev,libzzip-dev,zlib1g-dev,libcanberra-gtk-module,libnss-myhostname,libfreetype6-dev,libpng16-16,\
nmap,libltdl-dev,dbus-user-session,debian-archive-keyring,\
menulibre,xutils-dev,lxsession,openbox-lxde-session,lxde,x11proto-randr-dev,lxrandr,\
tightvncserver,geany,geany-plugin-py,firefox-esr,firefox-esr-l10n-fr,jed,terminator,automake"
#ca-certificates-java,icedtea-plugin,icedtea-netx,\
#openjdk-8-jdk,openjdk-8-jre,openjdk-8-jre-headless,\
#openjdk-9-jdk,openjdk-9-jre,openjdk-9-jre-headless"
#----------------------
RPI_MODEL=3 
RELEASE="stretch"
RELEASE_ARCH="armhf"
HOSTNAME="raspife3"
PASSWORD="*****"
USER_PASSWORD="*****"
DEFLOCAL="fr_FR.UTF-8" 
TIMEZONE="Europe/Paris"
EXPANDROOT=false
#-----------------------
XKB_MODEL="pc105" 
XKB_LAYOUT="fr"
XKB_VARIANT="latin9" 
XKB_OPTIONS=""
#------------------------
ENABLE_DHCP=true 
#------------------------
ENABLE_CONSOLE=false
ENABLE_I2C=true
ENABLE_SPI=true
ENABLE_IPV6=true 
ENABLE_SSHD=true 
ENABLE_NONFREE=true 
ENABLE_WIRELESS=true
ENABLE_RSYSLOG=true 
ENABLE_SOUND=true 
ENABLE_HWRANDOM=true 
ENABLE_MINGPU=true 
ENABLE_DBUS=true 
ENABLE_XORG=true
ENABLE_WM="lxdm" 
#------------------------
ENABLE_MINBASE=false
ENABLE_REDUCE=false
ENABLE_UBOOT=false
ENABLE_FBTURBO=true
ENABLE_IPTABLES=false
ENABLE_USER=true 
USER_NAME=ens-ife
ENABLE_ROOT=true 
ENABLE_HARDNET=true
ENABLE_INITRAMFS=true 
ENABLE_IFNAMES=true
#------------------------
ENABLE_ROOT_SSH=false  
SSH_LIMIT_USERS=false
SSH_ROOT_PUB_KEY="/home/*****/.ssh/authorized_keys"
SSH_USER_PUB_KEY="/home/*****/.ssh/authorized_keys"
#------------------------
BUILD_KERNEL=true
KERNEL_BRANCH=rpi-4.13.y
KERNEL_REDUCE=false
KERNEL_HEADERS=true
KERNEL_REMOVESRC=true
KERNELSRC_CLEAN=true
KERNELSRC_CONFIG=true
#------------------------
REDUCE_APT=false 
REDUCE_DOC=true 
REDUCE_MAN=false 
REDUCE_HWDB=true
REDUCE_BASH=false 
REDUCE_SSHD=false
REDUCE_LOCALE=false
#-------------------------
ENABLE_CRYPTFS=false
#-------------------------
BASEDIR=/data/RpiGenImage/Images/${RELEASE}
#BASEDIR=/media/*******/*********/Nano-Ordinateurs/RaspberryPi/RpiGenImage/Images/${RELEASE}
DATE=`date +%Y-%m-%d`
IMAGE_NAME=${BASEDIR}/${DATE}-rpi${RPI_MODEL}-${RELEASE}

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/stretch/rpi3-stretch.img (4390M) : successfully created

On dispose alors de deux fichiers : rpi3-stretch.bmap rpi3-stretch.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.c Raspberry Pi3 Stretch sans serveur graphique et avec IP fixe

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

Le fichier raspife3-stretch est homologue de raspife2-stretch 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.

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.

# Configuration file raspi3 Stretch Weewx IFÉ 2017/12/28
#
APT_SERVER=debian.mirrors.ovh.net
APT_INCLUDES=""
APT_INCLUDES_LATE="gnupg,debian-keyring,gawk,\
build-essential,git,cmake,libjson-c-dev,unzip,usbutils,\
bison,libboost-all-dev,automake,autoconf,autogen,libtool,libtool-bin,\
pkg-config,checkinstall,libnotify-bin,pandoc,\
python3,python3-dev,python3-pypandoc,python3-scipy,python3-tk,python3-pandocfilters,\
python3-geopy,python3-pip,\
python,python-dev,python-pypandoc,python-scipy,python-tk,python-pandocfilters,\
python-geopy,python-pip,python-tk,\
python-configobj,python-cheetah,python-imaging,python-serial,python-usb,\
python-mysqldb,python-smbus,\
pcre2-utils,libpcre++-dev,libpcre2-dev,libjpeg-dev,i2c-tools,policykit-1,\
pmount,ntpdate,rsync,automake,autotools-dev,\
libudev-dev,libzzip-dev,zlib1g-dev,libcanberra-gtk-module,libnss-myhostname,libfreetype6-dev,libpng16-16,\
nmap,libltdl-dev,debian-archive-keyring,texlive,texlive-xetex,nginx-extras"
#openjdk-8-jdk-headless,openjdk-8-jre-headless"
#----------------------
RPI_MODEL=3 
RELEASE="stretch"
RELEASE_ARCH="armhf"
HOSTNAME="raspwife3"
PASSWORD="*****"
USER_PASSWORD="*****"
DEFLOCAL="fr_FR.UTF-8" 
TIMEZONE="Europe/Paris"
EXPANDROOT=false
#-----------------------
XKB_MODEL="pc105" 
XKB_LAYOUT="fr"
XKB_VARIANT="latin9" 
XKB_OPTIONS=""
#------------------------
ENABLE_DHCP=false 
NET_ADDRESS="192.168.***.***/24"
NET_GATEWAY="192.168.***.***"
NET_DNS_1="192.168.***.***" 
NET_DNS_2="8.8.8.8" 
#------------------------
ENABLE_CONSOLE=false
ENABLE_I2C=true
ENABLE_SPI=true
ENABLE_IPV6=true 
ENABLE_SSHD=true 
ENABLE_NONFREE=true 
ENABLE_WIRELESS=true
ENABLE_RSYSLOG=true 
ENABLE_SOUND=true 
ENABLE_HWRANDOM=true 
ENABLE_MINGPU=true 
ENABLE_DBUS=true 
ENABLE_XORG=false
ENABLE_WM=""
#------------------------
ENABLE_MINBASE=false
ENABLE_REDUCE=false
ENABLE_UBOOT=false
ENABLE_FBTURBO=false
ENABLE_IPTABLES=false
ENABLE_USER=true 
USER_NAME=ens-ife
ENABLE_ROOT=true 
ENABLE_HARDNET=true
ENABLE_INITRAMFS=true 
ENABLE_IFNAMES=true
#------------------------
ENABLE_ROOT_SSH=false  
SSH_LIMIT_USERS=false
SSH_ROOT_PUB_KEY="/home/*****/.ssh/authorized_keys"
SSH_USER_PUB_KEY="/home/*****/.ssh/authorized_keys"
#------------------------
BUILD_KERNEL=true
KERNEL_BRANCH=rpi-4.13.y
KERNEL_REDUCE=false
KERNEL_HEADERS=true
KERNEL_REMOVESRC=true
KERNELSRC_CLEAN=true
KERNELSRC_CONFIG=true
#------------------------
REDUCE_APT=false 
REDUCE_DOC=true 
REDUCE_MAN=false 
REDUCE_HWDB=true
REDUCE_BASH=false 
REDUCE_SSHD=false
REDUCE_LOCALE=false
#-------------------------
ENABLE_CRYPTFS=false
#-------------------------
BASEDIR=/data/RpiGenImage/Images/${RELEASE}
DATE=`date +%Y-%m-%d`
IMAGE_NAME=${BASEDIR}/${DATE}-rpiw${RPI_MODEL}-${RELEASE}

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/stretch/rpi3W-stretch.img (4390M) : successfully created

On dispose alors de deux fichiers : rpi3W-stretch.bmap rpi3W-stretch.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.d Raspberry Pi3 Buster

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

Le fichier raspife3-buster dérive de raspife3-stretch 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. 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.

# Configuration file raspi3 Buster IFÉ 2017/12/28
#
APT_SERVER=debian.mirrors.ovh.net
APT_INCLUDES=""
APT_INCLUDES_LATE="gnupg,firmware-linux-nonfree,firmware-linux,dh-autoreconf,\
gettext,build-essential,git,cmake,libjson-c-dev,unzip,usbutils,\
bison,libboost-all-dev,automake,autoconf,autogen,libtool,libtool-bin,\
pkg-config,menulibre,libnotify-bin,pandoc,\
python3,python3-dev,python3-pypandoc,python3-scipy,python3-tk,python3-pandocfilters,\
python3-geopy,python3-pip,\
python,python-dev,python-pypandoc,python-scipy,python-tk,python-pandocfilters,\
python-geopy,python-pip,python-tk,pandoc,\
python-configobj,python-cheetah,python-imaging,python-serial,python-usb,\
pcre2-utils,libpcre++-dev,libpcre2-dev,libjpeg-dev,i2c-tools,python-smbus,policykit-1,\
pmount,ntpdate,ntp,rsync,automake,autotools-dev,\
texlive,texlive-xetex,nginx-extras,ffmpeg,wicd,wicd-gtk,console-data,keyboard-configuration,\
libqtwebkit-dev,libqt5webkit5-dev,\
libudev-dev,libzzip-dev,zlib1g-dev,libcanberra-gtk-module,libnss-myhostname,libfreetype6-dev,libpng16-16,\
nmap,libltdl-dev,dbus-user-session,debian-archive-keyring,\
xutils-dev,lxsession,openbox-lxde-session,lxde,x11proto-randr-dev,lxrandr,\
tightvncserver,geany,geany-plugin-py,firefox-esr,firefox-esr-l10n-fr,jed,terminator,automake"
#ca-certificates-java,icedtea-plugin,icedtea-netx,\
#openjdk-8-jdk,openjdk-8-jre,openjdk-8-jre-headless,\
#openjdk-9-jdk,openjdk-9-jre,openjdk-9-jre-headless"
#----------------------
RPI_MODEL=3 
RELEASE="buster"
RELEASE_ARCH="armhf"
HOSTNAME="raspife3" 
PASSWORD="AChanger1$"
USER_PASSWORD="AChanger1$"
DEFLOCAL="fr_FR.UTF-8" 
TIMEZONE="Europe/Paris"
EXPANDROOT=false
#-----------------------
XKB_MODEL="pc105" 
XKB_LAYOUT="fr" 
XKB_VARIANT="latin9" 
XKB_OPTIONS=""
#------------------------
ENABLE_DHCP=true 
#------------------------
ENABLE_CONSOLE=false
ENABLE_I2C=true
ENABLE_SPI=true
ENABLE_IPV6=true 
ENABLE_SSHD=true 
ENABLE_NONFREE=true 
ENABLE_WIRELESS=true
ENABLE_RSYSLOG=true 
ENABLE_SOUND=true 
ENABLE_HWRANDOM=true 
ENABLE_MINGPU=true 
ENABLE_DBUS=true 
ENABLE_XORG=true
ENABLE_WM="lxdm" 
#------------------------
ENABLE_MINBASE=false
ENABLE_REDUCE=false
ENABLE_UBOOT=false
ENABLE_FBTURBO=true
ENABLE_IPTABLES=false
ENABLE_USER=true 
USER_NAME=ens-ife
ENABLE_ROOT=true 
ENABLE_HARDNET=true
ENABLE_INITRAMFS=true 
ENABLE_IFNAMES=true
#------------------------
ENABLE_ROOT_SSH=false  
SSH_LIMIT_USERS=false
SSH_ROOT_PUB_KEY="/home/vidal/.ssh/authorized_keys"
SSH_USER_PUB_KEY="/home/vidal/.ssh/authorized_keys"
#------------------------
BUILD_KERNEL=true
KERNEL_BRANCH=rpi-4.14.y
KERNEL_REDUCE=false
KERNEL_HEADERS=true
KERNEL_REMOVESRC=true
KERNELSRC_CLEAN=true
KERNELSRC_CONFIG=true
#------------------------
REDUCE_APT=false 
REDUCE_DOC=true 
REDUCE_MAN=false 
REDUCE_HWDB=true
REDUCE_BASH=false 
REDUCE_SSHD=false
REDUCE_LOCALE=false
#-------------------------
ENABLE_CRYPTFS=false
#-------------------------
BASEDIR=/data/RpiGenImage/Images/${RELEASE}
#BASEDIR=/media/*******/*********/Nano-Ordinateurs/RaspberryPi/RpiGenImage/Images/${RELEASE}
DATE=`date +%Y-%m-%d`
IMAGE_NAME=${BASEDIR}/${DATE}-rpi${RPI_MODEL}-${RELEASE}

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 deu de la Raspberry Pi, les accès à la partie système doivent donc êre privilégiés c'est pourquoi dans ce qui suit il est impératif d'utiliser un utilisateur privilégé pour pouvoir faire les modifications. ATTENTION de ne pas modifer les fichiers de la machine hôte utilisée pour travailler.... Les conséquences seraient dramatiques !

3.a Copie de l'image sur une micro-SD

Une fois l'image terminée elle est opérationnelle et peut donc être chergée dans une Raspberry Pi qui démarrera, il est possible aussi d'écrire cette cette image sur un support mobile et de manipuler son contenu comme tout contenu de disque dur. Deux voies sont donc possibles :

  • soit on effectue les manipulations sur le disque dur (amovible ou pas)
  • soit on effectue les manipulations sur le disque de la raspberry Pi

Dans les deux cas il est nécessaire de copier l'image sur un support et si on dispose d'un ordinateur sous linux tout support sera lu il est donc souhaitable de faire la manipulation une seule fois et de copier l'image sur une micro-SD. Pour réaliser cette opération on utilise l'outil bmaptools fourni par un paquet de la plupart des distributions (En cas de distribution très ancienne la version de bmaptools peut être incompatible avec celle qui a été utilisée pour fabriquer l'image dans ce cas utiliser la commande dd standard).

sudo bmaptool copy --bmap rpi2-stretch.bmap rpi2-stretch.img /dev/mmcblk0
sudo bmaptool copy --bmap rpi3-stretch.bmap rpi3-stretch.img /dev/mmcblk0
sudo bmaptool copy --bmap rpiw3-stretch.bmap rpiw3-stretch.img /dev/mmcblk0
sudo bmaptool copy --bmap rpi3-buster.bmap rpi3-buster.img /dev/mmcblk0

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.b Ajustement de la taille de l'image

L'image qui vient d'être produite est inscrite sur une partition ajustée à sa taille, 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 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)

3.c Configuration du réseau

Pour que la Raspberry prenne automatiquement le réseau filaire il y a deux solutions :

  • soit on a affecté 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

Dans les deux cas on va d'abord créer un répertoire uqi accueillera les fichiers de configuration du réseau :

sudo mkdir  ./etc/systemd/network

En cas de besoin préparer le lien pour le resolver :

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

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

#  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=8.8.8.8
#FallbackDNS=8.8.8.8 8.8.4.4 2001:4860:4860::8888 2001:4860:4860::8844
#Domains=
#LLMNR=yes
#DNSSEC=no
#Cache=yes
#DNSStubListener=udp

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=raspife3
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 et d'avertir et de réaliser que l'image proposée sera opérationnelle mais ne pourra pas se connecter au réseau car le DHCP est désactivé. Il y a donc deux solutions pour que la Raspberry puisse se connecter au réseau : * effectuer la configuration Avant d'insérer la micros-SD dans la Raspberry à condition de disposer des paramètres nécessaires * Utiliser un clavier/écran/souris pour fournir les paramètres une fois démarré.

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=wlan0
Host=raspife3

[Network]
DHCP=yes

[DHCP]
RouteMetric=20

Cette configuration est insuffisante pour que le WIFI soit activé directement; pour y parvenir il faut configurer les fichiers du logiciel wicd (voir plus loin).

3.d Configuration du logiciel de pilotage des stations météorologiques

Le logiciel weewx de pilotage de stations météorologiques a été installé sans configuration il est impératif de modifier le fichier de configuration afin de reconnaître la station connectée et fournir les informations sur sa localisation et le mode d'acquisition de données. Le fichier à modifier est /etc/weewx/weewx.conf, les modifications à effectuer sont listées ci-dessous, les titres de paragraphes sont reproduits tels qu'ils sont visibles dans le fichier par exemple Station] pour la localisation de la station

sudo nano ./etc/weewx/weewx.conf

Localisation de la station

Remplacer dans la suggestion ci-dessous les **** par le nom de l'établissement, ou l'ensemble du texte si le projet ne concerne pas un établissement scolaire.

[Station]

    location = "Collège / Lycée************** Tremplin des sciences"

    latitude = 45.73 
    longitude = 4.83

    altitude = 169, meter

    station_type = TE923 # for TFA Meteotime DUO see http://weewx.com/docs/hardware.htm for hardware driver selection

type de station

Le modèle standard proposé par le projet est une TFA meteotime duo mais le logiciel weewx permet de connecter de nombreuses stations amateur ou semi professionnelles. Ajouter sous le paragraphe [Simulator] le paragraphe suivant :

[TE923]
    # This section is for the Hideki TE923 series of weather stations.

    # The station model, e.g., 'Meade TE923W' or 'TFA Nexus'
    model = 'TFA Meteotime Duo'

    # The driver to use:
    driver = weewx.drivers.te923

Changement pour avoir des unités du système métrique

   [[StandardReport]]
        skin = Standard
        [[[Units]]]
            [[[[Groups]]]]
                group_altitude = meter
                group_speed2 = meter_per_second2
                group_pressure = mbar
                group_rain = mm
                group_rainrate = mm_per_hour
                group_temperature = degree_C
                group_degree_day = degree_C_day
                group_speed = meter_per_second
                group_direction   = degree_compass
                group_moisture    = centibar
                group_percent     = percent

[StdQC]

    [[MinMax]]
        barometer = 880, 1100, hPa
        outTemp = -40, 50, degree_C
        inTemp = 10, 40, degree_C
        outHumidity = 0, 100
        inHumidity = 0, 100
        windSpeed = 0, 35, meter_per_second
        pressure = 812, 1170, hPa

.../...

[StdConvert]
    target_unit = METRICWX    # Options are 'US', 'METRICWX', or 'METRIC'

Choix du type d'archivage des données

[StdArchive]

    data_binding = wx_binding #other possible new values wx_mariadbextern_binding wx_mariadblocal_binding

[DataBindings]
# new bindings are added to enable local and distant mariadb

    [[wx_binding]]
        database = archive_sqlite
        table_name = archive
        manager = weewx.wxmanager.WXDaySummaryManager
        schema = schemas.wview.schema

    [[wx_mariadbextern_binding]]
        database = archive_mysql
        table_name = archive
         manager = weewx.wxmanager.WXDaySummaryManager
        schema = schemas.wview.schema

    [[wx_mariadblocal_binding]]
        database = archive_mysql_local
        table_name = archive
        manager = weewx.wxmanager.WXDaySummaryManager
        schema = schemas.wview.schema

Liste des bases de données possibles, type et mode d'accès

[Databases]

    # A SQLite database is simply a single file
    [[archive_sqlite]]
        database_type = SQLite
        database_name = weewx.sdb

#replace the ***** by the name of the institution in the OpenMetEdu network
    # MySQL
    [[archive_mysql]]
        database_type = MySQL
        database_name = OpenMetEdu_*******

    # MySQL
    [[archive_mysql_local]]
        database_type = LocMySQL
        database_name = OpenMetEdu_*******

[DatabaseTypes]

   [[SQLite]]
        driver = weedb.sqlite
        SQLITE_ROOT = /var/lib/weewx

    [[MySQL]]
        driver = weedb.mysql
        host = stationsdata.climatetmeteo.fr
        user = ***********
        password = ************
        port = ****

    [[LocMySQL]]
        driver = weedb.mysql
        host = localhost
        user = ***********
        password = ***********
        port = ****

3.e Ajout de l'affichage de pages web "standard" et "par cadrans"

Le logiciel weewx propose l'affichage des mesures en léger temps différé sur des pages web du serveur local de la machine connectée à la station. L'image proposée contient un serveur nginx qui sera utilisé ici en créant deux répertoires dans le dossier racine par défaut du serveur /var/wwww/html.

Dossier des affichages standards

Créer le répertoire weewx et ne pas oublier lors du premier lancement de l'attribuer au user weewx qui pilote le logiciel weewx (ce n'est pas possible pour l'instant).

sudo mkdir ./var/www/html/weewx

Dossier des affichages de cadrans

Créer le répertoire ss et ne pas oublier lors du premier lancement de l'attribuer au user weewx qui pilote le logiciel weewx et de configurer correctement l'identifiant de la station connectée (6 pour la TFA au lieu de 0) (ce n'est pas possible pour l'instant).

sudo mkdir ./var/www/html/ss

3.f Ajout des groupes et modification des accès au GPIO, à la station météo via l'USB 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 et un groupe qui accèdera aux ressources de l'interface Jupyter en ligne (voir plus loin), 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 GPIsans 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 sudo nano ./etc/udev/rules.d/50-gpio.rules et on ajoute le contenu suivant :

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

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 sudo nano ./etc/udev/rules.d/40-usbweewx.rules et 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 :

SUBSYSTEM=="vchiq", GROUP=="video", MODE="0660"

Dès que la caméra sera détectée (voir plus loin) tous les membres du groupe video pourront l'utiliser.

3.g Ajout du service de pilotage de la station météo

Le service weewx permet d'écouter en permanence les messages issus de la station, pour le configurer ajouter le fichier wewx.service dans le répertoire des services des utilisateurs avec la commande sudo nano ./etc/systemd/system/weewx.service en fournissant le contenu suivant :

# systemd configuration for weewx

[Unit]
Description=weewx weather system
Requires=time-sync.target
After=time-sync.target
RequiresMountsFor=/home

[Service]
ExecStart=/usr/bin/weewxd --daemon --pidfile=/var/run/weewx/weewx.pid /etc/weewx/weewx.conf
ExecReload=/bin/kill -HUP $MAINPID
Type=simple
RuntimeDirectory=weewx
PIDFile=/var/run/weewx/weewx.pid
User=weewx
Group=weewx

[Install]
WantedBy=multi-user.target

créer le dossier /var/run/weewx/ avec la commande sudo mkdir ./var/run/weewx et donner les droits d'accès à l'utilisateur weewx avec l'instruction sudo chown weewx.weewx /var/run/weewx/

Le service weewx est prêt aà fonctionner comme tout autre service de la machine.

Pour activer le service weewx au démarrage utilser la commande

sudo systemctl enable weewx

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 au moins au réseau filaire, il est possible qu'une connexion WIFI soit possible dans certains cas mais ce n'est absolument pas garanti sans manipulation particulière (fourniture dans les fichiers de configuration des mots de passe du WIFI). Une fois connectée il est impératif de détecter la raspberry et d'obtenir son adresse IP pour pouvoir s'y connecter; plusieurs méthodes sont possibles suivant la configuration du réseau et la configuration de l'image :

  • 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 b notre exemple son nom est raspife2 ou raspife3 ou raspwife3 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)

4.a Utilisation de la totalité de l'espace disque disponible

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.

Taper ensuite sudo reboot puis :

sudo resize2fs /dev/mmcblk0p2
sudo reboot

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

4.b Mises à jour et installation d'utilitaires

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 avant de proposerl'image en production. Pour cela mettre à jour la liste des paquets et meettre à jour ensuite les nouveaux paquets de la liste :

sudo apt-get update
sudo apt-get upgrade
sudo apt-get 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:

for i in dirmngr wpasupplicant php-fpm fcgiwrap libfcgi-dev  php7.2-mysql ca-certificates-java icedtea-plugin icedtea-netx openjdk-8-jdk openjdk-8-jre openjdk-8-jre-headless openjdk-9-jdk openjdk-9-jre openjdk-9-jre-headless ; do dpkg -l $i; done

sudo apt-get install jed dirmngr wpasupplicant php-fpm fcgiwrap libfcgi-dev  php7.2-mysql ca-certificates-java icedtea-plugin icedtea-netx openjdk-8-jdk openjdk-8-jre openjdk-8-jre-headless openjdk-9-jdk openjdk-9-jre openjdk-9-jre-headless 

4.c Ajout d'utilisateurs et distribution des droits

Lors de la création un seul utilisateur par défaut a été créé, 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 (ve login est utilisé en référence aux machines de développement ayant un utilisateur jupyter et un utilisateur callisto...). Les utilisateurs sont ajoutés avec la commande standard linus debian :
sudo addgroup gpio
sudo addgroup jupyterhub
sudo adduser localadm
sudo adduser weewx
sudo adduser moon

l'utilisateur localadm doit disposer des droits d'administration :

sudo adduser localadm sudo

Les utilisateurs localadm et moon doivent pouvoir en outre utiliser les ressources matérielles de la raspberry on les affecte aux groupes nécessaires :

for i in localadm moon; do for j in i2c gpio netdev plugdev jupyterhub; do sudo adduser $i $j; done; done

Une fois que l'utilisateur weewx existe il est possibl de lui attribuer les répertoires weewx et ss du serveur web créés précédemment.

sudo chown weewx.weewx /var/www/html/weewx
sudo chown weewx.weewx /var/www/html/ss

5. Configurations particulières avancées

La suite des configurations dépend de la destination de l'image et chacune est traitée séparément.

5.a Image stretch ou buster "tous terrains Raspberry Pi 2 ou 3" permettant notamment l'apprentissage de la programmation

Ajout des utilisateurs supplémentaires pour l'utilisation en codage ou en terminal serveur

Deux utilisateurs supplémentaires vont être créés dans cette image, callisto sera l'administrateur de l'nterface de programmation jupyterhub et tsuser sera le créateur par défaut d'un serveur de terminaux.

for i in callisto tsuser; do sudo adduser $i ;done 
for i in callisto tsuser; do for j in i2c gpio netdev plugdev jupyterhub; 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.

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.

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
#

Pur 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

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 mkdir -p Logiciels/Cam puis se positionner dans ce dossier
  • Télécharger les sources des librairies qui seront utilisées 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.

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 jed /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 :

for i in bin include sbin share; do sudo cp -r /opt/vc/$i/* /usr/local/$i; done

La caméra est mainteannt opérationnelle et prête à fonctionner, ajouter dans le groupe video tous les usagers qui pourront utiliser la caméra :

sudo adduser localadm video
sudo adduser moon video

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

Activation du serveur de terminaux à distance

Lors de la construction de l'image on a ajouté le logiciel vncserver qui permet d'afficher sur un écran distant l'écran de la raspberry, 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 dsiposer du serveur de terminaux dès le boot de la raspberry. Pour cela ce logiciel va être install comme un service. Avant d'entâmer cette procédure nous allons définir le mot de passe qui sera utilisé par le login tsuser pour lancer le serveur de terminaux au démarrage. Pour cela se conecter en tant que tsuser et exécuter la commande vncpaswd.

su tsuser
cd
vncpasswd

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

Pour mettre en place un service on ajoute un fichier de lancement dans le répertoire /etc/init.d avec la commande sudo nano /etc/init.d/vncserver avec le contenu suivant :

#!/bin/sh -e
### BEGIN INIT INFO
# Provides:          vncserver
# Required-Start:    $remote_fs $syslog $networking
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO

PATH="$PATH:/usr/X11R6/bin/"

# The Username:Group that will run VNC
export USER="tsuser"
#${RUNAS}

# The display that VNC will use
DISPLAY="1"

# Color depth (between 8 and 32)
DEPTH="16"

# The Desktop geometry to use.
#GEOMETRY="<WIDTH>x<HEIGHT>"
#GEOMETRY="800x600"
GEOMETRY="1024x768"
#GEOMETRY="1280x1024"

# The name that the VNC Desktop will have.
NAME="my-vnc-server"

OPTIONS="-name ${NAME} -depth ${DEPTH} -geometry ${GEOMETRY} :${DISPLAY}"

. /lib/lsb/init-functions

case "$1" in
start)
log_action_begin_msg "Starting vncserver for user '${USER}' on localhost:${DISPLAY}"
su ${USER} -c "/usr/bin/vncserver ${OPTIONS}"
;;

stop)
log_action_begin_msg "Stoping vncserver for user '${USER}' on localhost:${DISPLAY}"
su ${USER} -c "/usr/bin/vncserver -kill :${DISPLAY}"
;;

restart)
$0 stop
$0 start
;;
esac

exit 0

Le fichier doit être rendu exécutable par la commande sudo chmod +x /etc/init.d/vncserver et pour qu'il soit automatiquement lancé au démarrage il doit être déclaré avec la commande sudo update-rc.d vncserver defaults. Vncserver est alors un service manipulable comme tous les autres services de la machine; ne pas oublier de l'arrêter quand on n'en a plus besoin pour éviter de broadcaster en permanence sur le réseau. Pour trouver la Raspberry Pi proposant un terminal serveur si on ne connait pas son adresse, il suffit de chercher une machine faisant du broadcast sur le port 5901, on trouvera bien sûr tous les serveurs faisant du broacast sur ce port...

On se connecte en utilisant un client VNC par exemple xvncviewer ou remmina ou tout autre client de terminal server. Si on ne compte pas exploiter ce service il faut le désactiver avec la commande sudo update-rc.d -f vncserver remove 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).

Activation du réseau WIFI et du réseau filaire

Comme nous l'avons vu plus haut l'interface réseau filaire est configurée de façon générique pour se connecter à tout réseau disponible. Cette connexion est suffisante pour réaliser toutes les configurations proposées dans ce document mais inadéquate pour une utilisation en production. Cependant la mise en place d'une configuration avancée adaptée à un réseau particulier "figera" la situation et la Raspberry pourrait avoir des difficultés pour se connecter à un autre réseau. Si l'image en cours de création est destinée à être partagée avec d'autres usagers qui la cloneront il est recommandé de ne pas configurer le réseau filaire ni le WIFI, 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 doit être effectuée

Configurer le réseau filaire

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

Cette valeur doit être substituée à la valeur générique enx* figurant dans le fichier 50-wired.network.

Name=enx
Host=raspife3

Configurer le WIFI

La configuration du WIFI est plus délicate car il est nécessaire de fournir des mots de passe ou des paramètres propres à chaque réseau. Il est bien sûr possible de "remplir à la main" les fichiers de configuration mais toute erreur même minime (espace oublié, majuscule/minuscule, etc...) entraine l'arrêt du réseau. D'autre part ce travail impose la manipulation de données confidentielles en clair ce qui est à proscrire. Il est donc préférable d'utiliser les outils graphiques standards via la connexion au terminal serveur installé plus haut.

On se connecte avec un outil d'affichage VNC, par défaut le service VNC est activé avec le login tsuser et le mot de passe configuré plus haut. Cliquer en bas à droite dans la barre de menus sur l'icône réseau, la panneau affiché apparaît configurer le réseau WIFI que l'on souhaite utiliser.

Vue de l'écran de la Raspberry via VNC

Mise à jour des librairies upm et mraa depuis github

les forges libres proposent de nombreux logiciels qui peuvent facilement être ajoutés à la Raspberry Pi, même s'il faut les compiler. La manipulation n'est pas compliquée et requiert des connaissances peu avancées à titre d'exemple nous installerons sur notre image les logiciels mraa et upm proposés par intel sur github. Le premier donne accès à la maîtrise du buds GPIO le second propose plusieurs centaines de "drivers" pour des leds, capteurs et effecteurs du monde des "makers". C'est l'équivalent de ce que les utilisateurs des arduino appellent des librairies sauf que dans le cas de la Raspberry que nous construisons nous allons réellement construire des librairies au sens programmation du terme dont les composants pourront être appelés depuis C, C++, python, Java, Node-JS. Cela permettra d'écrire des programmes simples permettant d'interagir avec des capteurs météo des leds ou tous autres composants électroniques connectables. (voir nos cahiers de programmes pour jupyter).

La première étape consiste à créer un espace pour stocker les codes puis de les télécharger dans cet espace depuis les forges opensource ou libres. Nous allons créer une hierarchie de dossiers dans le dodssier Logiciels ayant pour racine IoT (Internet of Things) contenant un dossier mraa et un dossier upm.

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

Avant de pouvoir créer ces deux librairies de programmes il est nécessaire de construire des éléments sur lesquels mraa et upm dépende`nt.

Récupération et installation de Node.js

Ce logicielévolue très rapidement et il est souhaitable de vérifier s'il n'existe pas une nouvelle version depuis l'écriture de ce blog, vérifier la version à jour sur le site Node.js nous utiliserons ici la version 9.3.0 avec npm5.5.1). créer le dossier pour accueillir le logiciel et le télécharger.

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

Il est aussi possible en cas de besoins particuliers de compiler Node.js se reporter à Installer un Système d'exploitation linux Debian Stretch sur une Raspberry Pi 2 ou 3 avec les outils Weewx, JupyterHub, MRAA et UPM.

Récupération et construction du paquet swig

Quelques modifications par rapport à la version du master sur github sont nécessaire pour que le fonctionnement soit correct c'est pourquoi on récupère ce logiciel modifié depuis notre dépôt. Comme dans les cas précédents on crée d'abord l'espace d'accueil puis on clone le dépôt.

cd
mkdir -p Logiciels/Swig
cd !$
git clone -b master --single-branch  https://github.com/g-vidal/swig
cd swig
./autogen.sh
./configure

if things run smoothly you will get the message

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

Then go on further :

make -j4
sudo make install
sudo ln -s /usr/include/webkitgtk-4.0/JavaScriptCore /usr/include/JavaScriptCore

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

Récupération et construction du paquet modus

cd 
mkdir -p Logiciels/Modus
cd !$
git clone https://github.com/stephane/libmodbus.git
cd libmodbus/
./autogen.sh 
./configure
make -j4
sudo make install

Construction de mraa et upm

Il est maintenant possible de construire la librarie mraa et upm qui permettent de gérer le bus GPIO et un grand nombre de dispositifs électroniques

cd Logiciels/IoT/mraa
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make -j4
sudo make install
cd Logiciels/IoT/upm
mkdir build
cd build
cmake -DWERROR=off -DCMAKE_INSTALL_PREFIX=/usr ..
make -j4
sudo make install

Les programmes sont directement accessibles depuis les librairies python2, python3, Java, Javascript, C, C++.

Installation de Jupyter et Jupyterhub

Jupyter est un interface graphique de développement et de programmation multilangages qui permet de se familiariser simplement avec la programmation. Il permet d'approcher simplement un langage de programmation sa syntaxe, son vocabulaire et sa logique. Il permet de produire et d'exploiter des cahiers de programmes ipython intégrant code source et commentaire qui s'avèrent être d'excellents outils pédagogiques pour l'apprentissage du code voir les cahiers de programmes du projet Tremplin et par exemple la ministation météo. Jupyterhub est un coutil companion de Jupyterhub qui permet de servir jupyter sur le web à plusieurs usagers en même temps, lors d'un TP ou TD par exemple.

Jupyter et Jupyterhub sont des logiciels python et peuvent donc être installés avec pip, l'option --no-cache-dir pour installer matplotlib est nécessaire à cause de la faible mémoire de la raspi, jupyterhub requiert python3 :

sudo pip install setuptools --upgrade
sudo pip install wheel --upgrade
sudo pip install Rpi.GPIO
sudo pip install jupyter
sudo pip --no-cache-dir install matplotlib
sudo pip3 install setuptools --upgrade
sudo pip3 install wheel --upgrade
sudo pip3 install Rpi.GPIO
sudo pip3 install jupyter
sudo pip3 install jupyterhub
sudo pip3 --no-cache-dir install matplotlib 
sudo pip3 install git+https://github.com/jupyter/sudospawner

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

La sécurité est une contrainte importante de tout échange sur un réseau numérique notamment en milieu éducatif. Même si votre raspberry qui est branchée dans une salle de TP derrière le pare-feu de l'établissement paraît ne pas être une menace, elle pourrait bel et bien le devenir ! (Certaines séries américaines ont d'ailleurs utilisé des Raspberries Pi comme instruments d'attaque numérique, cela est en général romancé mais repose effectivement sur une part de réalité). Il est recommandé de mettre en place quelques éléments basiques de protection qui pourront aussi servir de support à une sensibilisation sur les risques numériques et le comportement à adopter sur les réseaux. L'authentification permet à chaque groupe ou élève (suivant le choix du professeur) de disposer d'un espace protégé des actions du reste du monde.

callisto est l'utilisateur choisi pour lancer jupyterhub, pour conserver la configuration proposée c'est donc l'utilisateur callisto qui doit assumer le certificat de sécurité.

sudo su callisto
cd
mkdir -p Utils/Certificates
sudo cd !$
openssl req -new -newkey rsa:2048 -rand /dev/urandom -nodes -keyout meteojuphub.key -out meteojuphub.csr

Répondre aux questions posées en fonction de vos paramètres.

openssl req -new -x509 -days 3652 -key meteojuphub.key -out meteojuphub.pem

On dispose maintenant des fichiers de sécurisaton nécessaires meteojuphub.csr meteojuphub.key meteojuphub.pem qui vont être utilisés pour protéger l'accès à jupyterhub. Par défaut un fichier de sécurisation a été installé pour permettre un fonctionnement immédiat mais chaque nouvel administrateur doit impérativement créer son propre fichier de sécurité. les manipulations qui sivent qui suivent sont génériques et si les mêmes noms de fichier sont utilisés il ne sera pas nécessaire de répliquer les opérations ci-dessous.

cd
mkdir Jupyterhub
cd !$
jupyterhub --generate-config 

Éditer le fichier jupyterhub_config.py puis décommenter et renseigner les 3 lignes comme indiqué ci-dessous :

nano jupyterhub_config.py

.../...

## 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'])

.../...

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

Pour que Jupyterhub puisse être lancé par callisto et fonctionne correctement callisto (que nous avons choisi comme user pour lancer Jupyterhub doit disposer de quelques privilèges qui doivent être ajoutés par l'administrateur (et pas par callisto qui n'a pas de privilèges suffisants) au fichier sudoers avec la commande sudo visudo en ajoutant les lignes suivantes :

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

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

L'utilisateur callisto doit aussi appartenir au groupe shadow.

sudo adduser callisto shadow

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

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

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

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

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

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

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.

Installation d'un service jupyterhub

Pour mettre en place un service télecharger le fichier suivant à placer dans /etc/init.d, comme précédemment on stockera ce fichier dans l'espace Logiciels avant de l'installer.

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

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

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

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

# Do NOT "set -e"

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

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


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

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

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

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

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

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

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

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

:

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

sudo cp jupyterhub /etc/init.d
sudo chmod +x /etc/init.d/jupyterhub
sudo update-rc.d jupyterhub defaults

Pour lancer au démarrage on a ajouté sudo update-rc.d jupyterhub defaults; pour ne plus lancer au démarrage appliquer la commande sudo update-rc.d jupyterhub remove. Jupyterhub se lance comme tout service sudo service jupyterhub start.

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 !$
scp ***.***.***.***:/pathToSnap/snap.zip .
sudo mkdir /opt/Snap
cd !$
sudo unzip ~/Logiciels/Snap/snap.zip
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

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

Pour jupyterhub

sudo nano jupyterhubOnOff 
# Ajouter le contenu suivant
#!/bin/bash
#script pour activer/désactiver jupyterhub au boot
#
prog=`basename $0`
if [[ $1 == "" ]] ; then
  echo "Type " $prog "on or off to 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

Pour vncserver

sudo nano vncserverOnOff
# Ajouter le contenu suivant
#!/bin/bash
# Script pour activer/désactiver vncserver au boot
#
prog=`basename $0`
if [[ $1 == "" ]] ; then
  echo "Type " $prog "on or off to start or stop vncserver at boot"
  exit
else
  case $1 in
    on )
      sudo systemctl enable vncserver
    ;;
    off )
      sudo systemctl disable vncserver
    ;;
    * )
      echo  "Choice is on or off"
      exit
    ;;
  esac
fi

Pour weewx

sudo nano weewxOnOff
# Ajouter le contenu suivant
#!/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

Copier les scripts dans le répertoire /usr/local/bin

sudo cp ~/Scripts/* /usr/local/bin

Ajout des cahiers de programmes pour apprendre/enseigner la programmation

Ajouter les cahiers de programmes du projet Tremplin des Sciences depuis la forge github

su moon
cd
git clone https://github.com/ericlejan/CahierDeProgrammes.git
exit
su localadm
cd
git clone https://github.com/ericlejan/CahierDeProgrammes.git
exit
cd
git clone https://github.com/ericlejan/CahierDeProgrammes.git

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

Ajout des cadrans interactifs

Une fois installé par défaut ou téléchargé depuis le site d'origine le logiciel weewx récupère les données de la station et fournit des pages web affichant les mesures réalisées. 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. On clone le répertoire après avoir créé le répertoire Logiciels s'il n'existe pas encore à titre conservatoire on récupère ici une copie du paquet weewx.

cd
mkdir -p Logiciels/Weewx
cd !$
wget http://weewx.com/downloads/weewx_3.8.0-1_all.deb

Attention ! lors d'une mise à jour de weewx le fichier de configuration /etc/weewx/weewx.conf est effacé et réécrit faire une copie de ce fichier AVANT d'entreprendre une mise à jour, puis comparer et modifier si nécessaire le nouveau fichier (le fichier existant est utilisé comme modèle et les paramètres théoriquement conservés, toutefois il est souhaitable de vérifier attentivement).

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.2.1/hfw-0.2.1.tar.gz
wget -P . https://github.com/gjr80/weewx-steelseries/releases/download/v2.6.3/steelseries-2.6.3.tar.gz
sudo systemctl stop weewx
sudo wee_extension --install=hfw-0.2.1.tar.gz
sudo wee_extension --install=steelseries-2.6.3.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]]]]

Il reste quelques modifications à effectuer directement sur les fichiers de scripts d'affichage dans le fichier /var/www/html/ss/scripts/gauges.js : * la langue d'affichage * le modèle de station * les capteurs disponibles * les affichages sohaités.

Les affichages améliorés sont maintenant disponibles.

cd
mkdir Logiciels
cd Logiciels/
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
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.

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

Modifier enfin /etc/weewx/weewx.conf pour activer l'utilisation du second mode de représentation en ajoutant les lignes suivantes.

[StdReport]
    ...
    [[SteelSeries]]
        skin = ss
        HTML_ROOT = /var/www/html/ss

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 cofiguré(il s'agit d'une précaution) :

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

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 firehol. 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 des iptables correspondant aux instructions de l'usager. L'installation du paquet se fait avec la procédure habituelle.

sudo apt-get install firehol

Activer firehol au démarrage par défaut:

sudo jed /etc/default/firehol

#modify the file as follows

# To enable firehol at startup set START_FIREHOL=YES (init script variable)
START_FIREHOL=YES

Le fichier de configuration se trouve dans la hiérarchie /etc/firehol/firehol.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 modifications du fichier de configuration firehol.conf.

# 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="***.***.***.***/** ***.***.***.***/**"
#ETAB="***.***.***.*** ***.***.***/**"
#INTERNE=192.168.***.0/24
# Rescue 
#RESCUE=***.***.***.***

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

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

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

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

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

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 (19/01/2018) la dernière version disponible est 10.1.26.

sudo apt-get 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.

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 jed /etc/mysql/mariadb.conf.d/50-server.cnf

Pour avoir un accès distant modifier le paramère bind address et pour changer le port le paramètre port.

bind-address        = 0.0.0.0
.../...
port            = ****

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

Mise en place d'un serveur web

Nous allons utiliser la base de données locale maraidb 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 jed /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 jed /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/

6. Propagation des images par clonage

Une fois que tous les programmes souhaités sont ajoutés et toutes les options configurées les images peuvent être diffusées sous forme binaire compressée, il suffit alors à tout usager qui souhaite se les approprier de téchager le fichier et le copier sur une micro-SD qui sera immédiatement opérationnelle. Éteindre la Raspberry pi et extraire la micro-SD puis l'insérer dans un ordinateur (dans le cas ci-dessous elle apparaît sur le device /dev/mmcblk0. Copier "bit à bit" le contenu de la micro-SD sur le disque dur de l'ordinateur avec les options de maîtrise des espaces vides et le contrôle de la taille; l'image proposée dans ce blog pouvant contenir dans une micro-SD de 8Go. Le nom de l'image utilise les règles de nommage utilisées au chap 1.C. Pour faciliter la copie de l'image on propose de créer le fichier bmap correspondant et de la compresser (le logiciel bmaptools traite directement les images compressées ce qui minimise les temps de téléchargement et évite le temps de décompression)

sudo dd if=/dev/mmcblk0 of=2018-01-07-rpi3-stretch.img bs=4M conv=sparse count=1900
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 :

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. Logiciel mraa
  4. Logiciel upm
  5. Image Debian Live
  6. Comment créer une clef USB bootable Debian
  7. weewx

Commentaires