Résumé :
Construire une image debian trixie (stable) ou debian forky (testing) standard pour une Raspberry Pi avec un processeur arm64 (Pi3 4 5). les images sont construites pour êtres directement utilisables dans un univers scolaire (collège) pour gérer les données météorologiques d'une station de mesure, apprendre ou enseigner le codage avec les outils SNAP!BYOB (analogue à scratch) et jupyter pour aborder python et javascript. L'image est construite à partir de la source debian standard.
Motivations
Le but de cet article est de décrire la procédure technique permettant d'enrichir un système d'exploitation Debian "orthodoxe" (analogue à celui qui
est installé sur un ordinateur ordinaire) et qui fonctionne sur une Raspberry Pi ARM-64.
La motivation principale est de disposer d'une distribution standard augmentée de tous les logiciels nécessaires pour piloter le GPIO de la RaspberryPi, apprendre à coder en python ou C++ à l'aide d'une interface web jupyterou jupyterlab.
La seconde motivation est de proposer une explication de TOUT ce qui est fait pour enrichir le système à partir de l'image de base en évitant les commandes parfois perçues comme "magiques".
Remerciements
Éric le Jan et Charles-Henri Eyraud.
Sommaire
- Remerciements
- Sommaire
- Téléchargement
- 1. Téléchargement de l'image et création de la micro-SD
- 1.1. Modification de la taille de la partition
- 2. Premier démarrage
- 3. Configuration de l'environnement de la RaspberryPi Tremplin Dev
- 3.1 Mode de classement des images
- 3.2 AJustements courants pour faciliter l'usage
- 3.3 Configuration du réseau (ligne de commande)
- 3.4. Ajout d'une interface graphique
- 3.5. Ajout d'utilisateurs et gestion des droits
- 3.6. Activation du serveur de terminaux à distance
- 3.6.1. Choix du terminal server
- 3.6.2. Mise en place de xrdp
- 4. Installation et mise à jour de l'environnement logiciel de développement
- 5. Installation et mise à jour des logiciels de développement et de programmation
- 5. Utilisation de la Raspberrry en point d'accès web (Hotspot)
- 6. Configurations particulières avancées
- 6.1 Image buster ou bullseye "tous terrains Raspberry Pi 3 3B+ou 4" permettant entre autres l'apprentissage de la programmation
- 6.2 Installation et mise à jour de l'environnement logiciel
- 6.2.1 Récupération et installation de Node.js
- 6.2.2 Récupération et construction du paquet swig
- 6.2.3 Récupération et construction du paquet libopenzwave
- 6.2.4 Récupération et construction du paquet modbus
- 6.2.5 Récupération et construction du paquet tinyb
- 6.2.6 Récupération et Construction de mraa et upm
- 6.2.7 Installation de compléments Python
- 6.3 (Optionnel) Installation d'un simulateur graphique de réseau après avoir installé un docker
- 6.4 Installation de Jupyterlab et Jupyterhub
- 6.5 Installation de Snap!BYOB
- 6.6 Installation de Domoticz pour piloter des objets connectés du commerce
- 6.7 Ajout de scripts pour démarrer ou supprimer un service au démarrage
- 6.8 Ajout des cahiers de programmes pour apprendre/enseigner la programmation
- 6.9 Ajout d'un media-center
- 6.10 Image sans interface graphique (type serveur) pour le pilotage de la station météorologique et le partage de données
- 6.10.1 Configuration du réseau statique
- 6.10.2 Configuration du logiciel de pilotage de stations météorologiques
- 6.10.3 Ajout des cadrans interactifs
- 6.10.4 Installation et configuration du pare-feu
- 6.10.5 Installation et configuration de la base de données relationnelle mariadb
- 6.10.6 Mise en place d'un serveur web
- 6.10.7 Mise en place d'une connexion WIFI
- 7. Propagation des images
Téléchargement
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 (RaspberryPi, 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 présente l'enrichissement de l'image standard debian pour raspberryPi ARM-64 afin de la rendre aisément opérationnelle avec les adaptations particulières pour le projet "Tremplin des Sciences".
La procédure décrite ci-dessous a été réalisée à partir d'une machine linux Debian, si on ne dispose pas d'un tel ordinateur il est possible de réaliser ce travail à partir d'une distribution "live" sur une clef USB qui s'installe sur tout ordinateur sans toucher au système d'exploitation et aux données existantes. Pour conserver l'état du système ainsi créé on peut utiliser une distribution "persistante" voir Créer et utiliser une clef USB GNU/linux bootable persistante pour configurer une raspberry Pi.
L'utilisateur privilégié initial s'appelle ens-ife dans les fichiers de configuration et on fournit une clef ssh pour éviter l'utilisation de mots de passe (un mot de passe de secours est toutefois prévu dans la configuration). L'utilisateur privilégié ens-ife est réservé aux responsables du projet, un autre utilisateur privilégié localadmest créé pour fournir à un tiers responsable local de l'image les droits d'administration.
1. Téléchargement de l'image et création de la micro-SD
L'équipe cloud.debian.org fournit des images debian pour un grand nombre de plateformes, y compris les raspberriesPi basées sur un processeur ARM-64. Plusieurs versions sont disponibles on choisira ici trixie.
Le téléchargement de l'image du jour : debian-13-generic-arm64-daily-20260318-2420.tar.xz fournir la dernière image créée.
L'image est décompressée tar xvfJ debian-13-raspi-arm64-daily.tar.xz et fournit une image brute disk.raw qui peut être directement transférée sur la carte SD. Dans l'exemple ci-dessous la carte SD est sur /dev/sdh.
sudo dd if=disk.raw of=/dev/sde bs=16M
sudo fdisk /dev/sde
1.1. Modification de la taille de la partition
L'image dispose d'une table de partitions GPT hybride on utilise fdisk pour modifier la taille de la partition principale
sudo fdisk /dev/sde
- taper e
- partition 1
- taper la taille choisie ici 24G pour ménager un espace libre au cas ou l'image serait copiée sur une carte plus petite que celle utilisée actuellement pour la construire
- taper w
- puis
sudo resize2fs /dev/sde1
# Trace de l'exécution :
Commande (m pour l'aide) : e
Numéro de partition (1,15, 15 par défaut) : 1
Nouvelle <taille>{K,M,G,T,P} en octets ou <taille>S en secteurs (29,2G par défaut): 24G
La partition 1 a été redimensionnée.
Commande (m pour l'aide) : w
Le périphérique contient un secteur d’amorçage hybride — écriture de GPT seulement.
La table de partitions a été altérée.
Appel d'ioctl() pour relire la table de partitions.
Synchronisation des disques.
sudo resize2fs /dev/sde1
resize2fs 1.47.4 (6-Mar-2025)
Resizing the filesystem on /dev/sde1 to 6291456 (4k) blocks.
The filesystem on /dev/sde1 is now 6291456 (4k) blocks long.
2. Premier démarrage
Insérer la SD dans la raspberryPi connectée au réseau filaire, à un écran et un clavier. Au démarrage la raspberryPi demande de choisir la "timezone" taper 465 pour Europe/Paris, puis choisir un mot de passe. Attention par défaut le clavier est anglais (QWERTY), par précaution utiliser des lettres identiques entre clavier français et anglais pour le mot de passe.
Il est alors possible de se connecter en tant qu'administrateur
2.1 Premières configurations
Vérifier que tous les paquets sont à jour puis installer les paquets permettant de passer en clavier français et dans la locale française.
apt update
apt install locales keyboard-configuration console-setup
dpkg-reconfigure locales
Choisir le nom de la raspberry, pour le projet ce sera rpitremplin
sudo jed /etc/hostname
# add rpitremplin
sudo jed /etc/hosts
cat /etc/hosts
127.0.0.1 rpitremplin
::1 rpitremplin ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
La raspberry est maintenant en français avec un clavier français, on peut entâmer la configuration de base.
2.2 configuration de base
Ajout de l'utilisateur d'administration du projet et promotion des droits puis installation du serveur et du client ssh.
adduser ens-ife
adduser ens-ife sudo
apt install openssh-server openssh-client
Il est maintenant possible de se connecter depuis une autre machine en ssh pour travailler confortablement sur la raspberryPi. Le clavier et l'écran ne sont plus nécessaires.
3. Configuration de l'environnement de la RaspberryPi Tremplin Dev
3.1 Mode de classement des images
Le nom des images de raspberries crées pour le projet Tremplin est formé en juxtaposant les éléments suivants séparés par des tirets "-" et un "_" avant la date :
- modèle : rpi3, rpi3P (3 BPlus) ou rpi4
- projet de rattachement : "Tremplin"
- fonction :
- Dev pour la raspberry orientée codage et développement
- Met pour la raspberry orientée pilotage de station météorologique
- distribution de debian utilisée
trixieau 01-01-26 - date : AAAA-MM-JJ
- extension type de fichier : conf img ou bmap
- (éventuellement extension indiquant la compression xz)
Ainsi l'mage du 3 mars 2026 pour une RaspberryPi3 en trixie pour le codage et le développement a pour nom : rpi3-Dev-trixie_26-03-03 avec les extensions bmap, img et conf.
3.2 AJustements courants pour faciliter l'usage
les modifications suivantes sont facultatives et doivent être adaptées au choix de l'administrateur
* Modification du .bashrc
* Modification du .bashrc de root
* Ajout du dossier .ssh et des clefs de sécurité
* Ajout de l'éditeur jed pour ceux qui n'aiment pas nano
* Ajout de contrib et non-free à la distribution
sudo jed /etc/apt/sources.list.d/debian.sources
sudo apt update
# Components: main contrib non-free non-free-firmware
sudo apt update
3.3 Configuration du réseau (ligne de commande)
Ce chapitre est réalisé en ligne de commande, avant d'activer l'interface graphique, par souci d'efficacité et d'économie de temps (ces manipulations sont aussi possibles ultérieurement depuis l'interface graphique). La configuration du réseau est une chose délicate car il existe beaucoup de solutions différentes dont les éléments constitutifs sont incompatibles si on tente de panacher deux solutions.
Nous avons choisi ici une voie minimaliste qui se configure et fonctionne en ligne de commande. Cela permet d'avoir un démarrage du réseau au boot que la connection soit filaire ou par wifi ; par conséquent il sera possible d'ajouter la RaspberryPi ainsi configurée dans un environnement existant proposant du DHCP sans qu'il soit nécessaire de connecter un clavier, une souris et un écran. On utilise :
* systemd-networkd
* wpa_supplicant
* wpagui (pour l'interface graphique)
La construction de base de l'image proposée ci-dessous utilise des nomss d'interfaces génériques : enx* et wlan0.
3.3.1. Connexion à l'interface filaire par défaut
Au premier démarrage la raspberry prend automatiquement le réseau filaire en utilisant netplan. Les informations sont fournies par la commande :
sudo systemctl status systemd-networkd
# On récupère les informations :
# Loaded: loaded (/usr/lib/systemd/system/systemd-networkd.service; enabled; preset: enabled)
# Configuring with /run/systemd/network/10-netplan-all-en.network
sudo cat /run/systemd/network/10-netplan-all-en.network
[Match]
Name=en*
[Network]
DHCP=yes
LinkLocalAddressing=ipv6
[DHCP]
RouteMetric=100
UseMTU=true
UseDomains=true
3.3.2. Reconfiguration de l'interface filaire via netplan
On configure netplan :
cd /etc/netplan
sudo cp 90-default.yaml 50-enxwired.yaml
sudo mv 90-default.yaml 90-default.stdyaml
sudo jed 50-enxwired.yaml
network:
version: 2
renderer: networkd
ethernets:
all-enx:
match:
name: enx*
dhcp4: true
dhcp4-overrides:
use-domains: true
dhcp6: true
dhcp6-overrides:
use-domains: true
sudo netplan generate
sudo netplan try
sudo netplan apply
#sudo netplan --debug apply
3.3.3. Configuration de l'interface WIFI
Attention la RaspberryPi3 ne prend pas le wifi 5 GHz.Ajout des paquets nécessaires et configuration de wpasupplicant
sudo apt install rfkill wpasupplicant
sudo rfkill
ID TYPE DEVICE SOFT HARD
0 bluetooth hci0 unblocked unblocked
1 wlan phy0 unblocked unblocked
sudo su
wpa_passphrase votre-ssid votre-mot-de-passe >> /etc/wpa_supplicant/wpa_supplicant.conf
# enlever le mot de passe en clair du fichier `/etc/wpa_supplicant/wpa_supplicant.conf`
Ajouter un fichier de configuration dans /etc/netplan
cd /etc/netplan
sudo cat 60-wlan0wireless.yaml
network:
version: 2
renderer: networkd
wifis:
wlan0:
accept-ra: true
access-points:
"################":
password: "$$$$$$$$$$$$$$$$$"
dhcp4: true
dhcp6: true
Sudo chmod 600 60-wlan0wireless.yaml
sudo netplan generate
sudo netplan try
sudo netplan apply
#sudo netplan --debug apply
3.3.4. détection de la RaspberryPi sur le réseau
Pour obtenir l'adresse IP de la raspberry, si le réseau n'est pas trop étendu, 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)
3.4. Ajout d'une interface graphique
On ajoute un display manager (lxdm dans ce cas) et un window manager (lxqt dans cette proposition) ainsi que toutes leurs dépendances. Installer les paquets debian (il est possible d'installer' un autre display manager et un autre window manager, toujours choisir des environnements peu gourmands en ressources).
sudo apt install lxdm lxqt
3.5. Ajout d'utilisateurs et gestion des droits
Au premier démarrage un seul utilisateur a été créé ens-ife, dans notre projet cet utilisateur est l'administrateur du projet que nous demandons de conserver en l'état et nous proposons de créer :
- un administrateur local à la machine
localadm, - un utilisateur pour la connexion
xrdpxrdpuser, - un administrateur de l'interface de programmation jupyterhub
callisto - un utilisateur invité qui servira de test
moon(ce login est utilisé en référence aux utilisateurs jupyter et callisto...)
Les groupes et les utilisateurs sont ajoutés avec les commande standard linux debian addgroup et adduser
for i in i2c gpio jupyterhub; do sudo addgroup $i; done
for i in localadm moon callisto xrdpuser; do sudo adduser $i; done
l'utilisateur localadm doit disposer des droits d'administration :
sudo adduser localadm sudo
Les utilisateurs ens-ife, localadm, callisto, xrdpuseret moon doivent pouvoir en outre utiliser les ressources matérielles de la raspberry on les affecte aux groupes nécessaires :
for i in localadm moon ens-ife callisto xrdpuser; do for j in i2c gpio netdev plugdev audio video; do sudo adduser $i $j; done; done
Pour améliorer la sécurité il est possible (souhaitable) de supprimer le login par mot de passe de callisto en lui procurant un login exclusif par clef ssh. Match User callisto PasswordAuthentication no. Pour plus de sécurité il est possible (souhaitable) de supprimer tout login par mot de passe et de modifier le portssh par défaut.
sudo jed /etc/ssh/sshd_config
# Lignes non commentées modifiées
Include /etc/ssh/sshd_config.d/*.conf
Port 24122
PermitRootLogin no
PubkeyAuthentication yes
PermitEmptyPasswords no
KbdInteractiveAuthentication no
UsePAM yes
X11Forwarding yes
PrintMotd no
AcceptEnv LANG LC_* COLORTERM NO_COLOR
Subsystem sftp /usr/lib/openssh/sftp-server
Les utilisateurrs localadm, moon, ens-ife, callisto doivent appartenir au groupe jupyterhub :
for i in localadm moon ens-ife callisto; do sudo adduser $i jupyterhub; done
3.6. Activation du serveur de terminaux à distance
Depuis le début l'ensemble du travail a pu être réalisé en ligne de commande, sans connecter clavier/écran/souris à la RaspberryPi. Pour pouvoir continuer dans cette logique tout en profitant d'une interface graphique évoluée nous allons installer un terminal serveur sur la raspi qui pourra afficher sur n'importe quel ordinateur du même réseau l'interface graphique de la raspberry.
3.6.1. Choix du terminal server
Plusieurs choix sont possibles, chaque outil a ses avantages et ses inconvénients. xrdp est censé proposer de meilleures performances et une bonne compatibilité avec le client de terminal server windows. C'est celui qui a été choisi.
3.6.2. Mise en place de xrdp
Cet outil permet d'afficher l'écran de la raspberry à distance dans une fenêtre d'un ordinateur portable ou de bureau et de ne pas avoir à connecter un clavier une souris et un écran à la raspberry pour pouvoir l'utiliser en mode graphique.
Vérifier si xrdp est installé.
sudo dpkg -l xrdp
#si non
sudo apt install xrdp
Ajout de l'utilisateur xrdp dans le groupe ssl-cert.
sudo adduser xrdpuser ssl-cert
xrdpest installé et préconfiguré pour fonctionner comme un service géré comme les autres services par systemctl. Les 3 fichiers de configuration du service se trouvent dans /lib/systemd/system :
xrdp-sesman.service
xrdp session manager
xrdp.service
Les fichiers de configuration de l'application sont dans /etc/xrdp, on modifie ci dessous le port et la profondeur de l'image.
sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak
sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini
sudo sed -i 's/max_bpp=32/#max_bpp=32\nmax_bpp=128/g' /etc/xrdp/xrdp.ini
sudo sed -i 's/xserverbpp=24/#xserverbpp=24\nxserverbpp=128/g' /etc/xrdp/xrdp.ini
Démarrage du service :
systemctl status dbus
# s'il n'est pas actif
sudo su
systemctl enable dbus
exit
sudo systemctl start dbus
# dbus activé
sudo systemctl start xrdp
Vérification du fonctionnement avec sudo systemctl status xrdp, vérification que xrdp est activé au démarrage avec sudo systemctl is-enabled xrdp.
L'affichage se fait à l'aide d'un client de serveur de terminaux remmina par exemple ou l'outil connexion de bureau à distance sur le port 3390 soit : IP.de.la.raspi:3390.
4. Installation et mise à jour de l'environnement logiciel de développement
La première étape de l'installation consiste à créer pour chaque logiciel un espace pour stocker les codes puis de les télécharger dans cet espace depuis les forges opensource ou libres. Nous allons créer une hierarchie de dossiers ayant pour racine le dossier Logiciels; on y retrouvera par exemple un dossier IoT (Internet of Things) contenant un dossier mraa et un dossier upm.
La raspberry en plus de la possibilité de développer du code comme tout autre ordinateur, elle dispose du bus GPIO proposant des interfaces I2C, SPI, UART, etc... Elles permettent de connecter des capteurs et des effecteurs ouvrant un champ d'investigation en interaction avec le monde réel.
4.1 Utilitaires et compléments de l'environnement
Les forges libres proposent de nombreux logiciels qui peuvent facilement être ajoutés à la Raspberry Pi, même s'il faut les compiler. La manipulation n'est pas compliquée et requiert des connaissances peu avancées à titre d'exemple nous installerons sur notre image les logiciels mraa et upm initiés par Intel et maintenus par eclipse sur github. Le premier donne accès à la maîtrise du bus GPIO le second propose plusieurs centaines de "drivers" pour des leds, capteurs et effecteurs du monde des "makers". C'est l'équivalent de ce que les utilisateurs des arduino appellent des librairies sauf que dans le cas de la Raspberry que nous construisons nous allons réellement construire des librairies au sens informatique du terme dont les composants pourront être appelés depuis les langages C, C++, python, Java, Node-JS... Cela permettra d'écrire des programmes simples permettant d'interagir avec des capteurs météo des leds ou tous autres composants électroniques connectables. (voir nos cahiers de programmes pour jupyter.
Quelques outils utiles pour la suite :
sudo dpkg -l htop wget gcc g++ clang make autoconf automake flex bison pkg-config openssl openjdk-25-jdk openjdk-25-jre openjdk-25-jre-headless python3-openssl python3-cryptography python3-distutils-extra libssl-devl pcre2-utils ibpcre2-dev python3-dev python3-configobj libjavascriptcoregtk-6.0-dev libwebkitgtk-6.0-dev git libtool graphviz doxygen libjson-c-dev libgtest-dev
sudo apt install htop wget gcc g++ clang make autoconf automake flex bison pkg-config openssl openjdk-25-jdk openjdk-25-jre openjdk-25-jre-headless python3-openssl python3-cryptography python3-distutils-extra libssl-dev pcre2-utils libpcre2-dev python3-dev python3-configobj libjavascriptcoregtk-6.0-dev libwebkitgtk-6.0-dev git libtool graphviz doxygen libjson-c-dev libgtest-dev
4.1.1 Ajout d'un swap sur disque
Certains modules requièrent pour se compiler avec l'option -j4 du make plus de RAM que la raspberryPi3 n'en possède physiquement, elle peut se figer. On peut tenter alors de passer avec l'option -j2 ou -j1 (qui utilise seulement 2 ou 1 des coeurs du processeur). Il est aussi possible d'ajouter un fichier de swap avec les commandes suivantes qui fournissent xxx Mo de swap, la compilation passe en -j4 mais la raspi3 swape choisissez l'option qui vous convient ! (Le swap est obligatoire si même en compilant avec un seul cœur il n'y a pas assez de mémoire)
- pour 512 M de mémoire xxx = 524288
- pour 1 Go de mémoire xxx = 1048576
- etc...
sudo su
dd if=/dev/zero of=/swapfile bs=1024 count=524288
chown root:root /swapfile
chmod 0600 /swapfile
mkswap /swapfile
swapon /swapfile
Pour vérifier l'activité :
swapon -s
free -m
4.1.2 Compilation d'un cmake récent
Dans les versions stables de debian armhf la version de cmake peut s'avérer en retard si c'est le cas compiler depuis les sources sinon installer le paquet standard. Attention la compilation de cmake peut s'avérer extrêmement longue.
cd
mkdir -p Logiciels/Cmake
cd Logiciels/Cmake
curl -o cmake-4.3.0.tar.gz https://github.com/Kitware/CMake/releases/download/v4.3.0/cmake-4.3.0.tar.gz
# ou
wget https://github.com/Kitware/CMake/releases/download/v4.3.0/cmake-4.3.0.tar.gz
tar xvfz cmake-4.3.0.tar.gz cmake-4.3.0
cd cmake-4.3.0
./bootstrap
# installer les packages manquants s'il y en a
make -j4
# Attention l'option -j4 requiert à certain moments beaucoup de mémoire,
# il faut passer les goulots d'étranglement avec -j2 ou du swap, on peut
# revenir ensuite en -j4
sudo make install
4.1.3 Ajout de fontes
Vérifier s'il ne manque pas des fontes, si oui les installer.
sudo dpkg -l fonts-liberation gsfonts libxfont-dev libfontenc-dev ttf-mscorefonts-installer xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xfonts-utils
sudo apt install fonts-liberation gsfonts libxfont-dev libfontenc-dev ttf-mscorefonts-installer xfonts-100dpi xfonts-75dpi xfonts-base xfonts-scalable xfonts-utils
4.1.4 Installation de Node.js
Node.js évolue très rapidement avec un souci peu prononcé des développeurs pour la compatibilité ascendante, il est souhaitable de vérifier s'il n'existe pas une nouvelle version compatible depuis l'écriture de ce blog, vérifier la version à jour sur le site Node.js. Pour faciliter le suivi de node.JS nous utiliserons l'outil nvm pour lequel il n'existe pas de paquet debian (nous installerons la version LTS et la dernière version stable à jour).
Il y a deux stratégies possibles pour utiliser nodejs nous utiliserons la stratégie par utilisateur qui est la plus souple via nvm qui permet de disposer de plusieurs versions de node en parallèle et de s'adapter aux compatibilités/incompatibilités entre node et les logiciels dépendant de lui.
Récupération et installation de nvm (stratégie par utilisateur) puis des versions de nodejs précompilées.Cette manipulation devra être répétée pour tous les utilisateurs souhaitant utiliser node.JS.
Vérifier la version à jour de nvm sur la forge github puis télécharger installer avec la commande suivante :
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.4/install.sh | bash
Si elles n'ont pas été automatiquement exécutées par le script ou si elles eont généré des messages d'erreur, exécuter les 3 commandes ci-dessous s :
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
verifier la situation.
source ~/.bashrc
nvm ls
# N/A
#iojs -> N/A (default)
#node -> stable (-> N/A) (default)
#unstable -> N/A (default)
Lister les versions disponibles et charger les versions de nodejs désirées.
nvm ls-remote
nvm install v24.14.0
Downloading and installing node v24.14.0...
Downloading https://nodejs.org/dist/v24.14.0/node-v24.14.0-linux-arm64.tar.xz...
######################################################################################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v24.14.0 (npm v11.9.0)
Creating default alias: default -> v24.14.0 *
nvm install v25.8.1
Downloading and installing node v25.8.1...
Downloading https://nodejs.org/dist/v25.8.1/node-v25.8.1-linux-arm64.tar.xz...
######################################################################################################################################## 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v25.8.1 (npm v11.11.0)
4.2 Compilation des logiciels de service pour les outils mraa, upm, jupyter
### 4.2.1 Récupération et construction du paquet swig
L'outil swig est complexe et évolue systématiquement après les évolutions des langages qu'il permet de traduire. nodeJS évolue rapidement et fréquemment et swig n'est pas toujours compatible avc la dernière version. De même les versions de C++ se succèdent et proposent de nouvelles fonctionnalités utilisées dans les compilations croisées. La création d'un jeu de compilations croisées est délicate et doit être menée avec précaution.
Il existe un paquet debian qui en général est en retard par rapport aux développements de swig (ai 11/03/2026 4.3.0-1 vs 4.4.1)
La méthode suivante permet de compiler la dernière version.
cd
mkdir -p Logiciels/Swig
cd Logiciels/Swig
wget https://github.com/swig/swig/archive/refs/tags/v4.4.1.tar.gz
tar xvfz v4.4.1.tar.gz
cd swig-4.4.1
npm install node-gyp
sudo apt install node-gyp
./autogen.sh
./configure
Si les choses se passent normalement on obtient le message qui indique que nous pourrons utiliser nos librairies croisées avec les 4 langages :
The SWIG test-suite and examples are configured for the following languages:
c java javascript perl5 python
poursuivre avec :
make -j4
sudo make install
4.2.2 Récupération et construction de zwave-js
On utilisait précédemment le logiciel libopenzwave mais ce dernier a été abandonné zwave-js semble un bon candidat pour le remplacer.
sudo addgroup zwave
sudo adduser ens-ife zwave
sudo mkdir /opt/Zwave-js
/opt/
sudo chown -R root:zwave Zwave-js
sudo chmod g+rwX Zwave-js
cd Zwave-js
npm init
This utility will walk you through creating a package.json file.
It only covers the most common items, and tries to guess sensible defaults.
See `npm help init` for definitive documentation on these fields
and exactly what they do.
Use `npm install <pkg>` afterwards to install a package and
save it as a dependency in the package.json file.
Press ^C at any time to quit.
package name: (zwave)
version: (1.0.0)
description: test d'utilisation zwave-js
entry point: (index.js)
test command:
git repository:
keywords:
author:
license: (ISC)
About to write to /opt/Zwave-js/package.json:
{
"name": "zwave",
"version": "1.0.0",
"description": "test d'utilisation zwave-js",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"author": "",
"license": "ISC"
}
Is this OK? (yes)
npm i zwave-js
Interface graphique
sudo mkdir /opt/Zwave-js-ui
cd /opt/
sudo chown -R root:zwave Zwave-js-ui
sudo chmod g+rwX Zwave-js-ui
cd Zwave-js-ui
git clone https://github.com/zwave-js/zwave-js-ui.git
cd zwave-js-ui
npm install
npm start
4.2.3 Récupération et construction du paquet openZwave
À titre conservatoire avant que toutes les migrations aient été effectuées on compile Openzwave
cd
mkdir -p Logiciels/OpenZwave
cd !$
git clone https://github.com/OpenZWave/open-zwave.git
cd open-zwave
make -j4
sudo doxygen -u
sudo make install
4.2.4 Récupération et construction du paquet modbus
cd
mkdir -p Logiciels/Modbus
cd !$
git clone https://github.com/stephane/libmodbus.git
cd libmodbus/
./autogen.sh
./configure
make -j4
sudo make install
En cas de problème utiliser avant ./configure.
libtoolize
aclocal
autoheader
autoconf
automake --add-missing
4.2.5. Récupération et construction du paquet tinyb
TinyB est obsolète la source est accessible mais ne se compile pas.
dpkg -l libglib2.0-dev
# si manquante
sudo apt install libglib2.0-dev
cd ~/Logiciels
mkdir Tinyb
cd Tinyb
git clone https://github.com/intel-iot-devkit/tinyb.git
cd tinyb/
AJouter #include <string> dans api/tinyb/BluetoothObject.hpp si problème de compilation avec ‘std::string’
mkdir build
cd build/
cmake -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_POLICY_VERSION_MINIMUM=4.2 ..
make -j4
sudo make install
sudo apt install bluez-test-scripts bluez-tools
5. Installation et mise à jour des logiciels de développement et de programmation
5.1 Outils pour l'apprentissage de la programmation
-> Fin temporaire de la correction de l'article <-
5.2 Outils pour l'apprentissage de la programmation
5.1.1 Récupération et Construction de mraa et upm
Certains modules requièrent beaucoup de RAM pour se compiler avec l'option -j4 choisir l'option -j2 (qui utilise seulement 2 des coeurs du processeur) ou le swap la compilation passe en -j4 mais la raspi3 swape choisissez l'option qui vous convient !
cd
mkdir -p Logiciels/IoT
cd !$
git clone https://github.com/eclipse/mraa.git
git clone https://gitcode.com/eclipse-org/mraa.git
git clone https://github.com/eclipse/upm.git
5.1.1.1. MRAA
dpkg -l nodejs-dev libjson-c-dev python3-dev
sudo apt install nodejs-dev libjson-c-dev python3-dev
sudo apt install libnative-platform-jni
cd mraa
jed CMakeLists.txt
# add
# cmake_policy(SET CMP0148 NEW)
# cmake_policy(SET CMP0177 NEW)
# check
# option (BUILDSWIGNODE "Build swig node modules." ON)
# option (BUILDSWIGJAVA "Build Java API." ON)
# option (USEPYTHON3TESTS "Force tests to run with python3" ON)
# check JAVA_HOME sinon
# export JAVA_HOME=/usr/lib/jvm/java-25-openjdk-arm64
jed src/mraa.c
#transformer
if (mraa_file_exist("/sys/class/i2c-dev/i2c-0"))
#en
if (mraa_file_exist("/sys/class/i2c-dev/i2c-0") || mraa_file_exist("/sys/class/i2c-dev/i2c-1"))
mkdir build
cd build
cmake -DCMAKE_MODULE_PATH=/usr/local/share/cmake-4.3/Modules/ -DCMAKE_INSTALL_PREFIX=/usr -DBUILDSWIGPYTHON=ON ..
# cmake -Wno-dev -DCMAKE_INSTALL_PREFIX=/usr ..
cmake .. -Wno-dev -DCMAKE_INSTALL_PREFIX=/usr
-DENABLEEXAMPLES=0
-DBUILDSWIGNODE=ON
-DSWIG_EXECUTABLE=/usr/local/bin/swig
-DV8_ROOT_DIR=/usr/local/include/node
-DNODE_ROOT_DIR=/usr/local/include/node
-DPYTHON2LIBS_FOUND=FALSE
-DPYTHON2INTERP_FOUND=FALSE
rm -r ./*;cmake -DCMAKE_MODULE_PATH=/usr/local/share/cmake-4.3/Modules/ -DCMAKE_INSTALL_PREFIX=/usr ..
cd Logiciels/IoT/mraa/cmake/modules/
jed OpenCVDetectPython.cmake
Différence actuelle entre les fichiers OpenCVDetectPython.cmake original et opérationnel. Le travail doit être poursuivi mais comme une bibliothèque mraa opérationnelle a été produite, ele sera utilisé pour compiler upm. Un retour ultérieur sera effectué pour résoudre cette question.
doc
diff OpenCVDetectPython.cmake OpenCVDetectPython.orig
34c34,37
< find_package(Python3 COMPONENTS Interpreter Development)
---
> find_package(PythonInterp "${preferred_version}")
> if(NOT PYTHONINTERP_FOUND)
> find_package(PythonInterp "${min_version}")
> endif()
36c39
< if(Python3_FOUND)
---
> if(PYTHONINTERP_FOUND)
38,48c41,46
< set(_found ${Python_FOUND})
< set(_executable ${Python_EXECUTABLE})
< set(_version_string ${Python_VERSION})
< set(_version_major ${Python_VERSION_MAJOR})
< set(_version_minor ${Python_VERSION_MINOR})
< set(_version_patch ${Python_VERSION_PATCH})
< set(_libs_found ${Python_Development_FOUND})
< set(_libraries ${Python_LIBRARIES})
< set(_include_path ${Python_INCLUDE_DIR})
< set(_include_dirs ${Python_INCLUDE_DIRS})
< set(_include_dir ${Python_INCLUDE_DIR})
---
> set(_found ${PYTHONINTERP_FOUND})
> set(_executable ${PYTHON_EXECUTABLE})
> set(_version_string ${PYTHON_VERSION_STRING})
> set(_version_major ${PYTHON_VERSION_MAJOR})
> set(_version_minor ${PYTHON_VERSION_MINOR})
> set(_version_patch ${PYTHON_VERSION_PATCH})
51,57c49,54
< unset(Python_FOUND)
< unset(Python_EXECUTABLE CACHE)
< unset(Python_VERSION)
< unset(Python_VERSION_MAJOR)
< unset(Python_VERSION_MINOR)
< unset(Python_VERSION_PATCH)
<
---
> unset(PYTHONINTERP_FOUND)
> unset(PYTHON_EXECUTABLE CACHE)
> unset(PYTHON_VERSION_STRING)
> unset(PYTHON_VERSION_MAJOR)
> unset(PYTHON_VERSION_MINOR)
> unset(PYTHON_VERSION_PATCH)
67c64
< find_package(Python COMPONENTS Development "${_version_major_minor}")
---
> find_package(PythonLibs "${_version_major_minor}")
69c66
< find_package(Python COMPONENTS Development "${_version_major_minor}.${_version_patch}" EXACT)
---
> find_package(PythonLibs "${_version_major_minor}.${_version_patch}" EXACT)
72c69
< if(Python_Development_FOUND)
---
> if(PYTHONLIBS_FOUND)
74,77c71,74
< set(_libs_found ${Python_Development_FOUND})
< set(_libraries ${Python_LIBRARIES})
< set(_include_path ${Python_INCLUDE_DIR})
< set(_include_dirs ${Python_INCLUDE_DIRS})
---
> set(_libs_found ${PYTHONLIBS_FOUND})
> set(_libraries ${PYTHON_LIBRARIES})
> set(_include_path ${PYTHON_INCLUDE_PATH})
> set(_include_dirs ${PYTHON_INCLUDE_DIRS})
84,85c81,82
< set(_include_dir ${Python_INCLUDE_DIR})
< # set(_include_dir2 ${PYTHON_INCLUDE_DIR2})
---
> set(_include_dir ${PYTHON_INCLUDE_DIR})
> set(_include_dir2 ${PYTHON_INCLUDE_DIR2})
102c99
< # unset(PYTHON_INCLUDE_DIR2 CACHE)
---
> unset(PYTHON_INCLUDE_DIR2 CACHE)
141c138
< #set(MIN_VER_PYTHON2 2.7)
---
> set(MIN_VER_PYTHON2 2.7)
144,150c141,146
< #find_python(2.7 "${MIN_VER_PYTHON2}" PYTHON2_LIBRARY PYTHON2_INCLUDE_DIR
< # PYTHON2INTERP_FOUND PYTHON2_EXECUTABLE PYTHON2_VERSION_STRING
< # PYTHON2_VERSION_MAJOR PYTHON2_VERSION_MINOR PYTHON2LIBS_FOUND
< # PYTHON2LIBS_VERSION_STRING PYTHON2_LIBRARIES PYTHON2_LIBRARY
< # PYTHON2_DEBUG_LIBRARIES PYTHON2_LIBRARY_DEBUG PYTHON2_INCLUDE_PATH
< # PYTHON2_INCLUDE_DIR PYTHON2_INCLUDE_DIR2 PYTHON2_PACKAGES_PATH)
<
---
> find_python(2.7 "${MIN_VER_PYTHON2}" PYTHON2_LIBRARY PYTHON2_INCLUDE_DIR
> PYTHON2INTERP_FOUND PYTHON2_EXECUTABLE PYTHON2_VERSION_STRING
> PYTHON2_VERSION_MAJOR PYTHON2_VERSION_MINOR PYTHON2LIBS_FOUND
> PYTHON2LIBS_VERSION_STRING PYTHON2_LIBRARIES PYTHON2_LIBRARY
> PYTHON2_DEBUG_LIBRARIES PYTHON2_LIBRARY_DEBUG PYTHON2_INCLUDE_PATH
> PYTHON2_INCLUDE_DIR PYTHON2_INCLUDE_DIR2 PYTHON2_PACKAGES_PATH)
153c149
< Python_FOUND PYTHON3_EXECUTABLE PYTHON3_VERSION_STRING
---
> PYTHON3INTERP_FOUND PYTHON3_EXECUTABLE PYTHON3_VERSION_STRING
158,183d153
<
<
<
< #find_python(3 "${MIN_VER_PYTHON3}" )
< #Python_LIBRARY_DIRS Python_INCLUDE_DIR
< # Python_FOUND Python_EXECUTABLE Python_VERSION)
< # PYTHON3_VERSION_MAJOR PYTHON3_VERSION_MINOR PYTHON3LIBS_FOUND
< # PYTHON3LIBS_VERSION_STRING PYTHON3_LIBRARIES PYTHON3_LIBRARY
< # PYTHON3_DEBUG_LIBRARIES PYTHON3_LIBRARY_DEBUG PYTHON3_INCLUDE_PATH
< # PYTHON3_INCLUDE_DIR PYTHON3_INCLUDE_DIR2 PYTHON3_PACKAGES_PATH)
<
< #find_python(3
< # set(_found ${Python_FOUND})
< # set(_executable ${Python_EXECUTABLE})
< # set(_version_string ${Python_VERSION})
< # set(_version_major ${Python_VERSION_MAJOR})
< # set(_version_minor ${Python_VERSION_MINOR})
< # set(_version_patch ${Python_VERSION_PATCH})
< # set(_libs_found ${Python_Development_FOUND})
< # set(_libraries ${Python_LIBRARIES})
< # set(_include_path ${Python_INCLUDE_DIR})
< # set(_include_dirs ${Python_INCLUDE_DIRS})
< # set(_include_dir ${Python_INCLUDE_DIR})
<
<
<
185c155
< if(Python_EXECUTABLE)
---
> if(PYTHON_DEFAULT_EXECUTABLE)
187c157
< elseif(Python_FOUND) # Use Python 3 as default Python interpreter
---
> elseif(PYTHON3INTERP_FOUND) # Use Python 3 as default Python interpreter
---------------->> ici
Au 14/02/2022 le patch de @nxhack pour swig et javascript est nécessaire pour parvenir à compiler mraa. Fixer ensuite l'environnement java et lancer la compilation. Ajouter la compilation des interfaces java et nodejs en modifiant le fichier CMakeLists avec les valeurs ci-dessous.
Il est nécessaire de prendre en compte l'existence de /dev/i2c-1 sans /dev/i2c-0 car le code requiert qu'il existe le bus 0 (une demande de modification est en cours sur ecclipse), modifier le fichier src/mraa.c . Il est aussi nécessaire de créer le lien symbolique de /dev/i2c-1 vers /dev/i2c-0 la solution sudo ln -s /dev/i2c-1 /dev/i2c-0 est opérationnelle mais ne fonctionne que pour la session en cours, pour créer un lien définitif il est nécessaire de créer une règle udev.
jed CMakeLists.txt
option (BUILDSWIGNODE "Build swig node modules." ON)
option (BUILDSWIGJAVA "Build Java API." ON)
option (USEPYTHON3TESTS "Force tests to run with python3" ON)
jed src/mraa.c
#transformer
if (mraa_file_exist("/sys/class/i2c-dev/i2c-0"))
#en
if (mraa_file_exist("/sys/class/i2c-dev/i2c-0") || mraa_file_exist("/sys/class/i2c-dev/i2c-1"))
wget https://patch-diff.githubusercontent.com/raw/eclipse/mraa/pull/1064.patch
patch -p1 < 1064.patch
mkdir build
cd build
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-armhf
#export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-arm64 # pi4-64
# cmake -Wno-dev -DCMAKE_INSTALL_PREFIX=/usr ..
cmake .. -Wno-dev -DCMAKE_INSTALL_PREFIX=/usr -DENABLEEXAMPLES=0 -DBUILDSWIGNODE=ON -DSWIG_EXECUTABLE=/usr/local/bin/swig -DV8_ROOT_DIR=/usr/local/include/node -DNODE_ROOT_DIR=/usr/local/include/node -DPYTHON2LIBS_FOUND=FALSE -DPYTHON2INTERP_FOUND=FALSE
make -j4
sudo make install
En cas de besoin il est possible d'effacer ce qui a été installé par les compilations précédentes.
sudo rm -r /usr/include/mraa* /usr/lib/arm-linux-gnueabihf/pkgconfig/mraa.pc /usr/lib/arm-linux-gnueabihf/libmraa* /usr/lib/python2.7/dist-packages/*mraa* /usr/lib/python3.7/dist-packages/*mraa* /usr/lib/node_modules/mraa /usr/share/mraa/examples /usr/bin/mraa*
ls
sudo rm -r /usr/include/upm /usr/lib/python2.7/dist-packages/upm /usr/lib/python3.7/dist-packages/upm /usr/lib/arm-linux-gnueabihf/pkgconfig/upm* /usr/lib/node_modules/jsupm* /usr/lib/arm-linux-gnueabihf/libupm* /usr/share/upm
5.1.1.2. UPM
cd ~/Logiciels/IoT/upm
jed CMakeLists.txt
option (BUILDSWIGNODE "Build swig node modules." ON)
option (BUILDSWIGJAVA "Build Java API." ON)
# remplacer c11 par c23
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
sudo jed /usr/local/share/cmake-4.3/Modules/UseSWIG.cmake
ligne 1110
function(TARGET_LINK_LIBRARIES name)
#function(SWIG_LINK_LIBRARIES name)
wget https://github.com/eclipse/upm/pull/703/commits/c7d7718c21828883a4d8eea585b89185a1eaf150.patch
mv c7d7718c21828883a4d8eea585b89185a1eaf150.patch upmNXHack.patch
patch -p1 < upmNXHack.patch
Ajouter la compilation des interfaces nodeJS java en modifiant le fichier CMakeLists comme indiqué ci-dessous et modifier la version du compilateur 11 -> 23 :
jed CMakeLists.txt
option (BUILDSWIGNODE "Build swig node modules." ON)
option (BUILDSWIGJAVA "Build Java API." ON)
# remplacer c11 par c23
Créer le dossier de travail et lancer la compilation.
mkdir build
cd build
cmake -Wno-dev -DWERROR=off -DCMAKE_INSTALL_PREFIX=/usr ..
make -j4
sudo make install
Dans certaines situations(maintenant peut-être révolues) il a été nécessaire de recopier les modules python depuis build/src/*/python?.?/*.py vers /usr/lib/dist-packages/upm
# from build folder
for i in python2.7 python3.9 ; do sudo cp src/*/$i/*.py /usr/lib/$i/dist-packages/upm/; done
for i in python2.7 python3.9sudo ; do sudo cp interfaces/$i/*.py /usr/lib/$i/dist-packages/upm/; done
Les programmes sont directement accessibles depuis les librairies python2, python3, Java, Javascript, C, C++.
À partir de ce point la mise à jour n'a pas encore été effectuée
4.6 Modification des accès au GPIO et à la caméra
Pour un fonctionnement sécurisé permettant l'accès de plusieurs utilisteurs au bus GPIOsans privilèges particuliers il est nécessaire d'opérer certaines modifications donnant à un utilisateur ordinaire membre du groupe gpiole droit d'accéder aux ressources connectées au bus GPIO. On rajoute le fichier 50-gpio.rules au répertoire /etc/udev/rules.d avec la commande ci-dessous et on ajoute le contenu suivant (on termine avec Ctrl-D):
sudo su
cat > /etc/udev/rules.d/50-gpio.rules
SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio; \
chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio; \
chown -R root:gpio /sys/devices/platform/soc/3f200000.gpio && chmod -R 770 /sys/devices/platform/soc/3f200000.gpio; \
chown -R root:gpio /sys/devices/platform/soc/soc:virtgpio && chmod -R 770 /sys/devices/platform/soc/soc:virtgpio; \
chown -R root:gpio /sys/bus/platform/drivers/pinctrl-bcm2835 && chmod -R 770 /sys/bus/platform/drivers/pinctrl-bcm2835 '"
SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="gpio", MODE="0660"
SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", \
PROGRAM="/bin/sh -c 'chown root:gpio /sys/class/gpio/export /sys/class/gpio/unexport ; \
chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'"
SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c \
'chown root:gpio /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; \
chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'"
Pour l'utilisation du SPI Le fichier 50-gpio.rules doit être modifié il prend la forme suivante :
SUBSYSTEM=="gpio*", PROGRAM="/bin/sh -c 'chown -R root:gpio /sys/class/gpio && chmod -R 770 /sys/class/gpio; \
chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio; \
chown -R root:gpio /sys/devices/platform/soc/fe200000.gpio && chmod -R 770 /sys/devices/platform/soc/fe200000.gpio; \
chown -R root:gpio /sys/devices/platform/soc/soc:virtgpio && chmod -R 770 /sys/devices/platform/soc/soc:virtgpio; \
chown -R root:gpio /sys/bus/platform/drivers/pinctrl-bcm2835 && chmod -R 770 /sys/bus/platform/drivers/pinctrl-bcm2835 '"
SUBSYSTEM=="spidev*", PROGRAM="/bin/sh -c 'chown -R root:gpio /sys/class/spidev && chmod -R 770 /sys/class/spidev; \
chown -R root:gpio /sys/devices/platform/soc/fe204000.spi/spi_master/spi0/spi0.0/spidev && \
chmod -R 770 /sys/devices/platform/soc/fe204000.spi/spi_master/spi0/spi0.0/spidev; \
chown -R root:gpio /dev/spidev0.0 && chmod -R 770 /dev/spidev0.0'"
SUBSYSTEM=="bcm2835-gpiomem", KERNEL=="gpiomem", GROUP="gpio", MODE="0660"
SUBSYSTEM=="gpio", KERNEL=="gpiochip*", ACTION=="add", \
PROGRAM="/bin/sh -c 'chown root:gpio /sys/class/gpio/export /sys/class/gpio/unexport ; \
chmod 220 /sys/class/gpio/export /sys/class/gpio/unexport'"
SUBSYSTEM=="gpio", KERNEL=="gpio*", ACTION=="add", PROGRAM="/bin/sh -c \
'chown root:gpio /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value ; \
chmod 660 /sys%p/active_low /sys%p/direction /sys%p/edge /sys%p/value'"
on modifie aussi la ligne de commande dans /boot/cmdline.txt en ajoutant en fin de ligne spidev.bufsiz=32768 et enfin on ajoute l'activation du bus SPI et le contrôle de la fréquence dans le fichier /boot/config.txt pour contrôler un rubande leds librairie rpi_ws281x
dtparam=spi=on # activation du bus SPI
# to use SPI for ledstrip
core_freq_min=500 # pour la raspi4
# core_freq=250 # pour la pi3
Attention aux conflits en activant le bus SPI
Tout comme le GPIO l'USB n'est pas accessible aux utilisateurs de base , l'utilsateur weewx est un utilisateur non privilégié qui doit pouvoir accéder à la station via une interface USB on ajoute au même endroit le fichier 40-usbweewx.rules avec la commande
cat > /etc/udev/rules.d/40-usbweewx.rules
on ajoute le contenu suivant :
# make any te923 station connected via usb accessible to non-root
SUBSYSTEM=="usb", ATTR{idVendor}=="1130", ATTR{idProduct}=="6801", ACTION=="add", GROUP="weewx", MODE="0664"
# make any Vantage Pro2 station connected via usb accessible to non-root
#SUBSYSTEM=="usb", ATTR{idVendor}=="10c4", ATTR{idProduct}=="ea60", ACTION=="add", GROUP="weewx", MODE="0664"
Lorsque la caméra est connectée, son accès est réservé par défaut à l'administrateur il est nécessaire d'ajouter un fichier de configuration supplémentaire 60-cam.rules au répertoire /etc/udev/rules.d avec la commnde sudo nano ./etc/udev/rules.d/60-cam.rules et on ajoute le contenu suivant :
cat > /etc/udev/rules.d/60-cam.rules
SUBSYSTEM=="vchiq", GROUP="video", MODE="0660"
SUBSYSTEM=="vc-sm",GROUP="video",MODE="0660"
SUBSYSTEM=="bcm2708_vcio",GROUP="video",MODE="0660"
Dès que la caméra sera détectée (voir plus loin) tous les membres du groupe video pourront l'utiliser.
5. Utilisation de la Raspberrry en point d'accès web (Hotspot)
Les images proposées permettent d'utiliser la Raspberry Pi au sein d'un réseau existant, il est aussi possible de la transformer en point d'accès sur un WIFI qu'elle crée et administre avec ou pas des fonctions de passerelle vers internet.
Il est possible grace à l'interface graphique de connman de créer un réseau wifi dont la raspberry est le routeur, suivre la documentation pour activer le tethering.
Construire soi même une interface réseau avec des contraintes particulières est abordé dans un autre article de ce blog. Attention mettre en oeuvre cette configuration perturbe les règles de sécurité énoncées ici, veillez à bien configurer votre réseau en fonction de vos besoins et contraintes.
6. Configurations particulières avancées
La suite des configurations ajoute quelques services utiles.
6.1 Image buster ou bullseye "tous terrains Raspberry Pi 3 3B+ou 4" permettant entre autres l'apprentissage de la programmation
6.1.1 Compilation d'un cmake récent
6.1.2 Ajout de fontes
6.1.3 Activation de la caméra raspberry Pi
L'activation de la caméra se passe en deux étapes car par défaut la détection de la caméra n'est pas activée, cette situation est probablement due à la volonté de ne pas "gaspiller les ressources limitées de la Raspberry. Dans cette optique il est conseillé de n'activer la caméra qu'uniquement quand on va l'utiliser car contrairement à d'autres fonctionnalités celle ci immobiliose des ressources.
6.1.3.1 Détection de la caméra et accélération graphique
Pour détecter la camera ou permettre l'accélération graphique pour la Pi4 il est nécesaire de modifier la configuration du fichier de boot avec la commande sudo nano /boot/firmware/config.txt la fin du fichier est recopiée ci-dessous. Pour les Pi4 du fait de l'activation de l'accélérateur 128Mo de mémoire sont déjà affectés au proc graphique il reste seulement à activer le start_x.
gpu_mem=16
initramfs initramfs-4.13.16-v7 followkernel
dtparam=i2c_arm=on
dtparam=spi=on
La modifier pour lui donner l'aspect suivant
initramfs initramfs-4.13.16-v7 followkernel
dtparam=i2c_arm=on
dtparam=spi=on
gpu_mem=16 # Comment this line when activating the camera to provide more memory
# camera activation
# To activate camera at least uncomment the two following lines
# AND comment the line above gpu_mem=16
#
#start_x=1 # essential
#gpu_mem=128 # at least, or maybe more if you wish
#
Pour activer la camera il faut commenter la ligne gpu_mem=16 et décommenter les deux lignes start_x=1 et gpu_mem=128 puis impérativement rebooter. Une fois le reboot effectué si la caméra est connectée elle apparait aux côtés des autres périphériques sous le nom /dev/vchiq
Pour l'accélération graphique de la Pi4 la configuration est correcte (caméra non activée) elle doit être de la forme :
# uncomment to overclock the arm. 700 MHz is the default.
#arm_freq=800
force_turbo=1
boot_delay=1
dtoverlay=pi3-disable-bt
enable_uart=0
initramfs initramfs-5.10.7-v8 followkernel
dtparam=i2c_arm=on
dtparam=spi=on
max_framebuffers=2
arm_64bit=1
cmdline=cmdline.txt
dtparam=audio=on
gpu_mem=128
dtoverlay=vc4-fkms-v3d, cma-128
6.1.3.2 Ajout des logiciels de pilotage de la caméra
La caméra et le module de pilotage ne sont hélas pas des modules standard de la distribution Debian et il est hélas nécessaire de les compiler. La manipulation a effectuer est détaillée ci-dessous :
Créer un répertoire d'accueil des programmes puis se positionner dans ce dossier. Télécharger les outils de compilation croisée puis les sources des librairies qui seront utilisées.
cd
mkdir -p Logiciels/Cam
cd !$
git clone https://github.com/raspberrypi/userland.git
se déplacer dans le dossier userland reçu et taper la commande ./buildme qui lance la création des logiciels nécesaires à la mise en oeuvre de la caméra, pour une architercure 644 bits ajouter l'option --aarch64.
cd userland
./buildme [--aarch64]
L'exécution devrait se passer sans encombre et tous les outils nécessaires sont stockés dans le dossier /opt/vc. Pour que les programmes trouvent ces librairies il est nécessaire de rajouter un fichier dans le répertoire listant les librairies utilisées avec la commande sudo nano /etc/ld.so.conf.d/userland.conf en ajoutant dans le fichier :
#Access to Userland libraries
/opt/vc/lib
Appliquer la transformation avec sudo ldconfig
Recopier ensuite le contenu des docciers de /opt/vc hormis lib et src dans /usr/local :
cd build
for i in bin include [sbin] [share]; do sudo cp -r /opt/vc/$i/* /usr/local/$i; done
Pour utiliser la caméra avec un utilisateur non root et si cela n'a pas été fait dans la phase initiale ne pas oublier d'ajouter dans /etc/udev/rules.d le fichier 60-cam.rules avec la commande sudo nano /etc/udev/rules.d/60-cam.rules avec le contenu suivant :
SUBSYSTEM=="vchiq", GROUP="video", MODE="0660"
À chaque démarrage le groupe video sera autorisé à acccéder à la resource /dev/vchiq ; cela peut être fait manuellement pour cela en cas de besoin exécuter les deux commandes suivantes :
sudo chown root.video /dev/vchiq
sudo chmod g+rw !$
# En cas de problème pour avoir les infos sur /dev/vchiq
sudo udevadm info --name=/dev/vchiq
Pour prendre une photo utiliser la commande : raspistill -q 100 -o tetst.jpg -w 1280 -h 720 -v (de nombreuses options sont disponibles). Pour streamer une video sur le serveur rtmp tremplin de l'ENS :
raspivid -t 0 -w 640 -h 360 -o - | ffmpeg -re -i - -c:v libx264 -f flv rtmp://visioweb.tremplin.ens-lyon.fr/live/XXXXXX ; XXXXX est le mot de passe servant à ouvrir le flus de lecture. Il est certainement possible d'améliorer le rendu et la fluidité mais la gestion des paramètres reste délicate. Il est possible aussi que les paramètres de boot notamment la mémoire vidéo aient une importance.
Les outils de lafamille raspi sont installés via tools.git en cas de besoin mais non utiles et non déployés dans ce tutoriel, attention le déploiement de ces outils occupe une place importante.
git clone https://github.com/raspberrypi/tools.git
6.1.4 Activation du réseau WIFI et du réseau filaire pour la production
Comme nous l'avons vu plus haut l'interface réseau filaire est configurée de façon générique pour se connecter à tout réseau disponible. Cette connexion est suffisante pour réaliser toutes les configurations proposées dans ce document mais inadéquate pour une utilisation en production. Cependant la mise en place d'une configuration avancée adaptée à une interface particulière et un réseau particulier "figera" la situation et il faudra reconfigurer l'interface pour se connecter à un autre réseau. On devra réutiliser une des méthodes décrites dans le chapitre consacré au réseau adaptée aux besoins des utilisateurs
Si l'image en cours de création est destinée à être partagée avec d'autres usagers qui la cloneront il est recommandé de ne pas configurer le réseau filaire ni le WIFI comme expliqué ci-dessous, ce devra être fait par l'utilisateur final avec ses paramètres personnels; Si l'image en cours de création est destinée à être directement utilisée la configuration ci-dessous doit être effectuée
Si lors de la configuration une interface secondaire parasite est créée utiliser les commandes suivantes pour s'en débarrasser :
ip addr flush dev wlan0
sudo shutdown -r
6.1.4.1 Configurer le réseau filaire
Pour configurer le réseau filaire il peut être nécessaire de supprimer la désignation générique de l'interface (eth0) et la remplacer par la valeur construite au boot à partir de l'adresse Mac (Attention Cette valeur est unique et désigne une seule Raspberry Pi "physique" l'image sera donc inadaptée à toute autre Raspberry Pi !). On obtient le nom de l'interface réseau par la commande ip token.
Si la valeur est eth0 c'est que la version antérieure de la configuration a été utilisée lors de la création de l'image et dans ce cas le nom de l'interface est toujours le même aucune manipulation ne doit être effectuée.
Si la valeur diffère de eth0 elle doit être substituée à la valeur générique enx* figurant dans le fichier 50-wired.network.
Name=enx#########
Host=raspife3
6.1.4.2 Configurer le WIFI
La configuration du WIFI est plus délicate car il est nécessaire de fournir des mots de passe ou des paramètres propres à chaque réseau comme cela a été décrit plus haut. Il est bien sûr possible de "remplir à la main" les fichiers de configuration mais toute erreur même minime (espace oublié, majuscule/minuscule, etc...) risque d'entrainer l'arrêt du réseau. D'autre part ce travail impose la manipulation par l'administrateur de données confidentielles en clair ce qui est à proscrire pour un usager ordinaire. Il est donc préférable d'utiliser les outils graphiques standards via la connexion au terminal serveur installé plus haut. (La seule exception à cette règle concerne la création d'une connexion via eduroam qui requiert que l'on ajoute à la main le fichier spécifique pour l'eduroam utilisé dans /var/lib/connman)
On se connecte avec un outil d'affichage de terminal à distance utilisant le protocole VNC ou xrdp, par défaut les services VNC et xrdp sont portés par tsuser et le mot de passe configuré plus haut. Le logiciel installé par défaut est connman (cf plus haut). Cliquer en bas à droite dans la barre de menus sur l'icône réseau, la panneau affiché apparaît configurer le réseau WIFI que l'on souhaite utiliser. Si l'icone réseau n'apparait pas lancer dans le menu des applications connmanUI.
6.2 Installation et mise à jour de l'environnement logiciel
La première étape de l'installation consiste à créer pour chaque logiciel un espace pour stocker les codes puis de les télécharger dans cet espace depuis les forges opensource ou libres. Nous allons créer une hierarchie de dossiers ayant pour racine le dossier Logiciels; on y retrouvera par exemple un dossier IoT (Internet of Things) contenant un dossier mraa et un dossier upm.
6.2.1 Récupération et installation de Node.js
**ATTENTION-1 en ce moment 2022-01 la compilation croisée de mraa et upm avec nodejs ne fonctionne qu'avec l'application d'un patch ** (voir plus bas).
ATTENTION-2 il n'existe pas de version nodeJS pour armel, la compilation croisée standard sur debian échoue ainsi que la compilation sur la PiZero nodeJS est désactivésur la PiZero
Node.js évolue très rapidement avec un souci peu prononcé pour la compatibilité ascendante, il est souhaitable de vérifier s'il n'existe pas une nouvelle version compatible depuis l'écriture de ce blog, vérifier la version à jour sur le site Node.js nous utiliserons ici la version 16.11.0 avec npm 8.0.0).
Il y a deux stratégies possibles pour utiliser nodejs la première est une stratégie par utilisateur qui est la plus souple en utilisant nvm qui permet de disposer de plusieurs versions de node en parallèle et de s'adapter aux compatibilités/incompatibilités entre node et le reste de l'environnement. Pour le projet Tremplin il nous semble plus pertinent d'installer ce logiciel comme une ressource commune afin que tous les usagers soient dans la même situation et en cas de besoin il est simple pour chacun d'ajouter nvm dans son espace personnel.
6.2.1.1 Récupération et installation de nvm (stratégie par utilisateur non déployée par défaut)
Vérifier la version à jour de nvm sur la forge github puis télécharger installer avec la commande suivante :
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
Pour lancer nvm la première fois exécuter les 3 commandes ci-dessous si elles n'ont pas été automatiquement exécutées par le script ou si elles eont généré des messages d'erreur :
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"
verifier la situation et charger les versions de nodejs désirées (ici la dernière stable tet la LTS puis on utilise la dernière version).
source ~/.bashrc
nvm ls
# N/A
#iojs -> N/A (default)
#node -> stable (-> N/A) (default)
#unstable -> N/A (default)
nvm install 16.11.0
#Downloading and installing node v16.11.0...
#Downloading https://nodejs.org/dist/v16.11.0/node-v16.11.0-linux-armv7l.tar.xz...
####################################################################### 100,0%
#Computing checksum with sha256sum
#Checksums matched!
#Now using node v16.11.0 (npm v8.0.0)
#Creating default alias: default -> 16.11.0 (-> v16.11.0)
nvm install 14.18.0
#Downloading and installing node v14.18.0...
#Downloading https://nodejs.org/dist/v14.18.0/node-v14.18.0-linux-armv7l.tar.xz...
####################################################################### 100,0%
#Computing checksum with sha256sum
#Checksums matched!
#Now using node v14.18.0 (npm v6.14.15)
ens-ife@raspife4:~$ nvm use 16.11.0
#Now using node v16.11.0 (npm v8.0.0)
Pour supprimer nvm et toutes les versions installées enlever les lignes contenant NVM dans .bashrc pui supprimer le dossier .nvm :
rm -r ~/.nvm
6.2.1.2 Récupération et installation de nodejs
Créer le dossier pour accueillir le logiciel et le télécharger.
cd
mkdir -p Logiciels/Node
cd !$
Deux méthodes sont possibles soit on utilise les binaires précompilés soit on utilise les source sque l'on recompile pour les raspi 2-3 les versions précompilées fonctionnent correctement ainsi que pour les pi4 32 bits et Pi4-64 bits, pour la Pi0 il faut recompiler.
Vérifier la version et télécharger depuis le site le binaire ou les sources de la version choisie (ici 16.11.0)
#Téléchargement des binaires pour PI3 32 bits
wget https://nodejs.org/dist/v17.0.1/node-v17.0.1-linux-armv7l.tar.xz
tar xvfJ node-v17.0.1-linux-armv7l.tar.xz
cd node-v17.0.1-linux-armv7l
for i in bin include lib share; do sudo cp -r $i/* /usr/local/$i; done
#Téléchargement des binaires pour PI4 en 64 bits
# wget https://nodejs.org/dist/v17.0.1/node-v17.0.1-linux-arm64.tar.xz
# tar xvfJ node-v17.0.1-linux-arm64.tar.xz
# cd node-v17.0.1-linux-arm64
# for i in bin include lib share; do sudo cp -r $i/* /usr/local/$i; done
#
#Téléchargement des binaires pour PiZero
#wget https://unofficial-builds.nodejs.org/download/release/v17.5.0/node-v17.5.0-linux-armv6l.tar.xz
#tar xf node-v17.5.0-linux-armv6l.tar.xz
#for i in bin include lib share; do sudo cp -r $i/* /usr/local/$i; done
#Téléchargement de la source
# Si PiO ou Pi1 ou PI4-64 les versions récentes peuvent ne pas contenir de version binaire compilée il faut utiliser la source.
# wget https://nodejs.org/dist/v17.3.0/node-v17.3.0.tar.gz
#tar xvfJ node-v17.3.0.tar.gz
#cd node-v17.3.0
#./configure
#make
#sudo make install
# la compilation se chiffre en ... jours sur la Pi0!
Création des liens supplémentaires
sudo ln -s /usr/local/bin/node /usr/local/bin/nodejs
sudo npm install -g --upgrade npm node-gyp configurable-http-proxy
6.2.2 Récupération et construction du paquet swig
L'outil swig est complexe et évolue systématiquement après les évolutions des langages qu'il permet de traduire. nodeJS évolue rapidement et fréquemment et swig n'est pas toujours compatible avc la dernière version. De même les versions de C++ se succèdent et proposent de nouvelles fonctionnalités utilisées dans les compilations croisées. La création d'un jeu de compilations croisées est délicate et doit être menée avec précaution. Le tableau ci-dessous présente les combinaisons qui ont été testées opérationnellement. les tests ne sont pas exhaustifs et il peut subsister quelques incompatibilités. Merci de nous les signaler.
| version de node | version de swig |
|---|---|
| 10.16.3 | 4.0.1 |
| 10.19.0 | 4.0.2 |
| 15.0.1 | 4.1.0 |
| 16.11.0 | 4.1.0 |
| 17.0.1 |
cd
mkdir -p Logiciels/Swig
cd !$
git clone -b master --single-branch https://github.com/swig/swig.git
cd swig
./autogen.sh
./configure
SI les choses se passent normalement on obtient le message qui indique que nous pourrons utiliser nos librairies croisées avec les 4 langages :
The SWIG test-suite and examples are configured for the following languages:
java javascript perl5 python
poursuivre avec :
make -j4
sudo make install
sudo dpkg -l libjavascriptcoregtk*
sudo apt install libjavascriptcoregtk-4.0-dev
sudo ln -s /usr/include/webkitgtk-4.0/JavaScriptCore /usr/include/JavaScriptCore
6.2.3 Récupération et construction du paquet libopenzwave
cd
mkdir -p Logiciels/OpenZwave
cd !$
git clone https://github.com/OpenZWave/open-zwave.git
cd open-zwave
make -j4
sudo make install
sudo doxygen -u
6.2.4 Récupération et construction du paquet modbus
cd
mkdir -p Logiciels/Modbus
cd !$
git clone https://github.com/stephane/libmodbus.git
cd libmodbus/
./autogen.sh
./configure
make -j4
sudo make install
En cas de problème utiliser avant ./configure.
libtoolize
aclocal
autoheader
autoconf
automake --add-missing
6.2.5 Récupération et construction du paquet tinyb
dpkg -l libglib2.0-dev
# si manquante
sudo apt install libglib2.0-dev
cd ~/Logiciels
mkdir Tinyb
cd Tinyb
git clone https://github.com/intel-iot-devkit/tinyb.git
cd tinyb/
mkdir build
cd build/
cmake -DCMAKE_INSTALL_PREFIX=/usr ..
make -j4
sudo make install
6.2.6 Récupération et Construction de mraa et upm
Certains modules requièrent beaucoup de RAM pour se compiler avec l'option -j4 du make la raspberryPi3 peut se figer, on passe alors avec l'option -j2 (qui utilise seulement 2 des coeurs du processeur). Il est possible d'ajouter un fichier de swap avec les commandes suivantes qui fournissent 512 Mo de swap, la compilation passe en -j4 mais la raspi3 swape choisissez l'option qui vous convient !
sudo su
dd if=/dev/zero of=/swapfile bs=1024 count=524288
chown root:root /swapfile
chmod 0600 /swapfile
mkswap /swapfile
swapon /swapfile
Pour vérifier l'activité :
swapon -s
free -m
Il est maintenant possible de construire les libraries mraa et upm qui permettent de gérer le bus GPIO et un grand nombre de dispositifs électroniques
cd
mkdir -p Logiciels/IoT
cd !$
git clone https://github.com/eclipse/mraa
git clone https://github.com/eclipse/upm
Au 14/02/2022 le patch de @nxhack pour swig et javascript est nécessaire pour parvenir à compiler mraa. Fixer ensuite l'environnement java et lancer la compilation. Ajouter la compilation des interfaces java et nodejs en modifiant le fichier CMakeLists avec les valeurs ci-dessous.
Il est nécessaire de prendre en compte l'existence de /dev/i2c-1 sans /dev/i2c-0 car le code requiert qu'il existe le bus 0 (une demande de modification est en cours sur ecclipse), modifier le fichier src/mraa.c . Il est aussi nécessaire de créer le lien symbolique de /dev/i2c-1 vers /dev/i2c-0 la solution sudo ln -s /dev/i2c-1 /dev/i2c-0 est opérationnelle mais ne fonctionne que pour la session en cours, pour créer un lien définitif il est nécessaire de créer une règle udev.
jed CMakeLists.txt
option (BUILDSWIGNODE "Build swig node modules." ON)
option (BUILDSWIGJAVA "Build Java API." ON)
option (USEPYTHON3TESTS "Force tests to run with python3" ON)
jed src/mraa.c
#transformer
if (mraa_file_exist("/sys/class/i2c-dev/i2c-0"))
#en
if (mraa_file_exist("/sys/class/i2c-dev/i2c-0") || mraa_file_exist("/sys/class/i2c-dev/i2c-1"))
wget https://patch-diff.githubusercontent.com/raw/eclipse/mraa/pull/1064.patch
patch -p1 < 1064.patch
mkdir build
cd build
export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-armhf
#export JAVA_HOME=/usr/lib/jvm/java-17-openjdk-arm64 # pi4-64
# cmake -Wno-dev -DCMAKE_INSTALL_PREFIX=/usr ..
cmake .. -Wno-dev -DCMAKE_INSTALL_PREFIX=/usr -DENABLEEXAMPLES=0 -DBUILDSWIGNODE=ON -DSWIG_EXECUTABLE=/usr/local/bin/swig -DV8_ROOT_DIR=/usr/local/include/node -DNODE_ROOT_DIR=/usr/local/include/node -DPYTHON2LIBS_FOUND=FALSE -DPYTHON2INTERP_FOUND=FALSE
make -j4
sudo make install
En cas de besoin il est possible d'effacer ce qui a été installé par les compilations précédentes.
sudo rm -r /usr/include/mraa* /usr/lib/arm-linux-gnueabihf/pkgconfig/mraa.pc /usr/lib/arm-linux-gnueabihf/libmraa* /usr/lib/python2.7/dist-packages/*mraa* /usr/lib/python3.7/dist-packages/*mraa* /usr/lib/node_modules/mraa /usr/share/mraa/examples /usr/bin/mraa*
ls
sudo rm -r /usr/include/upm /usr/lib/python2.7/dist-packages/upm /usr/lib/python3.7/dist-packages/upm /usr/lib/arm-linux-gnueabihf/pkgconfig/upm* /usr/lib/node_modules/jsupm* /usr/lib/arm-linux-gnueabihf/libupm* /usr/share/upm
cd ~/Logiciels/IoT/upm
wget https://github.com/eclipse/upm/pull/703/commits/c7d7718c21828883a4d8eea585b89185a1eaf150.patch
mv c7d7718c21828883a4d8eea585b89185a1eaf150.patch upmNXHack.patch
patch -p1 < upmNXHack.patch
Ajouter la compilation des interfaces nodeJS java en modifiant le fichier CMakeLists comme indiqué ci-dessous et modifier la version du compilateur 11 -> 17 :
jed CMakeLists.txt
option (BUILDSWIGNODE "Build swig node modules." ON)
option (BUILDSWIGJAVA "Build Java API." ON)
set (CMAKE_CXX_STANDARD 17) #instead of 11
set (CMAKE_C_STANDARD 17) #instead of 11
Créer le dossier de travail et lancer la compilation.
mkdir build
cd build
cmake -Wno-dev -DWERROR=off -DCMAKE_INSTALL_PREFIX=/usr ..
make -j4
sudo make install
Dans certaines situations(maintenant peut-être révolues) il a été nécessaire de recopier les modules python depuis build/src/*/python?.?/*.py vers /usr/lib/dist-packages/upm
# from build folder
for i in python2.7 python3.9 ; do sudo cp src/*/$i/*.py /usr/lib/$i/dist-packages/upm/; done
for i in python2.7 python3.9sudo ; do sudo cp interfaces/$i/*.py /usr/lib/$i/dist-packages/upm/; done
Les programmes sont directement accessibles depuis les librairies python2, python3, Java, Javascript, C, C++.
6.2.7 Installation de compléments Python
Un certain nombre de logiciels python sont installés par défaut pour satisfaire certains usages. Il est recommandé d'installer si besoin (tester avec dpkg)les librairies de développement suivantes qui fournissent les fichiers d'en-tête utilisés pour construire les outils python listés ci-dessous, sans ces librairies les installations avec pip ou pipenv n'aboutissent pas.
dpkg -l libopenblas-dev libhdf5-dev libnetcdf-dev python3-pandas python3-rpi.gpio python3-netcdf4 python3-numpy python3-six python3-wheel python3-setuptools python3-folium
sudo apt install libopenblas-dev libhdf5-dev libnetcdf-dev python3-pandas python3-rpi.gpio python3-netcdf4 python3-numpy python3-six python3-wheel python3-setuptools python3-folium
sudo pip3 install --upgrade pandas netCDF4 numpy six wheel setuptools spidev folium pillow
export CFLAGS=-fcommon
sudo pip3 install RPi.GPIO
# installer aussi dans l'environnement virtuel pour jupyter
sudo su callisto
cd ~/JupyterLab/
pipenv shell
export MAKEFLAGS="-j$(nproc)"
pipenv install pandas netCDF4 numpy six wheel setuptools spidev folium pillow matplotlib
export CFLAGS=-fcommon
pipenv install RPi.GPIO
export PIP_NO_CACHE_DIR=off
pipenv lock --clear
Pour la PiZero ajouter la bibliothèque pour ADCCAD SPI
sudo python3 -m pip install git+https://github.com/abelectronicsuk/ABElectronics_Python_Libraries.git
Pour avoir les démos du SPI avec la carte ADCDAC Pi zero cloner le dépôt, les programmes sont disponibles dans les cahiers d'exercices de la version météo de cette image.
cd ~/Logiciels
mkdir ADCDAC-PiZero
git clone https://github.com/abelectronicsuk/ABElectronics_Python_Libraries.git
6.3 (Optionnel) Installation d'un simulateur graphique de réseau après avoir installé un docker
sudo apt purge docker lxc-docker docker-engine docker.io
sudo apt install apt-transport-https ca-certificates curl gnupg2 software-properties-common
curl -fsSL https://download.docker.com/linux/debian/gpg -o docker.gpg
sudo gpg --import docker.gpg
sudo add-apt-repository \
"deb [$(dpkg --print-architecture)] https://download.docker.com/linux/debian \
$(lsb_release -cs) \
stable"
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io
dpkg -l openvswitch-switch wireshark imagemagick tk tcllib util-linux
sudo apt install --reinstall openvswitch-switch wireshark imagemagick tk tcllib util-linux
cd ~/Logiciels
mkdir Imunes
cd Imunes
git clone https://github.com/imunes/imunes.git
cd imunes
sudo make install
6.4 Installation de Jupyterlab et Jupyterhub
Jupyter est un interface graphique de développement et de programmation multilangages qui permet de se familiariser simplement avec la programmation. Il permet d'approcher simplement un langage de programmation sa syntaxe, son vocabulaire et sa logique. Il permet de produire et d'exploiter des cahiers de programmes ipython intégrant code source et commentaire qui s'avèrent être d'excellents outils pédagogiques pour l'apprentissage du code voir les cahiers de programmes du projet Tremplin et par exemple la ministation météo. Jupyterhub est un coutil companion de Jupyterhub qui permet de servir jupyter sur le web à plusieurs usagers en même temps, lors d'un TP ou TD par exemple.
Jupyter et Jupyterhub sont des logiciels python et peuvent donc être installés avec pip ou pipenv, jupyterhub requiert python3. Les commandes concernant python2 sont maintenant obsolètes. depuis jupyterlab 3.0 on utilise exclusivement python3 et jupyter est de moins en moins utilisé. Il est possible de réaliser une installation faisant appel à pipenv cette stratégie crée un environnement virtuel dans lequel la compatibilité et l'interopérabilité entre les paquets python est garantie sans perturber le fonctionnement du python global du système. L'inconvénient est que l'environnement virtuel duplique l'espace occupé par python.
Pour installer en utilisant n processeurs en parallèle utiliser export MAKEFLAGS="-j$(nproc)".
sudo apt install rustc
sudo su callisto
cd
mkdir JupyterLab
cd JupyterLab
pipenv install jupyterlab
pipenv shell
export MAKEFLAGS="-j$(nproc)"
pip install --upgrade pip setuptools wheel
pip install jupyterhub
pip install --upgrade matplotlib flexx plotly matplotlib git+https://github.com/jupyter/sudospawner jupyter_contrib_nbextensions
Il est nécessaire de rapatrier les librairies mraa et upm compilées sur le python du système général.
cd /lib/python3.9/dist-packages/
ls upm/*.py
# if no file is found hey must be copied from source
exit;exit
cd ~/Logiciels/IoT/upm/build
sudo cp src/*/python3.9/*.py /lib/python3.9/dist-packages/upm/
sudo su callisto
cd ~/JupyterLab
pipenv shell
cd /lib/python3.9/dist-packages
cp -r *mraa* upm ~/.local/share/virtualenvs/JupyterLab-RHxiRMZV/lib/python3.9/site-packages/
La commande suivante est devenue inutile avec jupyterlab : sudo jupyter contrib nbextension install --system
6.4.1 Configuration de la sécurité et du lancement par le user callisto
Comme pour tigervncla sécurité est une contrainte importante de jupyterhub pour les mêmes raisons. La configuration est ici légèrement différente et l'authentification permet à chaque groupe ou élève (suivant le choix du professeur) de disposer d'un espace protégé des actions du reste du monde.
callisto est l'utilisateur choisi pour lancer jupyterhub, pour assumer la configuration proposée c'est donc l'utilisateur callisto qui doit créer le certificat de sécurité.
sudo su callisto
cd
mkdir -p Utils/Certificates
cd !$
openssl req -new -newkey rsa:2048 -rand /dev/urandom -nodes -keyout meteojuphub.key -out meteojuphub.csr
Répondre aux questions posées en fonction de vos paramètres.
openssl req -new -x509 -days 3652 -key meteojuphub.key -out meteojuphub.pem
On dispose maintenant des fichiers de sécurisaton nécessaires meteojuphub.csr meteojuphub.key meteojuphub.pem qui vont être utilisés pour protéger l'accès à jupyterhub. Par défaut un fichier de sécurisation a été installé pour permettre un fonctionnement immédiat mais chaque nouvel administrateur doit impérativement créer son propre fichier de sécurité. les manipulations qui suivent sont génériques et si les mêmes noms de fichier sont utilisés il ne sera pas nécessaire de répliquer les opérations ci-dessous.
cd
mkdir Jupyterhub
cd !$
jupyterhub --generate-config
Éditer le fichier jupyterhub_config.py nano jupyterhub_config.py puis décommenter et renseigner les 3 lignes comme indiqué ci-dessous :
.../...
## The class to use for spawning single-user servers.
#
# Should be a subclass of Spawner.
#c.JupyterHub.spawner_class = 'jupyterhub.spawner.LocalProcessSpawner'
c.JupyterHub.spawner_class='sudospawner.SudoSpawner'
## Path to SSL certificate file for the public facing interface of the proxy
#
# When setting this, you should also set ssl_key
#c.JupyterHub.ssl_cert = ''
c.JupyterHub.ssl_cert = '/home/callisto/Utils/Certificates/meteojuphub.pem'
## Path to SSL key file for the public facing interface of the proxy
#
# When setting this, you should also set ssl_cert
#c.JupyterHub.ssl_key = ''
c.JupyterHub.ssl_key = '/home/callisto/Utils/Certificates/meteojuphub.key'
.../...
## Set of users that will have admin rights on this JupyterHub.
#
# Admin users have extra privileges:
# - Use the admin panel to see list of users logged in
# - Add / remove users in some authenticators
# - Restart / halt the hub
# - Start / stop users' single-user servers
# - Can access each individual users' single-user server (if configured)
#
# Admin access should be treated the same way root access is.
#
# Defaults to an empty set, in which case no user has admin access.
#c.Authenticator.admin_users = set()
c.Authenticator.admin_users = set(['localadm','callisto','ens-ife'])
Pour que Jupyterhub puisse être lancé par callisto et fonctionne correctement callisto (que nous avons choisi comme user pour lancer Jupyterhub doit disposer de quelques privilèges qui doivent être ajoutés par l'administrateur (et pas par callisto qui n'a pas de privilèges suffisants) au fichier sudoers avec la commande sudo visudo en ajoutant les lignes suivantes :
# the command(s) the Hub can run on behalf of the jupyterhub group users
# without needing a password
# the exact path may differ, depending on how sudospawner was installed
Cmnd_Alias JUPYTER_CMD = /home/callisto/.local/share/virtualenvs/JupyterLab-RHxiRMZV/bin/sudospawner
# actually give the Hub user permission to run the above command
# on behalf of the above users without prompting for a password
%jupyterhub ALL=(callisto) /usr/bin/sudo
callisto ALL=(%jupyterhub) NOPASSWD:JUPYTER_CMD
L'utilisateur callisto doit aussi appartenir au groupe shadow.
sudo adduser callisto shadow
6.4.2 Ajout de moteurs nodeJS et java dans l'environnement jupyter/jupyterhub
Jupyter et Jupyterhub sont programmés en python mais les notebooks (cahiers d'exercices) qu'ils utilisent peuvent fonctionner avec d'autres langages, à titre d'exemple nous proposons ici l'installation du moteur javascript permettant de programmer en nodeJS.
La version 3 de jupyterlab résoud tous les problèmes d'extensions en permettant d'ajouter les extensions depuis l'interface web. En cas de besoin le contournement qui avait été utilisé précédemment pour permettre d'installer proprement les extensions en ligne de commande avec jupyter lab build, pour les raspberries PI3 et en dessous est proposé, . Le contournement foncctionne avec webpack.
sudo npm install -g webpack webpack-cli webpack-bundle-analyzer
cd /usr/local/share/jupyter/lab/staging
sudo su
NODE_OPTIONS="--max-old-space-size=850" webpack --config webpack.prod.minimize.config.js # pour la pi3 1Go
NODE_OPTIONS="--max-old-space-size=3500" webpack --config webpack.prod.minimize.config.js # pour la pi4 4Go
Pour que les usagers choisis puissent ajouter leurs extensions il est nécessaire de modifier les permissions des dossiers de .local/share/virtualenvs/JupyterLab-RHxiRMZV/share/jupyter/lab. Dans notre cas tous les usagers ayant ce droit appartiennent au groupe "jupyterhub" la solution choisie a donc été la suivante :
sudo su callisto
cd ~/.local/share/virtualenvs/JupyterLab-RHxiRMZV/share/jupyter/lab
ls
# If those folder do not exist
mkdir extensions settings staging
for i in extensions settings staging; do chmod -R g+w $i; chgrp jupyterhub $i; done
Installation voila pour extraire un notebook
cd ~/JupyterLab/
pipenv shell
pip install voila
Installation d'un autre moteur js
sudo su
npm install -g [--unsafe-perm] ijavascript
sudo su callisto
cd ~/JupyterLab
pipenv shell
pip install jupyter ipywidgets
ijsinstall
Le moteur s'isnstalle par défaut dans .local/share/jupyter/kernels/ alors qu'il devrait se positionner dans ~/.local/share/virtualenvs/JupyterLab-RHxiRMZV/share/jupyter/kernels il faut donc le déplacer à la main.
ls ~/.local/share/jupyter/kernels
cp -r ~/.local/share/jupyter/kernels/javascript ~/.local/share/virtualenvs/JupyterLab-RHxiRMZV/share/jupyter/kernels
Installation d'un moteur java.
pip install kotlin-jupyter-kernel
6.4.3 Installation d'un service jupyterhub ou jupyterlabhub
Vérifier que les logiciels nécessaires à la production de sorties textes au format pdf drpuis jupyter ou jupyterlab est possible avec la commancde sudo dpkg -l pandoc python3-pypandoc python3-pandocfilters texlive-xetex texlive-latex-recommended texlive-lang-other, la réponse doit être du type :
||/ Nom Version Architecture Description
+++-=========================-===============-============-=====================================
ii pandoc 2.2.1-3+b2 armhf general markup converter
ii python3-pandocfilters 1.4.2-1 all python3 bindings for Pandoc's filters
ii python3-pypandoc 1.4+ds0-1.1 all Thin wrapper for pandoc (Python 3.x)
ii texlive-lang-other 2018.20190227-2 all TeX Live: Other languages
ii texlive-latex-recommended 2018.20190227-2 all TeX Live: LaTeX recommended packages
ii texlive-xetex 2018.20190227-2 all TeX Live: XeTeX and packages
Si ce n'est pas le cas installer les paquets manquants avec sudo apt install ... et les paquets python avec pip
sudo apt install texlive-lang-other texlive-latex-recommended texlive-xetex
sudo su callisto
cd ~/JupyterLab/
pipenv shell
pip install --upgrade pandoc pandocfilters pypandoc
6.4.3.1 Mise en place de jupyterhub
Pour mettre en place un service placer le fichier jupyterhub.service dans /etc/systemd/system :
sudo jed /etc/systemd/system/jupyterhub.service
[Unit]
Description=Jupyterhub
After=network-online.target
[Service]
User=callisto
WorkingDirectory=/home/callisto/Jupyterhub
ExecStart=pipenv run jupyterhub --config=/home/callisto/Jupyterhub/jupyterhub_config.py
[Install]
WantedBy=multi-user.target
Faire prendre en compte le nouveau service avec sudo systemctl daemon-reload puis contrôler le service avec les commandes habituelles, pour avoir jupyterhub au démarrage sudo systemctl enable jupyterhub
sudo systemctl status jupyterhub
sudo systemctl start jupyterhub
sudo systemctl stop jupyterhub
6.4.3.2 Mise en place de jupyterlabhub
- pour utiliser exclusivement
jupyterlabet nonjupytermodifier le fichier de configuration de callistojupyterhub_config.pyen modifiant la valeur du paramètre suivant :
sudo su callisto
cd ~/Jupyterhub/
jed jupyterhub_config.py
# change to
c.Spawner.cmd = ['jupyter-labhub']
Lors de la dernière installation (2021-10-16) cette option éait inopérante. Pour y remédier changement de la commande de démarrage par défaut.
sudo su callisto
cd /home/callisto/.local/share/virtualenvs/JupyterLab-RHxiRMZV/bin
mv jupyterhub-singleuser jupyterhub-singleuser-std
cp jupyter-labhub jupyterhub-singleuser
Le serveur jupyterhub peut-être lancé par callisto depuis le répertoire /home/callisto/Jupyterhub par la commande jupyterhub. Bien veiller à ce que tous les usagers de jupyterhub appartiennent au groupe jupyterhub.
6.4.4 (Option obsolète) Installation d'une alternative entre jupyterlab et jupyter
- Pour avoir jupyterlab et jupyter-labhub ajouter le fichier
sudospawner-singleusercontenant le script suivant dans/usr/local/binet le rendre exécutable.
sudo jed /usr/local/bin/sudospawner-singleuser
#!/bin/bash -l
# Delegate the notebook server launch to the jupyter-labhub script.
exec "jupyter-labhub" $@
Ne pas oublier de rendre ce fichier exécutable.
sudo chmod a+x /usr/local/bin/sudospawner-singleuser
La procédure suivante permet de mettre en place deux services l'un pour jupyterlab l'autre pour jupyter. Les deux services seront nommés jupyterhub et jupyterlabhub.
sudo su
cd /etc/systemd/system
cat > jupyterhub.service
Ajouter
[Unit]
Description=Jupyterhub
After=network-online.target
[Service]
User=callisto
ExecStartPre=+/bin/sh /home/callisto/Jupyterhub/preparehub.sh
ExecStart=/usr/local/bin/jupyterhub --config=/home/callisto/Jupyterhub/jupyterhub_config.py
WorkingDirectory=/home/callisto/Jupyterhub
[Install]
WantedBy=multi-user.target
cat > jupyterlabhub.service
Ajouter
[Unit]
Description=Jupyterlabhub
After=network-online.target
[Service]
User=callisto
ExecStartPre=+/bin/sh /home/callisto/Jupyterhub/preparelab.sh
ExecStart=/usr/local/bin/jupyterhub --config=/home/callisto/Jupyterhub/jupyterhub_config.py
WorkingDirectory=/home/callisto/Jupyterhub
[Install]
WantedBy=multi-user.target
exit
sudo su callisto
cd ~/Jupyterhub
cat > preparehub.sh
Ajouter
#! /bin/sh
if [ -f /usr/local/bin/sudospawner-singleuser ]; then rm /usr/local/bin/sudospawner-singleuser;fi
cat > preparelab.sh
Ajouter
#! /bin/sh
if [ -f /usr/local/bin/sudospawner-singleuser ]; then echo "lab ready"; else cp /usr/local/bin/sudospawner-singleuserlab /usr/local/bin/sudospawner-singleuser ;fi
Rendre les fichiers exécutables puis quitter le user callisto et recopier le fichier sudospawner-singleuser dans sudospawner-singleuserlab :
chmod a+x *.sh`
exit
sudo cp /usr/local/bin/sudospawner-singleuser /usr/local/bin/sudospawner-singleuserlab
Il y a maintenant deux services de lancement l'un pour jupuyterhub l'autre pour jupyterlabhub fonctionnant de la même façon, Il est souhaitable d'éteindre un service avant de lancer l'autre.
# Jupyterhub
sudo systemctl status jupyterhub
sudo systemctl start jupyterhub
sudo systemctl stop jupyterhub
#Jupyterlabhub
sudo systemctl status jupyterlabhub
sudo systemctl start jupyterlabhub
sudo systemctl stop jupyterlabhub
L'un ou l'autre peut être activé au démarrage avec la commande sudo systemctl enable jupyterhub/jupyterlabhubun des deux au choix.
6.5 Installation de Snap!BYOB
Jupyter est un outil très performant pour un apprentissage progressif du codage mais il ne s'adresse pas à des novices absolus. Le logiciel Snap!BYOB est un outil de programmation graphique par blocs plus puissant que Scratch qui permet une introduction à la programmation. Comme Jupyter il propose ue interface web que la Raspberry fournit sans problème. Pour installer Snap télécharger le code depuis un serveur snap en ligne en cliquant en haut à gauche sur le logo Snap qui fait apparaitre un menu déroulant. reopier le logiciel snap.zip dan un répertoire de la Raspberry pi puis le décompresser dans un dossier de votre choix et le lier à la racine du web /var/www/html.
cd
mkdir Logiciels/Snap
cd !$
git clone https://github.com/jmoenig/Snap.git
sudo cp -r Snap /opt
sudo ln -s /opt/Snap /var/www/html/snap
Snap!BYOB est maintenant directement accessible sur le serveur web de la Raspberry Pi http://$$$.$$$.$$$.$$$/snap
6.6 Installation de Domoticz pour piloter des objets connectés du commerce
Domoticz est une logiciel de pilotage d'objets connectés du commerce on l'utilisera ici avec le concentrateur RFXCOM RFXtrx433XL pour installer le logiciel domoticz il faut un certain nombre de paquets de développement afin de parvenir à le compiler. La première commande permet de lister les paquets absents, la seconde permet de les ajouter (ne traiter que les paquets manquants).
sudo dpkg -l python3-openssl libssl-dev libboost-atomic1.74-dev libboost-chrono1.74-dev libboost-system-dev libboost-thread-dev libboost1.74-dev libcurl4-gnutls-dev curl libusb-dev libconfuse-dev doxygen libftdi-dev
sudo apt install python3-openssl libssl1.0-dev libboost-atomic1.74-dev libboost-chrono1.74-dev libboost-system-dev libboost-thread-dev libboost1.74-dev libcurl4-gnutls-dev curl libusb-dev libconfuse-dev doxygen libftdi-dev
En bullseye
sudo dpkg -l python3-openssl libssl-dev libboost-atomic1.74-dev libboost-chrono1.74-dev libboost-system-dev libboost-thread-dev libboost-dev libcurl4-gnutls-dev curl libusb-dev libconfuse-dev doxygen libftdi-dev
sudo apt install python3-openssl libssl1.0-dev libboost-atomic1.74-dev libboost-chrono1.74-dev libboost-system-dev libboost-thread-dev libboost-dev libcurl4-gnutls-dev curl libusb-dev libconfuse-dev doxygen libftdi-dev
La version 67 ou 74 peut avoir progressé après le rédaction de cet article, faire les modifications en conséquence.
Créer un répertoire pour recevoir le logiciel domoticz et tous les logiciels supplémentaires traitant les différents objets de la domotique.
cd ~/Logiciels
mkdir Domoticz
cd Domoticz/
Pour disposer des pilotes telldus dans domoticz ajouter le zip le décompresser et le compiler (Il y a des erreurs de compilation et le code source doit être modifié comme précisé c-dessous.
mkdir Telldus
cd Telldus/
wget http://download.telldus.com/TellStick/Software/telldus-core/telldus-core-2.1.2.tar.gz
tar xvfz telldus-core-2.1.2.tar.gz
cd telldus-core-2.1.2
Compilation puis installation.
cmake .
mv CMakeDoxyfile.in Doxyfile.in
cmake .
make
sudo make install
Dans les fichiers de tdtool, tdadmin, link.txt il manque parfois (suivant les versions) le lien avec la librairie pthread ajouter en fin de ligne -lpthread dans les deux fichiers concernés.
jed tdtool/CMakeFiles/tdtool.dir/link.txt
jed tdadmin/CMakeFiles/tdadmin.dir/link.txt
Pour disposer d'openzwave penser à ajouter le chemin dans CMakeLists.txt de domoticz.
En x64 il peut s'avérer qu'il n'y ait pas assez de RAM pour compiler domoticz ce qui fige la raspi.
Telldus est issu de logiciels propriétaires, la version partagée semble figée et il subsiste quelques disharmonies avec domoticz empêchant la compilation. les problèmes concernent la non déclaration ou la double déclaration de variables; plusieurs solutions existent celle qui a été expérimentée est de conserver l'inclusion du fichier créé par la compilation séparée de Telldus #include <telldus-core.h> qui est installé dans /usr/local/include et de supprimer dans les fichiers de domoticz les doublons. Il est aussi nécessaire d'ajouter #include <telldus-core.h> dans certains fichiers .cpp lorsque la déclaration d'une variable est manquante.
cd ../..
git clone https://github.com/domoticz/domoticz.git domoticz
cd domoticz
nano CMakeLists.txt
Ajouter openzwavecompilé ici.
find_library(OpenZWave NAMES libopenzwave.a HINTS "/home/ens-ife/Logiciels/OpenZwave/open-zwave"
cmake -DCMAKE_BUILD_TYPE=Release CMakeLists.txt
make
sudo make install
Ne pas compiler avec plus d'un processeur car la mémoire de la RaspBerry (1Go) est insuffisante pour compiler en parallèle sur plusieurs processeurs à mons d'utiliser un gros swap et contrôler que les threads ne soient pas figés, la compilation en -j4 passe sur la Pi4 avec 4Go de mémoire..
Pour utiliser Domoticz on crée l'utilisateur domotic et le groupe domotic . Tous les usagers qui pourront lancer le logiciel devront appartenir au groupe domotic et au groupe dialout.
sudo adduser domotic --no-create-home
for i in domotic dialout;do for j in ens-ife localadm www-data domotic;do sudo adduser $j $i;done;done
Pour que tous les usagers du groupe domotic puissent accéder au RFXCOM on doit ajouter un fichier dans /etc/uvev/rules.d :
sudo nano /etc/udev/rules.d/45-usbdomoticz.rules
#ajouter la ligne suivante
SUBSYSTEM=="usb", ATTR{idVendor}=="0403", ATTR{idProduct}=="6015", ACTION=="add", GROUP="domotic", MODE="0664"
#sauvegarder
Pour créer le service domotique et qu'il puisse démarrer seul ajouter le fichier /etc/systemd/system/domoticz.service :
sudo nano /etc/systemd/system/domoticz.service
#ajouter le contenu suivant
[Unit]
Description=domoticz_service
[Service]
User=domotic
Group=domotic
WorkingDirectory=/opt/Domoticz
ExecStart=/opt/Domoticz/domoticz -www 8080 -sslwww 0 -wwwbind 192.168.10.212
#ExecStartPre=setcap 'cap_net_bind_service=+ep' /opt/Domoticz/domoticz
Restart=on-failure
RestartSec=1m
#StandardOutput=null
[Install]
WantedBy=multi-user.target
Déplacer le contenu durépertoire dans /opt/Domoticz et modifier les droits d'accès :
cd
cd Logiciels/Domoticz/domoticz
sudo mkdir /opt/Domoticz
sudo cp -r ./* /opt/Domoticz/
sudo chown -R domotic.domotic /opt/Domoticz/
sudo chmod -R g+rwX /opt/Domoticz/
Le service se gère alors comme tous les autres services de la raspberryPi :
sudo systemctl start domoticz
sudo systemctl status domoticz
sudo systemctl stop domoticz
sudo systemctl enable domoticz
sudo systemctl disable domoticz
6.7 Ajout de scripts pour démarrer ou supprimer un service au démarrage
Les services Jupyterhub, vncserver, weewx peuvent tous être mis en route au démarrage mais ils consomment inutilement des ressources si ils ne sont pas utilisés. Les scripts suivants permettent de gérer la mise en route de ces services au démarrage. Par défaut seul le serveur vnc est mis en route. Le contenu de ces scripts est détaillé c dessous.
cd
mkdir Scripts
cd Scripts
6.7.1 Pour jupyterhub
Ajouter le fichier avec nano jupyterhubOnOff ou une commande équivalente
#!/bin/bash
#script pour activer/désactiver jupyterhub au boot
#
prog=`basename $0`
if [[ $1 == "" ]] ; then
echo "Type " $prog " [on / off]"
echo "Start or stop jupyterhub at boot"
exit
else
case $1 in
on )
sudo systemctl enable jupyterhub
;;
off )
sudo systemctl disable jupyterhub
;;
* )
echo "Choice is on or off"
exit
;;
esac
fi
6.7.2 Pour vncserver
Ajouter le fichier avec nano vncserverOnOff ou une commande équivalente
#!/bin/bash
# Script pour activer/désactiver vncserver au boot
#
prog=`basename $0`
if [[ $2 == "" ]] ; then
echo "Type " $prog "on / off port to start or stop vncserver at boot on port 5900 + port"
exit
else
case $1 in
on )
sudo systemctl enable vncserver@1
;;
off )
sudo systemctl disable vncserver@1
;;
* )
echo "Choice is on or off"
exit
;;
esac
fi
6.7.3 Pour weewx
Ajouter le fichier avec nano weewxOnOff ou une commande équivalente
#!/bin/bash
# script pour activer/désactiver weewx au boot
#
prog=`basename $0`
if [[ $1 == "" ]] ; then
echo "Type " $prog "on or off to start or stop weewx at boot"
exit
else
case $1 in
on )
sudo systemctl enable weewx
;;
off )
sudo systemctl disable weewx
;;
* )
echo "Choice is on or off"
exit
;;
esac
fi
6.7.3 Pour domoticz
Ajouter le fichier avec nano domoticzOnOff ou une commande équivalente
#!/bin/bash
# script pour activer/désactiver domoticz au boot
#
prog=`basename $0`
if [[ $1 == "" ]] ; then
echo "Type " $prog "on or off to start or stop domoticz at boot"
exit
else
case $1 in
on )
sudo systemctl enable domoticz
;;
off )
sudo systemctl disable domoticz
;;
* )
echo "Choice is on or off"
exit
;;
esac
fi
Rendre les fichiers exécutables puis les copier les scripts dans le répertoire /usr/local/bin
chmod a+x ./*
sudo cp ~/Scripts/* /usr/local/bin
6.8 Ajout des cahiers de programmes pour apprendre/enseigner la programmation
Ajouter les cahiers de programmes du projet Tremplin des Sciences depuis la forge github
sudo su moon
cd
git clone http://vidal@depot.tremplin.ens-lyon.fr/Tremplin-des-Sciences/CahiersDeProgrammesCodage
git clone http://vidal@depot.tremplin.ens-lyon.fr/Tremplin-des-Sciences/CahiersDeProgrammesClimat
exit
sudo su localadm
cd
git clone http://vidal@depot.tremplin.ens-lyon.fr/Tremplin-des-Sciences/CahiersDeProgrammesCodage
git clone http://vidal@depot.tremplin.ens-lyon.fr/Tremplin-des-Sciences/CahiersDeProgrammesClimat
exit
cd
git clone http://vidal@depot.tremplin.ens-lyon.fr/Tremplin-des-Sciences/CahiersDeProgrammesCodage
git clone http://vidal@depot.tremplin.ens-lyon.fr/Tremplin-des-Sciences/CahiersDeProgrammesClimat
6.9 Ajout d'un media-center
La raspberryPi peut aussi être utilisée en media-center pour y parvenir il suffit de disposer d'une bibliothèque de médias accessibles depuis la raspberry et du logiciel kodi. La manipulation du media-center se fait via l'interface intuitive de kodi.
Pour installer :
sudo apt install kodi kodi-bin kodi-data
6.10 Image sans interface graphique (type serveur) pour le pilotage de la station météorologique et le partage de données
Cette image n'a pas de serveur X ni la suite de logiciels du poste de travail de programmation ou de traitement des données climat. Elle est créée avec un script largement simplifié.
6.10.1 Configuration du réseau statique
Fournir la configuration suivante dans laquelle ... représente successivement les adresses du DNS, du réseau qui sera utilisé et de la passerelle. enx* est un contournement temporaire permettant de connecter n'importe quelle interface cette valeur devra être changée par la vraie valeur de l'interface dès qu'elle sera connue (voir plus bas) :
[Match]
Name=enx*
Host=raspife3W
Virtualization=no
[Network]
RouteMetric=10
IPv6PrivacyExtensions=true
DHCP=no
Address=***.***.***.***/24
Gateway=***.***.***.***
DNS=***.***.***.***
Changer le port de connection /etc/ssh/sshd_config.
Rajouter le user weewx et la clef d'accès aux serveurs
Ajouter les permissions udev
6.10.2 Configuration du logiciel de pilotage de stations météorologiques
Le logiciel weewx récupère les données de la station météorologique qui lui est connectée et fournit des pages web affichant les mesures réalisées.Une version à jour à la date de création de l'image est installée par défaut ou téléchargé depuis le site d'origine. télécharger les mises à jour et les installer au besoin. Après avoir créé le répertoire Logiciels s'il n'existe pas encore, on récupère ici à titre conservatoire une copie du paquet weewx.
Attention ! le logiciel weewx ne figure pas dans les dépôts debian par défaut, les mises à jour doivent être faites à la main en téléchargeant le paquet http://weewx.com/downloads/released_versions/python3-weewx_4.2.0-1_all.deb et en l'installant avec la commande dpkg -i python3-weewx_4.2.0-1_all.deb, lors d'une telle mise à jour de weewx le fichier de configuration /etc/weewx/weewx.conf est réécrit en tenant compte de son contenu avant mise à jour. Toutefois, faire une copie de ce fichier AVANT d'entreprendre la mise à jour, puis comparer et modifier si nécessaire le nouveau fichier (le fichier existant étant utilisé comme modèle les paramètres sont théoriquement conservés mais une erreur même minime de syntaxe peut entrainer la perte de paramètres, il est souhaitable de vérifier attentivement).
cd
mkdir -p Logiciels/Weewx
cd !$
wget http://weewx.com/downloads/released_versions/python3-weewx_4.5.1-1_all.deb
6.10.3 Ajout des cadrans interactifs
Il est possible de proposer plusieurs modes d'affichage. Nous avons choisi d'ajouter ici un affichage par cadrans et un affichage par semaine ou mois téléchargeables depuis la forge github. Les deux ambiances graphiques (skins) qui sont utilisées ici pour afficher les données sont highcharts et Steel-Series. Elles sont intégrées sous la forme d'extensions du logiciel weewx en utilisant la procédure wee_extension.
cd ~/Logiciels/Weewx
mkdir Skins
cd Skins
wget -P . https://github.com/gjr80/weewx-highcharts/releases/download/v0.3.0/hfw-0.3.0.tar.gz
wget -P . https://github.com/gjr80/weewx-steelseries/releases/download/v2.7.5/steelseries-2.7.5.tar.gz
wget -P . https://github.com/gjr80/weewx-realtime_gauge-data/releases/download/v0.4.2/rtgd-0.4.2.tar.gz
sudo systemctl stop weewx
sudo wee_extension --install=hfw-0.3.0.tar.gz
sudo wee_extension --install=steelseries-2.7.5.tar.gz
sudo wee_extension --install=rtgd-0.4.2.tar.gz
Les éléments de configuration sont intégrés aufichier /etc/weewx/weewx.conf parmi les modifications de configuration déjà effectuées. Il est nécessaire de modifier les paramètres intégrés automatiquement en fonctions des choix d'affichage personnalisés de chacun (notamment les unités). les sections nouvellement installées à modifier sont les suivantes :
[[Highcharts]]
skin = Highcharts
[[[Units]]]
[[[[StringFormats]]]]
[[[[Groups]]]]
.../...
[[SteelSeries]]
skin = ss
HTML_ROOT = /var/www/html/ss
[[[Units]]]
[[[[StringFormats]]]]
[[[[Groups]]]]
Les affichages améliorés sont maintenant disponibles.
cd ~/Logiciels/Weewx
mkdir Utils
cd !$
git clone https://github.com/mcrossley/SteelSeries-Weather-Gauges.git
cd SteelSeries-Weather-Gauges/
Créer ensuite dans la hiérarchie weewx le dossier qui contiendra le graphisme de l'interface et recopier les fichiers téléchargés.
sudo mkdir /etc/weewx/skins/ss
sudo cp weather_server/WeeWX/skin.conf /etc/weewx/skins/ss
sudo cp weather_server/WeeWX/index.html.tmpl /etc/weewx/skins/ss
sudo cp weather_server/WeeWX/gauge-data.txt.tmpl /etc/weewx/skins/ss
S'ils n'existent pas encore ajouter les répertoires suivants et leur contenu
sudo mkdir /etc/weewx/skins/ss/css
sudo cp web_server/css/*.css /etc/weewx/skins/ss/css
sudo mkdir /etc/weewx/skins/ss/scripts
sudo cp web_server/scripts/*.js /etc/weewx/skins/ss/scripts
Éditer ensuite le fichier /etc/weewx/skins/ss/scripts/gauges.js et le modifier en fonction des paramètres locaux et des choix d'affichage.
weatherProgram : 6,
imgPathURL : '',
stationTimeout : 10, // set to twice archive interval, in minutes
showUvGauge : true, // false if there is no UV sensor
showSolarGauge : true, // false if there is no solar radiation sensor
showRoseGauge : false, // true if field WindRoseData is populated
Pour afficher les mesures en temps réel il est nécessaire de synchroniser la Raspberry Pi avec le serveur web des opendata, cela se fait en modifiant les paramètres [[RSYNC]] de weewx.conf; les modifications sont commentées pour éviter que la synchronisation échoue tant que le réseau n'est pas correctement configuré(il s'agit d'une précaution) :
[[RSYNC]]
#delete = 1
#HTML_ROOT = /var/www/html/ss
#server = stationsdata.climatetmeteo.fr
#path = folder_name_path_on_server
#user = opendata
6.10.4 Installation et configuration du pare-feu
La Raspberry va être exposée sur le net il est important d'être attentifs à la sécurité de cette machine. Une première méthode est de mettre en place un pare-feu mais cette opération est délicate et difficile à faire à la main; nous utiliserons donc un logiciel d'asssitance à la création de pare-feu nftables. Ce logiciel permet d'établir des règles de filtrage avec une syntaxe (relativement) intelligible dans un fichier de configuration, il se charge ensuite de construire et activer les règles de filtrage correspondant aux instructions de l'usager. L'installation du paquet se fait avec la procédure habituelle.
sudo apt install nftables
Activer nftables au démarrage par défaut:
sudo systemctl enable nftables.service
Le fichier de configuration se trouve ici /etc/nftables.conf. À titre d'exemple la configuration du pare-feu pour le projet tremplin est proposée ci-dessous commentée afin de permettre le fonctionnement par défaut de l'image. Le pare-feu doit être configuré avec les paramètres locaux de l'usager, si la configuration ne correspond pas à l'environnement réseau de la Raspberry cette dernière peut devenir inaccessible ! Soyez prudents. En cas de problème il est toujours possible d'accéder au contenu de la microSD depuis une machine GNU/linux et de modifier le fichier de configuration; si vous êtes sous un autre système d'exploitation il est possible de démarrer votre ordinateur en utilisant une clef USB GNU/linux live qui fournit un ordinateur opérationnel sans rien toucher de ce qui est installé par exemple debian live.
Propositions de fichier de configuration nftables.conf.
#!/usr/sbin/nft -f
flush ruleset
table inet filter {
set ALLOWED_SSH {
type ipv4_addr
flags interval
# Institution : ***.***.***.0/24
# Individual : ***.***.***.***
# Internal : ***.***.***.0/24, ***.***.***.0/23
# outbound : ***.***.***.***
elements = {
***.***.***.0/24, \
***.***.***.***, \
***.***.***.0/24, ***.***.***.0/23, \
***.***.***.***
}
}
chain input {
type filter hook input priority 0;
policy drop;
# established/related connections
ct state established,related accept
# invalid connections
ct state invalid drop
# loopback interface
iif lo accept
# ICMP & IGMP
ip protocol icmp icmp type { echo-request, echo-reply, destination-unreachable, router-solicitation, router-advertisement, time-exceeded, parameter-problem } accept
ip protocol igmp accept
# SSH (port #####)
tcp dport ##### ip saddr @ALLOWED_SSH accept
# HTTP (ports 80, #####, #####:#####)
tcp dport { http, https } accept
# HTTPS (ports 443, #####)
tcp dport { https, ##### } accept
# mysql
tcp dport ##### accept
# email
tcp dport { 25, 587 } accept
}
chain forward {
type filter hook forward priority 0;
policy drop;
}
chain output {
type filter hook output priority 0;
policy accept;
}
}
6.10.5 Installation et configuration de la base de données relationnelle mariadb
Par défaut weewx utilise une base sqlite, pour des raisons d'interopérabilité et de facilitation du partage des données nous installons les composants serveur et client de la base mariadb. Nous effectuons un installation par défaut, au moment de la rédaction (27/11/2020) la dernière version disponible est 10.3.25-0+deb10u1.
sudo apt install mariadb-client mariadb-server mariadb-common
La base de données est maintenant installée, il est nécessaire de la configurer. On ajoute un mot de passe à l'utilisateur root, on ajoute ensuite un utilisateur admin avec privilèges qui évite d'utiliser root pour la configuration le mot de passe Achanger1$ est utilisé pour tous les comptes cette valeur est à changer comme son nom l'indique !
sudo systemctl stop mariadb
sudo mysqld_safe --skip-grant-tables --skip-networking &
sudo mysql -u root
FLUSH PRIVILEGES;
MariaDB [(none)]> ALTER USER 'root'@'localhost' IDENTIFIED BY 'AChanger1$';
MariaDB [(none)]> \q
sudo mysql -u root -p
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MariaDB connection id is 2
Server version: 10.1.26-MariaDB-0+deb9u1 Debian 9.1
Copyright (c) 2000, 2017, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MariaDB [(none)]> select password ('AChanger1$');
+-------------------------------------------+
| password ('AChanger1$') |
+-------------------------------------------+
| *695008F6BF1536D1C456BC7B1226080345359BB9 |
+-------------------------------------------+
1 row in set (0.01 sec)
MariaDB [(none)]> SET PASSWORD FOR mysql = PASSWORD('AChanger1$');
MariaDB [(none)]> use mysql
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
Database changed
MariaDB [mysql]> CREATE USER 'admin'@'localhost' IDENTIFIED BY PASSWORD '*695008F6BF1536D1C456BC7B1226080345359BB9';
Query OK, 0 rows affected (0.00 sec)
MariaDB [mysql]> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'localhost' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mysql]> CREATE USER 'admin'@'%' IDENTIFIED BY PASSWORD '*695008F6BF1536D1C456BC7B1226080345359BB9';
Query OK, 0 rows affected (0.01 sec)
MariaDB [mysql]> GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;
Query OK, 0 rows affected (0.00 sec)
MariaDB [mysql]> select host, user, default_role, is_role, password from mysql.user;
+-----------+-------+--------------+---------+-------------------------------------------+
| host | user | default_role | is_role | password |
+-----------+-------+--------------+---------+-------------------------------------------+
| localhost | root | | N | *9FDA0930AF881812755F2746906A517D7C892BA6 |
| localhost | admin | | N | *695008F6BF1536D1C456BC7B1226080345359BB9 |
| % | admin | | N | *695008F6BF1536D1C456BC7B1226080345359BB9 |
+-----------+-------+--------------+---------+-------------------------------------------+
3 rows in set (0.00 sec)
MariaDB [mysql]> \q
Bye
Nous souhaitons pouvoir accéder à la base depuis des machines extérieures (pour partager les données dans le cadre du projet par exemple), pour cela il est nécessaire de modifier quelques paramètres du fichier de configuration /etc/mysql/mariadb.conf.d/50-server.cnf.
sudo nano /etc/mysql/mariadb.conf.d/50-server.cnf
Pour avoir un accès distant ajouter le paramère skip-bind-address et pour changer le port le paramètre port. Sans changement la base écoute sur le port par défaut et seulement sur localhost.
[mysqld]
port = ****
Les options ci-dessous sont obsolètes et le remplacement par défaut en cours de test
.../...
skip-networking=0
skip-bind-address
Relancer le serveur pour vérifier que les paramètres sont priss en compte.
sudo systemctl restart mysqld
sudo systemctl status mysqld
Le système doit être chargé et fournir une réponse du type suivant.
● mariadb.service - MariaDB database server
Loaded: loaded (/lib/systemd/system/mariadb.service; enabled; vendor preset: enabled)
Active: active (running) since Fri 2018-01-19 01:27:45 CET; 6s ago
Process: 3616 ExecStartPost=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 3613 ExecStartPost=/etc/mysql/debian-start (code=exited, status=0/SUCCESS)
Process: 3496 ExecStartPre=/bin/sh -c [ ! -e /usr/bin/galera_recovery ] && VAR= || VAR=`/usr/bin/galera_recovery`; [ $? -eq 0 ] &&
Process: 3491 ExecStartPre=/bin/sh -c systemctl unset-environment _WSREP_START_POSITION (code=exited, status=0/SUCCESS)
Process: 3487 ExecStartPre=/usr/bin/install -m 755 -o mysql -g root -d /var/run/mysqld (code=exited, status=0/SUCCESS)
Main PID: 3586 (mysqld)
Status: "Taking your SQL requests now..."
CGroup: /system.slice/mariadb.service
└─3586 /usr/sbin/mysqld
janv. 19 01:27:42 raspwife3 systemd[1]: Starting MariaDB database server...
janv. 19 01:27:43 raspwife3 mysqld[3586]: 2018-01-19 1:27:43 1996341248 [Note] /usr/sbin/mysqld (mysqld 10.1.26-MariaDB-0+deb9u1) start
janv. 19 01:27:45 raspwife3 systemd[1]: Started MariaDB database server.
La suite des interventions sur la base de données peut alors se faire depuis un outil à ditance comme DBeaver, pour augmenter la sécurité PHPmyadmin n'est pas installé toutes les fonctionnalités étant fournies par le client DBeaver
Pour obtenir un bon fonctionnement il est impératif de synchroniser la configuration de weewx et celle de mariadb. Ces éléments de configuration ne sont pas génériques et doivent être réalisés en fonction des besoins de chaque usager. On pourra notamment :
- créer un nouvel utilisateur pour les données issues du
collège1(user_college1) - créer une nouvelle base de données dédiée au
collège1(OpenMetEdu_College1) - donner tous les privilèges au nouvel utilisateur sur la nouvelle base
- vérifier que weewx est configuré avec ces mêmes paramètres
En fonctionnement sur une base locale weewx requiert une base sqlite3 opérationnelle, les paquets sont installés par défaut mais il faut configurer la base en lançant weewx avec la configuration weewx_binding avant de lancer le dispositif opérationnel avec la base mariadb locale wx_mariadblocal_binding.
6.10.6 Mise en place d'un serveur web
Nous allons utiliser la base de données locale mariadb installée ci dessus et les outils proposés par le site météo Villarzel. Le site web est installé dans le répertoire /opt/WeatherWeb. Le fichier à configurer est /opt/WeatherWeb/mysql_connect.php
sudo mkdir /opt/WeatherWeb
sudo nano /opt/WeatherWeb/mysqli_connect.php
Le fichier est de la forme suivante en remplaçant les * par les valeurs correspondant à votre situation :
<?php
$server ="localhost:********";
$user="**********";
$pass="***********";
$db="******************";
mysql_connect($server,$user,$pass) or die ("Erreur SQL : ".mysql_error() );
mysql_select_db($db) or die ("Erreur SQL : ".mysql_error() );
?>
Il est aussi nécessaire de configurer le serveur web nginx installé par défaut en éditant le fichier /etc/nginx/sites-available/meteoRaspWife3.
sudo nano /etc/nginx/sites-available/meteoRaspWife3
Le contenu du fichier doit être du type :
server {
listen 80 default_server;
listen [::]:80 default_server;
root /opt/WeatherWeb/;
index index.html index.htm index.php;
server_name _;
location / {
try_files $uri $uri/ /index.html;
}
location ~ \.php$ {
fastcgi_split_path_info ^(.+\.php)(/.+)$;
# With php7-fpm:
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
include fastcgi_params;
}
}
Pour terminer modifier le fichier de configuration par défaut du serveur web nginx.
sudo rm /etc/nginx/sites-enabled/default
sudo ln -s /etc/nginx/sites-available/meteoRaspWife3 /etc/nginx/sites-enabled/
6.10.7 Mise en place d'une connexion WIFI
Ce système a été conçu sans accès à un serveur DHCP pour des raisons de sécurité. Il est possible qu'il soit nécessaire d'accéder temporairement à un WIFI pour cela il est nécessaire de faire les manipulations suivantes :
* ajouter un fichier de pilotage du réseau wifi
* installer et configurer le driver du chipset wifi
* installer et configurer un outil de gestion du wifi
Ajout du pilotage du wifi
cat > /etc/systemd/network/51-wireless.network
[Match]
Name=wlan0
Host=hostname
[Network]
DHCP=yes
[DHCP]
RouteMetric=20
Installation et configuration du driver
sudo apt install firmware-brcm80211 rfkill iw
À la date de test (18/09/2022) le module du noyau ne fonctionne pas il est nécessaie de changer de module opérationnel en ajoutant le lien suivant :
cd /lib/firmware/brcm/
sudo ln -s ../cypress/cyfmac43430-sdio.bin brcmfmac43430-sdio.raspberrypi,3-model-b.bin
Installation et configuration dde wpasupplicant
sudo apt install wpasupplicant
Ajouter le réseau wifi dans le fichier de configuration
le fichier /etc/wpa_supplicant/wpa_supplicant-wlan0.conf doit avoir la forme :
ctrl_interface=/run/wpa_supplicant GROUP=netdev
update_config=1
p2p_disabled=1
eapol_version=1
ap_scan=1
fast_reauth=1
network={
ssid="DDID name"
psk="Passphrase"
}
7. Propagation des images
7.1. Organisation des services au démarrage
Tous les services et logiciels décrits ci-dessus sont opérationnels mais par défaut une partie seulement sont activés au démarrage. Il est possible de les démarrer à tout moment soit par localadm (qui dispose des droits de root via le sudo soit en ligne de commande soit en utilisant les scripts préparés à cet effet. Ci dessous le statut des services par défaut :
- jupyter is set
sudo systemctl enable jupyterhub - xrdp is set
sudo systemctl enable xrdp - vncserveris set
sudo systemctl enable vncserver - mariadb is not set
sudo systemctl disable mariadb - domotix is not set
sudo systemctl disable domoticz - weewx is not set
sudo systemctl disable weewx - nginx is set
sudo systemctl enable nginx - kodi is available
weewx and mariadb ne sont pas configurés car leur configuration dépend fortement des paramètres locaux liés à l'utilisateur et à l'usage qui en est fait. xrdp et vncserver permettent de se connecter via des serveurs de terminaux respectivement dans le monde windows ou le monde unix/linux. Une connexion vérifiée est configurée dans le fichier /etc/wpa_supplicant/wpa_supplicant-wlan0.conf. Attention dans certains cas le nom de l'interface n'est pas le nom générique wlan0 mais un nom translaté en fonction de l'adresse MAC de l'interface de type wlx############ il faut dans ce cas renommer le fichier
7.2. Clonage et mise à disposition
Une fois que tous les programmes souhaités sont ajoutés et toutes les options configurées les images peuvent être diffusées sous forme binaire compressée, il suffit alors à tout usager qui souhaite se les approprier de téchager le fichier et le copier sur une micro-SD qui sera immédiatement opérationnelle. Éteindre la Raspberry pi et extraire la micro-SD puis l'insérer dans un ordinateur (dans le cas ci-dessous elle apparaît sur le device /dev/mmcblk0. Copier "bit à bit" le contenu de la micro-SD sur le disque dur de l'ordinateur avec les options de maîtrise des espaces vides et le contrôle de la taille; l'image proposée dans ce blog pouvant contenir dans une micro-SD de 8Go. Le nom de l'image utilise les règles de nommage utilisées au chap 1.C. Pour faciliter la copie de l'image on propose de créer le fichier bmap correspondant et de la compresser (le logiciel bmaptools traite directement les images compressées ce qui minimise les temps de téléchargement et évite le temps de décompression)
sudo dd if=/dev/mmcblk0 of=2018-01-07-rpi3-stretch.img bs=4M conv=sparse count=2500
bmaptool create -o 2018-01-07-rpi3-stretch.bmap 2018-01-07-rpi3-stretch.img
7z a -txz 2018-01-07-rpi3-stretch.img.xz 2018-01-07-rpi3-stretch.img
Les usagers devront télécharger les deux fichiers 2018-01-07-rpi3-stretch.img.xz et 2018-01-07-rpi3-stretch.bmap et utiliser ensuite bmaptool pour la recopier sur une micro-SD vierge :
sudo bmaptool copy --bmap 2018-01-07-rpi3-stretch.bmap 2018-01-07-rpi3-stretch.img.xz /dev/mmcblk0
Une fois la copie terminée la micro-SD est immédiatement opérationnelle.
Comments !