Skip to content

TP4

Durant cette séance vous allez travailler sur un système linux installé dans une machine virtuelle ainsi que sur une carte RPi3. Vous devez rédiger un compte-rendu à l’issue de cette séance, que vous devrez déposer sur Blackboard.

Préambule

Comme nous avons besoin pour ce TP d'avoir des privilèges administrateur sur la machine linux, nous allons utiliser une machine virtuelle pour faire tourner une version minimale de l'OS Debian 64bits.

Il existe plusieurs logiciels pour créer et lire des machines virtuelles :

  • VirtualBox
  • VMware

Les deux logiciels existent aussi bien sous linux et sous windows. Virtualbox a l'avantage d'être un logiciel libre. Toutefois si vous utilisez une machine de l'école sous windows, il vous faudra peut etre utiliser vmware (les installations de virtualbox ne sont pas à jour).

Nous vous recommandons donc, sauf problème particulier, d'utiliser les machines de l'école sous debian et le logiciel VirtualBox.

Vous pouvez également utiliser une machine personnelle, soit directement sous linux si vous êtes administrateur, soit en y installant VirtualBox (ou si vous préférez vmware).

Danger

Sur les machines de l'école, que ca soit sous windows ou linux, pour éviter les soucis de performance, il faudra installer vos VM sur le disque local :

  • Sous linux : les fichiers de votre répertoire personnel (~/...) sont des fichiers distants, à l’exception du répertoire ~/local dir qui contient des fichiers locaux conservés pendant une période de quelques semaines,
  • Sous windows : idem, à l'ouverture de votre session, un répertoire local temporaire est créé, c'est là qu'il faut mettre votre VM (config par défaut).

Pensez bien à sauvegarder sur clé USB ou dans votre compte esiee les screenshots et fichiers etc dont vous auriez besoin pour rédiger votre compte rendu et réviser l'examen.

1 - Creation du disque système (carte SD) de la raspberry pi

Dans la suite, nous supposons que vous êtes logé sous linux sur les machines de l'école. Dans un terminal vérifiez que vous appartenez au groupe "vboxusers" en tapant la commande

$>groups
Si le groupe vboxusers n’apparaît pas, tapez la commande :
ssh -X $USER@localhost

puis revérifiez avec la comande groups. Vous devrez lancez virtualbox à partir de ce terminal.

1.1 Création de la VM

Récupérez le fichier image de la machine invitée sur google drive.

Lancez virtualbox. Choisissez dans le menu importer une machine et sélectionnez le fichier .ova précédemment récupéré. Virtualbox vous demande où créer la machine virtuelle, choisissez un emplacement local (pour les performances). À la fin de l'importation, vérifier et si besoin ajustez les paramètres de la VM (quantité de mémoire, nombre de processeurs). Positionnez bien la version de USB à usb 3. Vous pouvez démarrer la VM. À l'invite de connexion, connectez vous avec le login user, mot de passe user.

1.2 Préparation de la sdcard pour le système rasbian

Vous devriez trouver un répertoire tp4 contenant le fichier raspian-buster-lite.zip. En cas de soucis vous pouvez aussi le retélécharger avec la commande :

wget debian.rutgers.edu/raspbian_images/raspberrypi/images/raspbian/2019-09-26-raspbian-buster/2019-09-26-raspbian-buster-lite.zip

Pour vérifier que le réseau fonctionne, essayez la commande :

ping www.google.fr
En cas de soucis essayez de reconfigurer l'interface réseau avec la commande :
sudo dhclient

Nous allons maintenant préparer la sdcard :

  • on commance par décompresser l'image disque (environ 1min):
    unzip 2019-09-26-raspbian-buster-lite.zip
    
  • si vous n'avez pas la commande unzip :

    sudo apt-get update
    sudo apt-get install unzip
    

  • insérez la carte SD dans le lecteur natif de la machine si il y en a un, ou le lecteur de carte microSD USB présent dans les boittes.

  • pour qu'il soit géré par la VM et non par la machine hôte, commencez par démonter les partitions éventuellement montées automatiquement (via l'outils graphique "fichiers" pour gagner du temps) puis dans la fenêtre virtualbox allez dans le menu Périphériques>USB et cochez la case correspondante a l'adaptateur USB/MicroUSB

  • dans la VM la commande

    sudo dmesg 
    
    permet de connaitre le nom de device correspondant à la carte SD (sdb ou sdc par exemple... dépend de pleins de paramètres). Vérifier qu'aucune partition présente sur la carte n'a été automatiquement montée en tapant la commande (ca ne devrait pas être le cas si vous utilisez l'image fournie)
    mount | grep sdb #(ou sdc, ou ...)
    
    ou
    df -h
    
    indiquez dans votre rapport ce que font ces commandes (et toutes les commandes que vous utilisez dans le TP)

  • si des partitions ont été montées, démontez les avec la commande umount

  • nous sommes prets pour "dumper" l'image téléchargée sur la carte SD :
    dd bs=4M if=2019-09-26-raspbian-buster-lite.img of=/dev/sdb
    
    (remplacez /dev/sdb par le bon périphérique si besoin).

Tip

Sourcer le fichier /etc/bash_completion rend plus intelligent le comportement de la touche tab. Cela devrait vous permettre de taper les commandes longues plus simplement.

  • lorsque c'est terminé, créez deux répertoires part1 et part2 (avec mkdir) et montez les deux partitions créées sur la carte dans ces deux répertoires (commande sudo mount)

  • l'un des répertoires doit contenir un système de fichier, c'est la partition rootfs vue en cours, l'autre des fichiers et des scripts de lancement, c'est la partition boot vue en cours.

  • avec la commande touch, ajoutez un fichier (vide) nommé ssh dans la partition boot (pas dans le répertoire /boot de la partition rootfs !!), puis démontez les deux partitions avec umount. Vous pouvez maintenant débrancher le lecteur de carte sd et insérer la carte dans la raspberry.

2 - Configuration des connexions réseau

L’objectif est de pouvoir installer des logiciels sur la RPi à l’aide d’outils tels que apt ou git. La Configuration réseau à réaliser doit donc permettre d’établir le schéma de connexion ci-dessous : Internet ↔ RPi ↔ [VM ↔ Host] ↔ Internet

La connexion ethernet entre la carte RPi et VM sera réalisée à l’aide d’un adaptateur USB-Ethernet. Branchez l’adaptateur USB-Ethernet sur la machine hôte. Pour que cette nouvelle connexion USB soit gérée par la VM, allez dans le menu Périphériques>USB et sélectionnez realtek ou Asix suivant le type de d’adaptateur. Branchez le câble ethernet entre la VM et la carte RPi.

Cette connexion devra correspondre au réseau 192.168.1.0 et les adresses IP de la VM et de la carte RPi seront, après configuration, respectivement :

  • VM : 192.168.1.100
  • RPi : 192.168.1.101 (par exemple)

2.1 - Identification de l’interface réseau

La commande ip addr permet de lister les interfaces actives. Notez le nom de l’interface sur la VM correspondant à cette connexion. Vous pouvez également obtenir cette information avec la commande dmesg|tail ou ifconfig ...

2.2 - Configuration interface VM

Commencez par vérifier que c'est bien le service networking qui gère la configuration des cartes réseaux : systemctl status networking Si ce n'est pas le cas, installez le paquet ifupdown

Configurez l’interface réseau de la VM en éditant le fichier /etc/network/interfaces et en rajoutant les lignes suivantes (si eth1 est le nom de l’interface) :

auto eth1
iface eth1 inet static
address 192.168.1.100
netmask 255.255.255.0

Vous devez ensuite forcer le rechargement de ce fichier et la réinitialisation du service réseau (par exemple) par les commandes :

systemctl force-reload networking
ou
service networking restart
ou
ifdown eth1
ifup eth1

La commande ip addr doit maintenant faire apparaître l’interface associée avec l’adresse IPv4 : 192.168.1.100

2.3 - Configuration du serveur DHCP sur la VM

La configuration de la connexion réseau côté RPi se fait automatiquement via un service client DHCP (dhcpcd pour DHCP Client Daemon) lancé au démarrage. Ce service envoie une requête DHCP sur le réseau connecté à l'interface eth0. Il reste donc à installer et à configurer un serveur capable de répondre à cette requête dans la VM.

La première étape consiste à installer le paquet correspondant au serveur DHCP :

apt install isc-dhcp-server

Il est possible que l'installation échoue car la connexion internet via l'interface réseau partagé par la vm n'est plus possible. Vérifiez avec ping sur google par exemple. Dans ce cas, il faut la reconfigurer grace à la commande :

dhclient nom_de_l_interface

Retestez alors un ping vers google, si c'est OK reessayez l'installation de isc-dhcp-server.

Vous devez ensuite vérifier dans le fichier de configuration /etc/dhcp/dhcpd.conf l’existence des lignes suivantes qui définissent la plage d’adresse qui pourra être allouée par le serveur DHCP, sinon ajoutez les :

subnet 192.168.1.0 netmask 255.255.255.0 {
range 192.168.1.101 192.168.1.254 ;
option subnet-mask 255.255.255.0 ;
}

Rajouter également la ligne INTERFACES="ethx" dans le fichier /etc/default/isc-dhcp-server où ethx correspond au nom de l’interface de la VM connecté à la RPi.

Le but est que le serveur DHCP n’écoute les requêtes que sur cette interface. Ensuite, redémarrez le serveur DHCP (remplacer ethx par le bon nom) :

ifdown ethx
ifup ethx
systemctl restart isc-dhcp-server

Vérifier si une adresse a été délivrée par la commande :

systemctl status -l isc-dhcp-server

Il est surement nécessaire de redémarrer la raspberry a ce stade.

La liste des baux se trouve également dans le fichier /var/lib/dhcp/dhcpd.leases. Vous pouvez maintenant tester la connectivité vers la RPi à l’aide de commandes ping à partir de la VM :

ping 192.168.1.xxx
(remplacez xxx par la valeur attribuée à la rspi par le serveur dhcp).

2.4 - Connection SSH

Maintenant qu’il existe une connexion réseau, vous pouvez ouvrir une fenêtre de commande vers la RPi dans votre VM en utilisant le protocole SSH (Secured SHell). Pour cela, exécuter la commande

ssh pi@192.168.1.xxx

Les identifiants de connexion sur la RPi sont pi / raspberry. Le compte root n’est pas validé. L’utilisateur pi peut utiliser les commandes réservées à l’administrateur grace à sudo.

2.5 - Configuration réseau de la RPi

2.5.1 - SCP

Dans cette partie vous aurez besoin de transférer des fichiers de la VM vers la RPi, pour cela vous utilisez la commande scp :

scp file pi@192.168.1.xxx :./rep/
copie le fichier file dans le répertoire rep du compte utilisateur pi.

2.5.2 - Configuration de la connexion ethernet

Vous devez modifier le fichier /etc/network/interfaces de la RPi et rajouter les lignes de configuration suivantes afin de rendre la configuration de eth0 permanente :

auto eth0
iface eth0 inet dhcp

2.5.3 - Configuration WiFi

Méthode 1 : En partageant la connection data de votre smartphone

Vous pouvez utilisez votre portable pour créer un point d’accès WiFi utilisant le protocole WPA2-PSK pour finaliser la configuration réseau de votre environnement de développement en configurant une connexion WiFi entre la RPi et votre point d’accès. La connexion WiFi sera gérée sur la carte RPi par le service wpa_supplicant qui est configuré par le fichier /etc/wpa_supplicant/wpa_supplicant.conf. Un fichier déjà préparé est disponible dans l'archive fournie dans le répertoire tp4 du compte user sur le système invité. Le fichier s'appelle wpa_supplicant.conf.wpapsk Copiez le via scp sur la raspberry dans /etc/wpa_supplicant/. Vous devrez modifier les champs :

ssid="AP_NAME"
psk="passphrase"
AP_NAME sera le nom sous lequel votre téléphone est visible. passphrase le code que vous avez donné.

Vous devez également modifier le fichier /etc/network/interfaces de la RPi et rajouter les lignes de configuration suivantes :

auto wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf.wpapsk

Une fois les fichiers de configuration mis à jour, Rafraichissez la connexion WiFi avec la commande sudo ifup wlan0, éventuellement précédée d’un sudo ifdown wlan0. wlan0 correspond au nom de l’interface WiFi de la RPi.

Si la connexion réussit, une adresse IP sera associée à l’interface wlan0, ce que vous pourrez vérifier avec la commande ip addr.

Vous pouvez également vérifier les messages issus du processus de connexion avec la commande journalctl |grep wpa_supplicant.

Pour tester la connexion à internet de votre RPi, lancer la commande wget www.perdu.com.

Méthode 2 : EDUROAM

Alternativement, vous pouvez essayer de configurer le réseau eduroam. Pour ce faire, télécharger le script python de configuration en ligne :

wget http://igm.univ-mlv.fr/~masson/v2/Teachings/%203E-LE3/eduroam-linux-ESIEE_PARIS.py

Créez un repertoire .config à la racine du compte pi :

cd
mkdir .config

Executez sur la raspi en tant que pi (pas root) le script avec python3 :

python3 eduroam-linux-ESIEE_PARIS.py

Le login a saisir est votre adresse mail esiee.

Si tout fonctionne, il devrait générer un répertoire /home/pi/.config/cat_installer contenant un fichier .conf

Suivre les consignes pour l'utilisation d'un partage de connexion via smartphone en remplaçant dans /etc/network/interfaces la référence au fichier wpa_supplicatn.conf/wpapsk par une référence à ce fichier .conf ainsi créé.

Croisez les doigts.

Danger

Vous avez enregistré en clair votre mot de passe ESIEE sur la carte sd. Pensez à effacer le repertoire /home/pi/.config à la fin du TP avant de rendre le matériel

3 - Développement d’une application

Vous allez maintenant réaliser une application (rudimentaire) de surveillance de mouvement en connectant un capteur de mouvement PIR à la RPi. Vous allez réaliser une application qui lira la sortie de ce capteur et qui l’affichera à l’écran.

Vous allez avoir besoin d’une librairie permettant d’accéder au connecteur GPIO (http://wiringpi.com).

3.1 - Installation de la librairie wiringPi

Commencez par intaller la librairie wiringPi

  • Si la configuration Wifi s’est bien passée apt-get install wiringpi
  • Sinon, récupérer le fichier wiringpi_2.50_armhf.deb dans les fichiers de l'archive a votre disposition dans le repertoire tp4 et transférez le sur la raspberry (scp) puis installez le avec
    sudo dpkg -i wiringpi_2.50_armhf.deb
    
    Vous pouvez tester l’installation en tapant la commande gpio -v

3.2 - Application

L’application est un petit programme en C, tp4.c (a récupérer dans l'archive du répertoire tp4). Créez l'éxécutable sur la raspberry avec les commandes :

gcc -g -c tp4.c
gcc -g -L /usr/local/lib -l wiringPi -o tp4Test tp4.o
Vous devriez obtenir l'exécutable tp4Test.

  • Décrivez les traitements réalisés par le code tp4.c

3.3 - Connexion du capteur PIR

raspigpio.png

Vous trouverez la documentation du capteur dans l'archive du répertoire tp4. Il doit être alimenté en 3.3v et a une sortie. Le programme tp4.c lit le signal provenant du capteur sur la patte GPIO27, patte 13 du connecteur, voir http://wiringpi.com/pins/.

Pour connecter le capteur PIRà la RPi :

  • Connectez un fil entre la patte gnd du capteur et la patte 9 de la Rpi.
  • Connectez un fil entre la patte vcc du capteur et la patte 1 de la Rpi.
  • Connectez un fil entre la patte out du capteur et la patte 13 de la Rpi.

Une fois la connexion réalisée, lancez le programme. Il doit afficher 1 quand le capteur est allumé (détection de mouvement) et 0 sinon.

3.4 - Makefile

Récuprez maintenant le fichier Makefile de l'archive permettant de gérer la compilation de l’application tp4Test, son installation et le nettoyage du répertoire de travail.

Essayez de comprendre ce fichier.

  • Exécutez la commande make clean Que fait elle ?
  • Lancer la commande make Quelles actions sont réalisées ?
  • Excutez la commande touch tp4.o, puis de nouveau la commande make. Quelle différence avec la première commande make ? pourquoi ?

4 - Attendus

Vous posterez sur blackboard un fichier (tgz) contenant votre rapport ainsi que les fichiers de configuration que vous aurez modifiés. Création du fichier tgz sur la RPi à la racine du compte /home/pi si vos fichiers se trouvent dans le répertoire /home/pi/TP4 :

tar czvf tarfile.tgz TP4

Copie du fichier tgz sur la VM :

scp pi@192.168.1.101:tarfile.tgz ./

5 - Bonus

Un petit moment de détente...

Récupérez le fichier pacman-1.3.tar.gz et transférez le sur la RPi. Il contient le code source d’un jeu vidéo utilisant la librairie ncurses qui permet d’implémenter des interfaces graphiques minimales sur des terminaux non graphiques.

Pour décompresser le fichier, utiliser la commande

tar -xzvf pacman-1.3.tar.gz

Le projet nécessite la librairie ncurses que vous devez installer :

apt install libncurses5-dev

Pour compiler le programme, commande make dans le répertoire pacman-1.3. Une fois le programme compilé make install pour l’installer. Pour lancer le jeu (vous devez avoir la console en plein écran) : ./pacman Dans cet univers vous êtes le symbole ’C’, plus d’information dans le fichier README.

Annexes

A - Configuration du client dhcp de la RPi

Connectez la carte SD de la RPi à la VM. Une fois celle-ci montée, le système de fichier de la Raspbian doit être visible dans le répertoire de votre choix. Éditez le fichier /media/user/rootfs/etc/dhcpcd.conf et décommentez certaines lignes vers la fin du fichier afin d’obtenir la configuration de repli suivante pour l’interface eth0 en cas d’échec de la transaction DHCP :

#It is possible to fallback to astatic IP if DHCP fails:
#define staticprofile
profile static_eth0
staticip_address=192.168.1.101/24
staticrouters=192.168.1.100
#fallback to static profile on eth0
interface eth0
fallback static_eth0

B - Récupération de la voie série

Cela se fait en utilisant un adpatateur TTL-232R-RPi. Vous devez modifier le fichier config.txt de la partition boot de la carte SD en rajoutant cette ligne :

dtoverlay=pi3−disable−bt
Cela a pour effet de déconnecter l’interface bluetooth de la RPi et de libérer l’interface série qui devient disponible. Le cablage de l’adaptateur TTL-232R-RPi au port d’extension de la RPi : cablage PIR.png