Dimanche 25 novembre 2018

Démarrage en réseau de votre Raspberry Pi

Ce tutoriel est écrit pour expliquer comment configurer un serveur DHCP/TFTP simple qui vous permettra de démarrer un Raspberry Pi 3 depuis le réseau. Le tutoriel suppose que vous avez un réseau domestique existant, et que vous voulez utiliser un Raspberry Pi pour le serveur. Vous aurez besoin d’un second Raspberry Pi 3 comme client pour démarrer. Une seule carte SD est nécessaire car le client sera démarré depuis le serveur après la configuration initiale du client.

En raison de l’énorme gamme de périphériques réseau disponibles, nous ne pouvons pas garantir que le démarrage en réseau fonctionnera avec n’importe quel périphérique. Nous avons reçu des rapports indiquant que, si vous ne parvenez pas à faire fonctionner le démarrage du réseau, la désactivation des trames STP sur votre réseau peut vous aider.

Remarque: si vous utilisez un Raspberry Pi 3B+, alors le mode de démarrage USB est défini par défaut, vous pouvez donc ignorer les instructions des sections Configuration client et Program USB boot mode et aller directement à Configuration serveur.

Configuration client

Avant qu’un Raspberry Pi ne démarre en réseau, il doit être démarré à partir d’une carte SD avec une option de configuration pour activer le mode de démarrage USB. Ceci mettra un bit dans la mémoire OTP (One Time Programmable) du Raspberry Pi SoC qui permet de démarrer en réseau. Une fois cela fait, la carte SD n’est plus nécessaire.

Install Raspbian Lite (or Raspbian with Raspberry Pi Desktop) on the SD card in the usual way.

Program USB boot mode

Tout d’abord, préparez le répertoire `/boot’ avec les derniers fichiers de démarrage :

sudo apt-get update && sudo apt-get upgrade

Maintenant, activez le mode de démarrage USB avec la commande suivante :

echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt

Ceci ajoute program_usb_boot_mode=1 à la fin de /boot/config.txt. Redémarrez le Raspberry Pi avec `sudo reboot’. Une fois que le client Raspberry Pi a redémarré, vérifiez que l’OTP a été programmé avec :

vcgencmd otp_dump | grep 17 :
17:3020000a

Vérifiez que la sortie `0x3020000a’ est correcte.

La configuration du client est presque terminée. La dernière chose à faire est de supprimer la ligne program_usb_boot_mode' de config.txt’ (assurez-vous qu’il n’y a pas de ligne blanche à la fin). Vous pouvez le faire avec sudo nano /boot/config.txt', par exemple. Enfin, fermez le client Raspberry Pi avec sudo poweroff’.

Configuration serveur

Branchez la carte SD dans le serveur Raspberry Pi. Démarrez le serveur. Avant toute chose, assurez-vous d’avoir lancé `sudo raspi-config’ et étendu le système de fichiers racine pour prendre en charge la carte SD entière.

Le client Raspberry Pi aura besoin d’un système de fichiers racine pour démarrer, donc avant de faire quoi que ce soit d’autre sur le serveur, nous allons faire une copie complète de son système de fichiers et le mettre dans un répertoire appelé /nfs/client1.

sudo mkdir -p /nfs/client1
sudo apt-get install rsync
sudo rsync -xa --progress --exclude /nfs / /nfs/client1

Régénérer les clés hôte SSH sur le système de fichiers client en y accédant par “chroot” :

cd /nfs/client1
sudo mount --bind /dev dev
sudo mount --bind /sys sys
sudo mount --bind /proc proc
sudo chroot .
rm /etc/ssh/ssh_host_*
dpkg-reconfigure openssh-server
exit
sudo umount dev
sudo umount sys
sudo umount proc

Trouvez les paramètres de votre réseau local. Vous devez trouver l’adresse de votre routeur (ou passerelle), ce qui peut être fait avec :

ip route | grep default | awk '{print $3}'

Puis exécutez:

ip -4 addr show dev eth0 | grep inet

qui doit donner quelque chose comme:

inet 10.42.0.211/24 brd 10.42.0.255 scope global eth0

La première adresse est l’adresse IP de votre serveur Raspberry Pi sur le réseau, et la partie après la barre oblique est la taille du réseau. Il est fort probable que le vôtre sera un “/24”. Notez également l’adresse `brd’ (broadcast) du réseau. Notez la sortie de la commande précédente, qui contiendra l’adresse IP du Raspberry Pi et l’adresse de diffusion du réseau.

Enfin, notez l’adresse de votre serveur DNS, qui est la même adresse que votre passerelle. Vous pouvez trouver ceci avec :

cat /etc/resolv.conf

Configurez une adresse réseau statique sur votre serveur Raspberry Pi en utilisant sudo nano /etc/network/interfaces' (où vous remplacez nano par un éditeur de votre choix). Changez la ligne, iface eth0 inet manual pour que l'adresse soit la première adresse de l'avant-dernière commande, l'adresse du masque réseau comme 255.255.255.255.0’ et l’adresse de la passerelle comme le numéro reçu de la dernière commande.

auto eth0
iface eth0 inet static 
        address 10.42.0.211
        netmask 255.255.255.0
        gateway 10.42.0.1

Désactivez le démon client DHCP et passez au réseau Debian standard :

sudo systemctl disable dhcpcd
sudo systemctl enable networking

Reboot pour la prise en charge:

sudo reboot

A ce stade, vous n’aurez pas de DNS fonctionnel, vous devrez donc ajouter le serveur que vous avez noté précédemment à /etc/resolv.conf. Pour ce faire, utilisez la commande suivante, où l’adresse IP est celle de la passerelle que vous avez trouvée auparavant.

echo "nameserver 10.42.0.1" | sudo tee -a /etc/resolv.conf

Rendre le fichier immuable (sinon dnsmasq interférera) avec la commande suivante :

sudo chattr +i /etc/resolv.conf

Installer les logiciels dont nous avons besoin :

sudo apt-get update
sudo apt-get install dnsmasq tcpdump

Arrêtez la résolution DNS de dnsmasq

sudo rm /etc/resolvconf/update.d/dnsmasq
sudo reboot

Lancez maintenant tcpdump pour pouvoir rechercher les paquets DHCP du client Raspberry Pi :

sudo tcpdump -i eth0 port bootpc

Connectez le client Raspberry Pi à votre réseau et allumez-le. Vérifiez que les LEDs s’allument sur le client après environ 10 secondes, puis vous devriez obtenir un paquet du client “DHCP/BOOTP, Request from ….”.

IP 0.0.0.0.bootpc > 255.255.255.255.bootps: BOOTP/DHCP, Request from b8:27:eb...

Nous devons maintenant modifier la configuration de dnsmasq pour permettre à DHCP de répondre au périphérique. Appuyez sur `CTRL+C’ sur le clavier pour quitter le programme tcpdump, puis tapez ce qui suit :

echo | sudo tee /etc/dnsmasq.conf
sudo nano /etc/dnsmasq.conf

Remplacez ensuite le contenu de dnsmasq.conf par :

port=0
dhcp-range=10.42.0.255,proxy
log-dhcp
enable-tftp
tftp-root=/tftpboot
pxe-service=0,"Raspberry Pi Boot"

Où se trouve la première adresse de la ligne `dhcp-range’, utilisez l’adresse de diffusion que vous avez notée précédemment.

Créez maintenant un répertoire /tftpboot :

sudo mkdir /tftpboot
sudo chmod 777 /tftpboot
sudo systemctl enable dnsmasq.service
sudo systemctl restart dnsmasq.service

Maintenant, surveillez le journal dnsmasq :

tail -F /var/log/daemon.log

Vous devriez voir quelque chose comme ça :

raspberrypi dnsmasq-tftp[1903]: file /tftpboot/bootcode.bin not found

Ensuite, vous devrez copier le contenu du dossier de démarrage dans le répertoire /tftpboot.

Tout d’abord, utilisez `Ctrl + C’ pour quitter l’état de surveillance. Tapez ensuite ce qui suit :

cp -r /boot/* /tftpboot

Redémarrez dnsmasq pour faire bonne mesure :

sudo systemctl restart dnsmasq

Configurer NFS root

Cela devrait maintenant permettre à votre Raspberry Pi de démarrer jusqu’à ce qu’il essaie de charger un système de fichiers racine (qu’il n’a pas). Tout ce que nous avons à faire pour que cela fonctionne est d’exporter le système de fichiers `/nfs/client1’ que nous avons créé précédemment.

sudo apt-get install nfs-kernel-server
echo "/nfs/client1 *(rw,sync,no_subtree_check,no_root_squash)" | sudo tee -a /etc/exports
sudo systemctl enable rpcbind
sudo systemctl restart rpcbind
sudo systemctl enable nfs-kernel-server
sudo systemctl restart nfs-kernel-server

Editez /tftpboot/cmdline.txt et à partir de root= et remplacez-le par :

root=/dev/nfs nfsroot=10.42.0.211:/nfs/client1,vers=3 rw ip=dhcp rootwait elevator=deadline

Vous devez remplacer l’adresse IP ici par l’adresse IP que vous avez notée.

Enfin, éditez /nfs/client1/etc/fstab et supprimez les lignes /dev/mmcblkp1 et p2 (il ne doit rester que proc).

Bonne chance ! S’il ne démarre pas dès la première tentative, continuez d’essayer. Cela peut prendre une minute ou deux pour que le Raspberry Pi démarre, alors soyez patient.