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.
- Téléchargement
source debian standard pour raspberryPi ARM64
- 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.1 Outils pour l'apprentissage de la programmation
- 5.2 Installation de Jupyterlab et Jupyterhub
- 5.3 Configuration de jupyterhub et de la sécurité du lancement par callisto
- 5.4 Ajout de moteurs l'environnement jupyter/jupyterhub
- 6. Activation des accès aux périphériques
- 6.1 Accès au GPIO
- 6.2 Accès à l'USB
- 6.3 Accès à la caméra
- 6.4 Installation d'un simulateur graphique de réseau
- 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 d'un media-center
- 6.9 Installation et configuration d'un pare-feu
- 6.10 Ajout des cahiers de programmes pour apprendre/enseigner la programmation (À tester vérifier augmenter)
- 6.11 Organisation des services au démarrage
- 7. Clonage et mise à disposition
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.
1.2 Modification de l'adresse filaire
Par défaut cette image installe l'ancienne version de nommage des interfaces réseau (eth0 pour le filaire). Pour une modification immédiate il suffit de modifier la ligne de commande du fichier /boot/firmware/cmdline.txt et lui donner la valeur ci-dessous. Toutefois pour que cette valeur n'est pas prise par défaut et il faut refaire la modification après un update-upgrade.
console=tty0 console=ttyS1,115200 root=PARTUUID=c236ba2e-d90d-47bb-ad8a-428f466557c9 rw fsck.repair=yes cma=64M rootwait
L'option net.ifnames=0 a été supprimée.
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), rpi4 ou rpi5
- 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
trixieou trixie64 au 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 16 mai 2026 pour une RaspberryPi3 en trixie 64 bits pour le codage et le développement a pour nom : rpi3-dev-trixie64_26-05-16 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 Création d'un point d'accès
Le but de cette opération est de fournir un point d'accès à la raspberryPi sans connection filaire ni Wifi local. L'objectif est de disposer d'un accès direct à la rasberryPI lors du premier démarrage pour pouvoir terminer la configuration sans avoir besoin d'un écran ou d'un clavier.
Quelques documentations : * sur iw * sur un AP sous debian
La création du point d'accès requiert plusieurs logiciels chacun pour une fonction distincte du processus de création du point d'accès (AP).
* iw crée l'interface virtuelle à côté de l'interface de connection Wifi
* hostapd lance le daemon de service wifi
* udhcpd lance le daemon dhcp fournissant l'IP
Création d'une interface virtuelle
Il est possible d'utiliser l'interface wlan0 comme point d'accès mais cela supprime toute possibilité de se connecter à un réseau wifi local via cette interface. Si on souhaite conserver cette possibilité il faut créer une interface virtuelle avec iw :
sudo apt install iw
sudo iw phy phy0 interface add vwlan1 type __ap
# Le résultat est une interface wlan1 partageant la ressource physique wifi, voir ci-dessous (cela va obligatoirement baisser les performances).
ens-ife[~] rpitremplin-€ : ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host noprefixroute
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
link/ether b8:27:eb:cf:5e:d9 brd ff:ff:ff:ff:ff:ff
inet 192.168.10.40/24 metric 100 brd 192.168.10.255 scope global dynamic eth0
valid_lft 86262sec preferred_lft 86262sec
inet6 fe80::ba27:ebff:fecf:5ed9/64 scope link proto kernel_ll
valid_lft forever preferred_lft forever
3: wlan0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether b8:27:eb:9a:0b:8c brd ff:ff:ff:ff:ff:ff
altname wlxb827eb9a0b8c
4: wlan1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether ba:27:eb:3a:0b:8c brd ff:ff:ff:ff:ff:ff
altname wlxba27eb3a0b8c
La nouvelle interface a été créée mais n'est pas activée. Il est possible de créer un service qui permettra de gérer plus facilement cette interface. Ajouter un fichier dans /etc/systemd/system/, par exemple cat > /etc/systemd/system/wireless-apdevice.service.
cat /etc/systemd/system/wireless-apdevice.service
[Unit]
Description=Template to create virtual wireless interface
Requires=sys-subsystem-net-devices-wlan0.device
After=sys-subsystem-net-devices-wlan0.device
[Service]
Type=oneshot
ExecStart=/usr/sbin/iw phy phy0 interface add wlan1 type __ap
[Install]
WantedBy=multi-user.target
Déclaration de l'interface dans systemd-networkd
netplan impose l'usage de NetworkManager pour créer un AP alors qu'il est possible de déclarer dans systemd-networkd un AP avec un dhcpserver On ajoute un fichier de service dans le dossier /etc/systemd/network/ :
cat /etc/systemd/network/50-wlanserver.network
[Match]
Name=wlan1
[Network]
DHCPServer=yes
Address=192.168.11.2/24
[DHCPServer]
ServerAddress=192.168.11.1/24
[DHCPServer]
PoolOffset=100
PoolSize=20
DNS=9.9.9.9
Il est nécessaire que l'interface wlan1 ait été créée pour qu'elle soit prise en charge par networkd Si elle est créée après le démarrage du rservice il faut le relancer.
daemon hostapd
hostapd est un programme qui crée un AP et lance un daemon qui permettra de se connecter à ce AP.
sudo apt install hostapd
Modifications du fichier de configuration
cat /etc/hostapd/hostapd.conf
interface=wlan1
driver=nl80211
ssid=raspi-Wifi
# a = IEEE 802.11a, b = IEEE 802.11b, g = IEEE 802.11g
hw_mode=g
channel=5
wmm_enabled=0
# Allow connections from all MAC addresses except those in the blacklist
macaddr_acl=0
auth_algs=1
ignore_broadcast_ssid=0
wpa=2
#Set a password for your access point
wpa_passphrase=rpiTremplin2026
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
own_ip_addr=127.0.0.1
domain_name=terrasse2.fr
Si le daemon ne se lance pas (vérifier avec sudo systemctl status hostapd), pour débuguer on peut utiliser la commande suivante : sudo hostapd -d /etc/hostapd/hostapd.conf. Si le daemon est lancé on peut l'arrêter avec sudo systemctl stop hostapd
Par défaut un service est installé.
Configuration de udhcpd
sudo apt install udhcpd
sudo touch /var/lib/misc/udhcpd.leases
sudo jed /etc/udhcpd.conf
Pour avoir les lignes activées seulement
sed 's:#.*$::g' /etc/udhcpd.conf
Modifications du fichier /etc/udhcpd.conf.
sudo jed /etc/udhcpd.conf
start 192.168.11.20
end 192.168.11.254
interface wlan1
max_leases 5
Contrôle du serveur Wifi
Plusieurs configurations sont possibles pour l'image qu'on diffuse, on peut choisir d'activer toutes les interfaces possibles (filaire, WIFI, serveur WIFI) ou seulement l'une d'entre elles ou seulement deux. Ce choix conditionne les stratégies de déploiement.
Pour connaître la combinaison choisie :
sudo systemctl status wireless-apdevice udhcpd hostapd
Pour désactiver les services :
sudo systemctl disable wireless-apdevice.service
sudo systemctl disable udhcpd.service
sudo systemctl disable hostapd.service
Pour activer les services :
sudo systemctl start wireless-apdevice.service
sudo systemctl start hostapd.service
sudo systemctl start udhcpd.service
Pour arrêter les services :
sudo systemctl start udhcpd.service
sudo systemctl start hostapd.service
sudo iw dev wlan1 del
3.3.5 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)
Si le serveur WIFI est activé on peut se connecter directement sur le réseau de la raspberryPi.
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-dev \
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
L'utilisation de poetry pour créer des environnements virtuels python permet de limiter le nombre de modules python installés directement sur le système et de gérer plus facilement les versions et dépendances. Il est toutefois possible d'installer des modules partagés par tous les environnements dans le \python du système. Il est possible 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 des outils python, cette liste est proposée à titre d'exemple et n'est pas exhaustive.
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
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 swap xxx = 524288
- pour 1 Go de swap xxx = 1048576
- pour 2 Go de swap xxx = 2097152
- etc...
sudo su
dd if=/dev/zero of=/swapfile bs=1024 count=1048576
chown root:root /swapfile
chmod 0600 /swapfile
mkswap /swapfile
swapon /swapfile
Pour vérifier l'activité :
swapon -s
free -m
Après un redémarrage si le swap est nécessaire, on l'ajoute avec la commande sudo swapon /swapfile et il est immédiatement utilisable.
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.
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. C'est particulièrement utile quand on utilise un user ordinaire pour lancer un service plutôt que d'utiliser root(jupyterhub lancé par _callisto) pour ce qui nous intéressera plus loin
L'outil nvm (pour lequel il n'existe pas de paquet debian) facilite le suivi de node.JS, nous installerons la version LTS (version à long terme) ou la version STABLE (dernière version stable à jour).
L'inconvénient de cette solution est que les fichiers de configuration .nvm et .npm sont installés dans le home de l'utilisateur ainsi que le dossier des modules : node_modules
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)
Réaliser la même opération pour le user callisto. Elle permettra d'utiliser des modules pour jupyterhub sans perturber le système global.
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
touch Doxyfile
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
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 l'augmentation du swap (swapon /swapfile si le swap a été créé comme proposé plus faut), 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/mraa.git
git clone https://github.com/eclipse-upm/upm.git
# Autres sources
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 libjson-c-dev python3-dev
sudo apt install libjson-c-dev python3-dev
sudo apt install libnative-platform-jni
Modifications du CMakeLists.txt
Les modifications de policy sont imposées par l'évolution des logiciels depuis la création initiale de ce fichier. les option sont modifiées pour avoir les fonctions java et javascript lors des développements avec Jupyter.
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)
Tester la définition de JAVA_HOME sinon :
# export JAVA_HOME=/usr/lib/jvm/java-25-openjdk-arm64
(À vérifier) Tester et régler le problème de l'interface i2c si besoin fichier src/mraa.c
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"))
Modifications de swig_link_libraries par target_link_libraries
cd Logiciels/IoT/mraa/src/
jed java/CMakeLists.txt
jed javascript/CMakeLists.txt
jed python/python3/CMakeLists.txt
Compilation
Pour la compilation la version C++23 a été utilisée via des modifications dans le CMakefiles.txt
mkdir build
cd build
cmake -DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_MODULE_PATH=/usr/local/share/cmake-4.3/Modules/ \
-DNODEJS_INCLUDE_DIRS=/home/ens-ife/\
.nvm/versions/node/v25.8.1/include/node \
-DSWIG_EXECUTABLE=/usr/local/bin/swig ..
make -j4
Il subsite un \warning_ et une error. Éditer build/src/python/python3/CMakeFiles/python3-mraa.dir/mraa3PYTHON_wrap.cxx et faire les modifications suivantes :
//#define SWIGPYTHON
// extern mraa_lang_func_t* lang_func;
mraa_lang_func_t* lang_func = NULL;
.../...
La compilation avec make -j4 aboutit et on peut installer les libs mraa avec sudo make install
La dernière version est disponible sur la forge tremplin. L'ensemble des modifications effectuées est obtenue en recherchent les différences entre master et tremplin sur la forge git diff master.
`
5.1.1.2. UPM
sudo apt install libjpeg-dev
Au 2026-04-21 lorsque cette compilation a été effectuée avec succès, le logiciel a besoin d'une profonde révision du fait des importantes évolutions des codes annexes (cmake, python node). En particulier la compilation s'appuie sur python2 avec des extensions en python3 alors que que python2 a disparu. La solution utilisée a été un empilement de contournements pour utiliser les versions à jour et réussir la compilation. Il est nécessaire de reprendre le code avec les nouvelles versions des logiciels impliqués.
Pour plus de commodité et permettre de reproduire ce travail la version opérationnelle a été déposée en l'état sur la forge du projet tremplin des sciences. La liste des fichiers modifiés est la suivante : * modifié : CMakeLists.txt * modifié : cmake/modules/FindNode.cmake * modifié : cmake/modules/FindNpm.cmake * modifié : cmake/modules/OpenCVDetectPython.cmake * nouveau fichier : cmake/modules/OpenCVDetectPython.oldcmake * modifié : include/upm_types.h * modifié : src/CMakeLists.txt * modifié : src/ehr/ehr.cxx * supprimé : src/hp20x/CMakeLists.txt * supprimé : src/hp20x/hp20x.cxx * supprimé : src/hp20x/hp20x.hpp * supprimé : src/hp20x/hp20x.json
cd ~/Logiciels/IoT/
git clone https://depot.tremplin.ens-lyon.fr/Raspberries/upm.git
cd upm/build
cmake -DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_MODULE_PATH=/usr/local/share/cmake-4.3/Modules/ \
-DNODE_ROOT_DIR=/home/ens-ife/.nvm/versions/node/v24.14.0/ \
.. >& trace.txt
sudo rm -r ./*;\
cmake -DCMAKE_INSTALL_PREFIX=/usr \
-DCMAKE_MODULE_PATH=/usr/local/share/cmake-4.3/Modules/ \
-DNODEJS_INCLUDE_DIRS=/home/ens-ife/.nvm/versions/node/v25.8.1/include/node \
-DSWIG_EXECUTABLE=/usr/local/bin/swig .. >& ../trace.txt
make -j4
sudo make install
# Pour lancer une compilation complète effacer si besoin le dossier
sudo rm -r ./*
Si besoin : npm install -g upm-cordova-binding
5.2 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 outil companion de Jupyter 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 poetry. Il est possible de réaliser une installation dans un environnement virtuel poetry 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 éviter que le serveur jupyterlab soit contrôlé par root On installe l'environnement virtuel et les ressources jupyter sous la responsabilité du user callisto.
5.2.1 Installation de poetry
Depuis ens-ife .
sudo cp .bashrc /home/callisto
sudo chown callisto:callisto /home/callisto/.bashrc
sudo cp -r .ssh /home/callisto
sudo chown -R callisto:callisto /home/callisto/.ssh
sudo apt install python3-poetry rustc
Passer ensuite sous callisto.
sudo su callisto
cd
mkdir Jupyter
cd Jupyter/
poetry init
Package name [jupyter]:
Version [0.1.0]: 1.0.0
Description []: Jupyter dev tool
Author [None, n to skip]: n
License []:
Compatible Python versions [>=3.13]:
Would you like to define your main dependencies interactively? (yes/no) [yes] no
Would you like to define your development dependencies interactively? (yes/no) [yes] no
Generated file
[project]
name = "jupyter"
version = "1.0.0"
description = "Jupyter dev tool"
authors = [
{name = "Your Name",email = "you@example.com"}
]
readme = "README.md"
requires-python = ">=3.13"
dependencies = [
]
[build-system]
requires = ["poetry-core>=2.0.0,<3.0.0"]
build-backend = "poetry.core.masonry.api"
Do you confirm generation? (yes/no) [yes]
5.2.2 Installation de jupyterlab et jupyterhub
cd ~/Jupyter
poetry add jupyterlab jupyterhub notebook
poetry add sudospawner flexx plotly pandas netCDF4 numpy six spidev pillow RPi.GPIO
5.2.3 Installation des ressources mraa et upm dans l'environnement virtuel de callisto
Détection de la localisation de l'environnement virtuel python
sudo su callisto
cd ~/Jupyter
poetry env info
.../...
/home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13
.../...
Localisation des librairies et binaires python de mraa et copie dans l'environnement virtuel.
ls /lib/python3.13/dist-packages/
mraa.py _mraa.so upm
cp /lib/python3.13/dist-packages/*mraa* /home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/lib/python3.13/site-packages/
Localisation des librairies et binaires python de upm et copie dans l'environnement virtuel.
ls src/*/python3.13/*.py
sudo cp /home/ens-ife/Logiciels/IoT/upm/build/src/*/python3.13/*.py /home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/lib/python3.13/site-packages/
sudo chown -R callisto:callisto /home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/lib/python3.13/site-packages
5.3 Configuration de jupyterhub et de la sécurité du lancement par callisto
5.3.1 Création du fichier de configuration
Callisto va regrouper toutes les informations concernant jypyterhub même si les fichiers de configuration sont dispatchés dans d'autres dossiers.
En callisto :
cd ~/Jupyter
`poetry env activate`
cd
mkdir Jupyterhub
cd !$
jupyterhub --generate-config
Pour tester à tout moment l'état du fichier de onfiguration
sed -e '/^\s*#.*$/d' -e '/^\s*$/d' jupyterhub_config.py
Modifier le fichier schema.py comme indiqué ci-dessous pour éviter l'alerte au lancement de jupyterhub.
/home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/lib/python3.13/site-packages/jupyter_events/schema.py
@property
# def version(self) -> int:
def version(self) -> str:
5.3.2 Création des fichiers de sécurisation
Pour assumer la configuration envisagée l'utilisateur callisto doit créer le certificat de sécurité ainsi que le token partagé et le cookie secret.
sudo su callisto
cd
mkdir -p Utils/Certificates
cd !$
# elliptic
openssl ecparam -list_curves
# c2pnb272w1
openssl ecparam -rand /dev/urandom -name c2pnb272w1 -genkey -noout -out meteojuphub.key
openssl req -new -x509 -days 365 -noenc -key meteojuphub.key -out meteojuphub.pem
# ECDSA en une seule commande
openssl req -newkey rsa:4096 -x509 -sha512 -days 365 -noenc -out meteojuphub.pem -keyout meteojuphub.key
Répondre aux questions posées en fonction de vos paramètres.
Création du token partagé de jupyterhub.
cd
mkdir Tokens
cd Tokens/
openssl rand -hex 32 > tokenJupyterhub.txt
5.3.3 Modification du fichier des sudoers
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 :
# Cmnd alias specification
#---- Jupyterhub----
# 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/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/bin/sudospawner
# actually give the Hub user permission to run the above command
# on behalf of the above users without prompting for a password
callisto ALL=(%jupyterhub) NOPASSWD:JUPYTER_CMD
#-------------------
L'utilisateur callisto doit aussi appartenir au groupe shadow.
sudo adduser callisto shadow
On dispose maintenant des fichiers de sécurisaton nécessaires 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é.
5.3.4 Configuration
La configuration de jupyterhub est une opération délicate qui peut être faite en suivant pas à pas ce tutoriel. Dans plusieurs étapes des choix alternatifs sont possibles nous ne reproduirons ici que les choix faits pour l'image Tremplin des sciences.
Il est possible d'effectuer un démarrage par défaut avant configuration :
jupyterhub -f /etc/jupyterhub/jupyterhub_config.py cela permet de vérifier l'installation mais ne fournit pas tous les services.
5.3.4.1 Activation du lancement par callisto
Nous avons choisi de lancer le hub par un utilisateur non privilégié il est nécessaire d'effectuer quelques modifications dans le fichier de configuration pour permettre le lancement d'un jupyterlab par plusieurs utilisateurs à partir d'un hub lancé par callisto.
Le fichier jupyterhub_config.py original est recopié dans le dossier /home/callisto/Jupyterhub et est modifié comme indiqué ci-dessous :
c = get_config() #noqa
c.JupyterHub.spawner_class='sudospawner.SudoSpawner'
c.JupyterHub.ssl_cert = '/home/callisto/Utils/Certificates/meteojuphub.pem'
c.JupyterHub.ssl_key = '/home/callisto/Utils/Certificates/meteojuphub.key'
c.Authenticator.admin_users = set(['localadm','callisto','ens-ife'])
c.Authenticator.allow_all = True
c.Authenticator.any_allow_config = True
La méthode d'authentification permet à tous les usagers capables de se connecter à la raspberry de pouvoir accèder à jupyterlab. Cette méthode pourra être affinée ultérieurement, ce qui n'interfère pas avec l'installation.
5.3.4.2 Lancement de traefik séparément du hub
Pour fonctionner jupyterhub utilise un serveur web relais qui envoie depuis interne (localhost:8000 dans notre configuration), vers une adresse et un port externe (192.168.10.49:443 dans notre configuration). Nous utilisons traefik qui est activé sous la forme d'un service systemd.
Installation de traefik par le user callisto
Installer l'exécutable:
cd /home/poetry/Jupyter
poetry add jupyterhub-traefik-proxy
`poetry env activate`
python3 -m jupyterhub_traefik_proxy.install
sudo mkdir /home/callisto/Jupyterhub/Utils/Traefikraefik
cd ../Jupyterhub/Utils/Traefikraefik
Créer les fichiers de configuration traefik.toml et rules.toml
nano traefik.toml
cat /etc/traefik/traefik.toml
[api]
[providers]
providersThrottleDuration = "0s"
[log]
level = "DEBUG"
[providers.file]
directory = "/home/callisto/Jupyterhub/Utils/Traefik"
filename = "/home/callisto/Jupyterhub/Utils/Traefik/rules.toml"
watch = true
[entryPoints.https]
address = "192.168.10.49:443"
[entryPoints.auth_api]
address = "localhost:8099"
[entryPoints.https.http.tls]
options = "default"
nano rules.toml
cat rules.toml
[http.routers.route_api]
rule = "Host(`localhost`) && PathPrefix(`/api`)"
entryPoints = [ "auth_api",]
service = "api@internal"
middlewares = [ "auth_api",]
[http.routers.router__2F]
service = "service__2F"
rule = "PathPrefix(`/`)"
entryPoints = [ "https",]
[jupyterhub.routes.router__2F]
routespec = "/"
target = "http://127.0.0.1:8000"
router = "router__2F"
service = "service__2F"
[http.middlewares.auth_api.basicAuth]
users = [ "api_admin:$2b$12$myaveYCayZnQQz9c6oaSue7vw.kD7FklQrSSOAIJKRKnx8j5y5lGG",]
[http.services.service__2F.loadBalancer]
passHostHeader = true
[[http.services.service__2F.loadBalancer.servers]]
url = "http://127.0.0.1:8000"
[tls.stores.default.defaultCertificate]
certFile = "/home/callisto/Jupyterhub/Utils/Certificates/meteojuphub.pem"
keyFile = "/home/callisto/Jupyterhub/Utils/Certificates/meteojuphub.key"
[jupyterhub.routes.router__2F.data]
hub = true
Création du service traefik.service
Pour simplifier la gestion du serveur traefik on ajoute le fichier de service traefik.service dans /etc/systemd/system
cd /etc/systemd/system
nano traefik.service
cat traefik.service
[Unit]
Description=Traefik
Documentation=https://doc.traefik.io/traefik/
#After=network-online.target
#AssertFileIsExecutable=/usr/bin/traefik
#AssertPathExists=/etc/traefik/traefik.toml
[Service]
# Run traefik as its own user (create new user with: useradd -r -s /bin/false -U -M traefik)
#User=traefik
User=callisto
AmbientCapabilities=CAP_NET_BIND_SERVICE
# configure service behavior
Type=notify
ExecStart=/usr/local/bin/traefik --configFile=/home/callisto/Jupyterhub/Utils/Traefik/traefik.toml
Restart=always
WatchdogSec=1s
# lock down system access
# prohibit any operating system and configuration modification
#ProtectSystem=strict
# create separate, new (and empty) /tmp and /var/tmp filesystems
#PrivateTmp=true
# make /home directories inaccessible
#ProtectHome=true
# turns off access to physical devices (/dev/...)
#PrivateDevices=true
# make kernel settings (procfs and sysfs) read-only
#ProtectKernelTunables=true
# make cgroups /sys/fs/cgroup read-only
#ProtectControlGroups=true
# allow writing of acme.json
#ReadWritePaths=/etc/traefik/acme.json
# depending on log and entrypoint configuration, you may need to allow writing to other paths, too
# limit number of processes in this unit
#LimitNPROC=1
[Install]
WantedBy=multi-user.target
Le service est lancé par la commande sudo systemctl start traefik.service. Le service peut être configuré pour être mis en route au démarrage par la commande sudo systemctl enable traefik.service
5.3.4.3 Lancement de jupyterhub
Pour plus de commodité jupyterhub est lancé comme un service (après traefik !), il est nécessaire de créer le fichier jupyterhub.service dans le dossier /etc/systemd/system contenant les instructions ci-dessous :
cd /etc/systemd/system
nano jupyterhub.service
cat jupyterhub.service
[Unit]
Description=JupyterHub
After=syslog.target network.target traefik.target
[Service]
User=callisto
WorkingDirectory=/home/callisto/Jupyterhub
Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/bin"
ExecStart=/home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/bin/jupyterhub -f /home/callisto/Jupyterhub/Utils/jupyterhub_config.py
[Install]
WantedBy=multi-user.target
Le service est lancé par la commande sudo systemctl start jupyterhub.service. Le service peut être configuré pour être mis en route au démarrage par la commande sudo systemctl enable jupyterhub.service
5.4 Ajout de moteurs 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, voir ici la liste des langages disponibles. À titre d'exemple nous proposons ici l'installation de quelques noyaux additionnels.
5.4.1 Langage C++
Pour réaliser des notebooks en langage il suffit d'ajouter l'extension clang_repl_kernel qui fournit un noyau proposant plusieurs versions de C++. L'ajout se fait via poetry :
sudo su callisto
cd ~/Jupyter
poetry add clang-repl clang_repl_kernel
le noyau clang est immédiatement accessible depuis jupyterlab Mais les sous-versions 14 17 20 23 (qui correspondent aux années de normalisation) ne sont pas accessibles. Les fichiers jupyter/kernels/clang_repl_cpp##/kernel.json sont anormaux il est ncessaire de les remplacer par les fichiers suivants :
clang_repl/kernel.json
{"argv": ["python", "-m", "clang_repl", "-f", "{connection_file}"], "display_name": "clang_repl", "language": "c++"}
clang_repl_cpp14/kernel.json
{"argv": ["python", "-m", "clang_repl", "-f", "{connection_file}", "--std=c++14"], "display_name": "clang_repl (C++14)", "language": "c++"}
clang_repl_cpp17/kernel.json
{"argv": ["python", "-m", "clang_repl", "-f", "{connection_file}", "--std=c++17"], "display_name": "clang_repl (C++17)", "language": "c++"}
clang_repl_cpp20/kernel.json
{"argv": ["python", "-m", "clang_repl", "-f", "{connection_file}", "--std=c++20"], "display_name": "clang_repl (C++20)", "language": "c++"}
clang_repl_cpp23/kernel.json
{"argv": ["python", "-m", "clang_repl", "-f", "{connection_file}", "--std=c++23"], "display_name": "clang_repl (C++23)", "language": "c++"}
5.4.2 Langages javascript et typescript
Il n'est pas facile de trouver un noyau javascript stable du fait de l'évolution ultra-rapide de ce langage; il est probable que peu de mainteneurs puissent suivre la cadence. Il semble que deno soit une solution alternative intéressante (installée non testée dans ce projet), facile à installer.
Installer deno
sudo su callisto
cd
curl -fsSL https://deno.land/install.sh | sh
Installer le noyau jupyter
deno jupyter --install
# si le kernel est installé dans le .local/share le copier
cp -r /home/callisto/.local/share/jupyter/kernels/deno /home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/share/jupyter/kernels/
# si cela fonctionne le supprimer du .local
rm -r /home/callisto/.local/share/jupyter/kernels/deno
5.4.3 Langage Java
Pour ajouter un noyau java la ressource ijava est obsolète, un nouvel utilitaire jjava est en cours de développement (pre-release) mais déjà opérationnel c'est lui qui est utilisé. L'installation a été faite en suivant la procédure ci-dessous.
sudo su callisto
cd ../Jupyterhub/Utils/
mkdir Java
cd Java/
wget https://github.com/dflib/jjava/releases/download/1.0-a7/jjava-1.0-a7-kernelspec.zip
unzip jjava-1.0-a7-kernelspec.zip
jupyter kernelspec install ../Java --user --name=java
jupyter kernelspec list
Available kernels:
java /home/callisto/.local/share/jupyter/kernels/java
clang_repl /home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/share/jupyter/kernels/clang_repl
clang_repl_cpp14 /home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/share/jupyter/kernels/clang_repl_cpp14
clang_repl_cpp17 /home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/share/jupyter/kernels/clang_repl_cpp17
clang_repl_cpp20 /home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/share/jupyter/kernels/clang_repl_cpp20
clang_repl_cpp23 /home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/share/jupyter/kernels/clang_repl_cpp23
deno /home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/share/jupyter/kernels/deno
python3 /home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/share/jupyter/kernels/python3
Il est nécessaire de déplacer le noyau dans l'environnement virtuel qui n'a pas été pris en compte (comme pour deno).
mv /home/callisto/.local/share/jupyter/kernels/java /home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/share/jupyter/kernels
5.4.4 Extensions
La version 3 de jupyterlab permet d'ajouter les extensions depuis l'interface web. Pour que les usagers puissent ajouter leurs extensions il est nécessaire d'avoir le droit d'écriture dans le dossier jupyter/labextensions, par construction les permissions de ce dossier permettent à tous les usagers du groupe jupyterhub d'écrire ce qui permet un fonctionnement direct. En cas de problème vérifier les permissions de ce dossier.
6. Activation des accès aux périphériques
6.1 Accès au GPIO
6.1.1 Configuration globale du GPIO
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/platform/soc/3f200000.gpio && chmod -R 770 /sys/devices/platform/soc/3f200000.gpio; \
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'"
Dans la version actuelle les dossiers virtgpio ont disparu, les documentations précisent qu'une modification a été faite dans l'organisation de la configuration rendant obsolète les commandes suivantes, elles sont reprises ici en cas d'évolution du système.
chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio; \
chown -R root:gpio /sys/devices/platform/soc/soc:virtgpio && chmod -R 770 /sys/devices/platform/soc/soc:virtgpio; \
6.1.2 Ajout du bus SPI
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/platform/soc/fe200000.gpio && chmod -R 770 /sys/devices/platform/soc/fe200000.gpio; \
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'"
Même remarque que ci-dessus pour le virtgpio.
chown -R root:gpio /sys/devices/virtual/gpio && chmod -R 770 /sys/devices/virtual/gpio; \
chown -R root:gpio /sys/devices/platform/soc/soc:virtgpio && chmod -R 770 /sys/devices/platform/soc/soc:virtgpio; \
On modifie aussi la ligne de commande dans /boot/firmware/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
6.2 Accès à l'USB
Tout comme le GPIO l'USB n'est pas accessible aux utilisateurs de base. Par exemple quand il existe l'utilsateur weewx est un utilisateur non privilégié qui doit pouvoir accéder à la station via une interface USB. Pour y parvenir on ajoute au même endroit le fichier 40-usbweewx.rules avec la commande ci-dessous. Il suffit d'adapter cet exemple a tout utilisateur et tout appareil connecté à l'USB.
cat > /etc/udev/rules.d/40-usbweewx.rules
on ajoute le contenu suivant avec les informations issues de la console connectée (idVendor et IdProduct) :
# 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"
6.3 Accès à la caméra
L'activation de la caméra se passe en deux étapes car par défaut la détection de la caméra n'est pas activée, cette situation est probablement due à la volonté de ne pas "gaspiller les ressources limitées de la Raspberry. Dans cette optique il est conseillé de n'activer la caméra qu'uniquement quand on va l'utiliser car contrairement à d'autres fonctionnalités celle ci immobilise des ressources notamment de la mémoire.
6.3.1 Détection de la caméra
Pour détecter la camera il est nécesaire de modifier la configuration du fichier de boot mais ce dernier est reconstruit avec les autres fichiers de configuration du boot :
/etc/default/raspi-firmware
/etc/default/raspi-firmware-custom
/etc/default/raspi-extra-cmdline
Pour le moment nous avons seulement modifié directement le fichier config.txt comme indiqué ci-dessous. La procédure n'a pas été testée avec la une cam mais la répartitionde mémoire a fonctionné : passage de 943 Mo à 843 Mo.
La fin du fichier est recopiée ci-dessous.
gpu_mem=16
initramfs initramfs-4.13.16-v7 followkernel
dtparam=i2c_arm=on
dtparam=spi=on
La modifier pour lui donner l'aspect suivant
initramfs initramfs-4.13.16-v7 followkernel
dtparam=i2c_arm=on
dtparam=spi=on
gpu_mem=16 # Comment this line when activating the camera to provide more memory
# camera activation
# To activate camera at least uncomment the two following lines
# AND comment the line above gpu_mem=16
#
#start_x=1 # essential
#gpu_mem=128 # at least, or maybe more if you wish
#
Pour activer la camera il faut commenter la ligne gpu_mem=16 et décommenter les deux lignes start_x=1 et gpu_mem=128 puis impérativement rebooter. Une fois le reboot effectué si la caméra est connectée elle apparait aux côtés des autres périphériques sous le nom /dev/vchiq
6.3.2 Ajout des logiciels de pilotage de la caméra
La caméra et le module de pilotage sont alignés sur les modules standard de la distribution Debian dont v4l2. Plusieurs paquets fournissent des librairies et des outils qui permettent d'interagir avec les Picaméras. Il existe de nombreux modèles avec des compatibilités variées suivant les modèles de raspberryPi, choisir avec attention sa caméra.
Les paquets debian suivants ont été installés (non testés)
sudo apt install libcamera-tools libcamera-v4l2
sudo apt install v4l-utils uvcdynctrl ustreamer qv4l2 megapixels libwebcam0
Il existe une librairie python fournissant des applications d'interface avec les cameras des raspberryPi. Elle est en version beta mais est installable en suivant cette procédure (la doc dit qu'il existe un paquet debian mais il est introuvable)
sudo apt install libcap-dev
mkdir Logiciels/Camera
cd Logiciels/Camera
wget https://datasheets.raspberrypi.com/camera/picamera2-manual.pdf
wget https://github.com/raspberrypi/picamera2/archive/refs/tags/v0.3.36.tar.gz
tar xvfz v0.3.36.tar.gz
cd picamera2-0.3.36
poetry lock
poetry update
`poetry env activate`
6.4 Installation d'un simulateur graphique de réseau
Le logiciel filius est répandu dans l'éducationale, il ne fournit pas les fonctions avancées de quelques autres outils professionnels mais permet d'effectuer un grand nombre de manipulations. Il est installé par la méthode ordinaire d'installation des paquets, le nombre de dépendances est toutefois important.
sudo apt install filius
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 github.
cd
mkdir Logiciels/Snap
cd !$
git clone https://github.com/jmoenig/Snap.git --single-branch
sudo cp -r Snap /opt
sudo ln -s /opt/Snap /var/www/html/snap
Attention taille du transfert > 1.5 Go.
Snap!BYOB est maintenant directement accessible sur le serveur web de la Raspberry Pi http://$$$.$$$.$$$.$$$/snap
Le serveur web doit être configuré (test à réaliser)
6.6 Installation de Domoticz pour piloter des objets connectés du commerce
cd
mkdir Logiciels/Domoticz
cd !$
wget https://github.com/domoticz/domoticz/releases/download/2026.1/domoticz_linux_aarch64.tgz
tar xvfz domoticz_linux_aarch64.tgz
sudo apt install libusb-0.1-4 libmosquitto1
Le serveur web doit être configuré (test à réaliser)
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/
6.7 Ajout de scripts pour démarrer ou supprimer un service au démarrage
Un certain nombre de services ont été mis en place lors des étapes précédentes et cette logique peut-être étendue à à peu près tous les services installés. Il faut créer un fichier de service dans /etc/systemd/system portant une extension .service avec la syntaxe suivante (exemple jupyterhub):
[Unit]
Description=JupyterHub
After=syslog.target network.target traefik.target
[Service]
User=callisto
WorkingDirectory=/home/callisto/Jupyterhub
Environment="PATH=/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/bin"
ExecStart=/home/callisto/.cache/pypoetry/virtualenvs/jupyter-cp9TDEDI-py3.13/bin/jupyterhub -f /home/callisto/Jupyterhub/Utils/jupyterhub_config.py
[Install]
WantedBy=multi-user.target
6.8 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. Le cœur du logiciel a été installé il dispose nombreuses extensions qui peuvet être ajoutées par des paquets debian.
Pour installer :
sudo apt install kodi kodi-bin kodi-data
6.9 Installation et configuration d'un 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
Par défaut le service est désactivé et le fichier de configuration totalement permissif. Pour activer nftables au démarrage par défaut:
sudo systemctl enable nftables.service
Le fichier de configuration se trouve ici. À titre d'exemple la configuration du pare-feu pour le projet tremplin est proposée ci-dessous afin de permettre le fonctionnement à minima du pare-feu. Il 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.
Exemple de fichier de configuration nftables.conf (les *** doivent être remplacés par les valeurs du réseau local où est installée la _raspberryPi).
#!/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 Ajout des cahiers de programmes pour apprendre/enseigner la programmation (À tester vérifier augmenter)
le projet Tremplin des Sciences a fourni une variété de cahiers de programmes disponibles sur la forge github. Ils peuvent être téléchargés et exécutés depuis le serveur jupyterhub de la raspberryPi.
moon est l'utilisateur lambda de la raspberryPi, il est utilisé à titre d'exemple ici.
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
6.11 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 ens-ife ou par localadm (qui dispose des droits de root via le sudo, soit en ligne de commande. Ci dessous le statut des services par défaut :
- jupyter is set
sudo systemctl enable jupyterhub - xrdp is set
sudo systemctl enable xrdp - domoticz is not set
sudo systemctl disable domoticz - nginx is set
sudo systemctl enable nginx - kodi is not set
sudo systemctl disable kodi
7. 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 24 Go. 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). La nomenclature a été définie au chapitre 3.1.
sudo dd if=/dev/mmcblk0 of=rpi3-dev-trixie64_2026-05-16.img bs=16M conv=sparse count=1200
bmaptool create -o rpi3-dev-trixie64_2026-05-16.bmap rpi3-dev-trixie64_2026-05-16.img
7z a -txz rpi3-dev-trixie64_2026-05-16.img.xz rpi3-dev-trixie64_2026-05-16.img
Les usagers devront télécharger les deux fichiers rpi3-dev-trixie64_2026-05-16.img.xz et rpi3-dev-trixie64_2026-05-16.bmap et utiliser ensuite bmaptool pour la recopier sur une micro-SD vierge :
sudo bmaptool copy --bmap rpi3-dev-trixie64_2026-05-16.bmap rpi3-dev-trixie64_2026-05-16.img.xz /dev/mmcblk0
Une fois la copie terminée la micro-SD est immédiatement opérationnelle.
Comments !