mercredi 1 février 2017

Network Boot Raspberry Pi2

Voici un très court résumé de ce que nous allons devoir faire pour faire booter un Raspberry Pi 2 (RPi2) via le réseaux.

  1. sdcard + bootcode.ini
  2. DHCP/BOOTP
  3. TFTP
  4. NFSv2 (voir ce post)
  5. Brancher

Prérequis : Vous devez avoir un serveur DHCP configurable sur votre réseau.
Attention : Le serveur DHCP intégré dans les box des opérateurs internet n’est en général pas suffisamment configurable. 


1) Télécharger bootbin.bin  ici : https://github.com/raspberrypi/firmware/tree/master/boot
Mettre ce fichier sur une  carte micro SD vierge formatée en FAT32.
Mettre cette carte dans le RPi 2. (ne pas mettre en marche)


2) Configurer le serveur DHCP. Ici je donne la configuration du DHCP sur un switch Cisco.
A vous d'adapter à vos adresses ip.

ip dhcp excluded-address 192.168.0.1 192.168.0.100

ip dhcp pool CLUSTER
   network 192.168.0.64 255.255.255.192
   dns-server 8.8.8.8 
   option 43 ascii "Raspberry Pi Boot   "
   default-router 192.168.0.100 
   option 66 ascii 192.168.0.70

IMPORTANT : Il y a 3 espaces après Boot à la fin de "Raspberry Pi Boot   "

- network définit le (sous)réseaux dans lequel  les adresse ip sont allouées par le serveur dhcp.
Le « ip dhcp excluded-address exclue les ip  de 1 à 100. L’allocation aura donc lieu dans l’intervalle 101..126
- dns-server définit l’ip du résolveur dns. Ici celui de Google.
- default-router définit l'ip de la gateway (routeur)
- option 66 définit le nom du serveur TFTP, donné sous forme d’adresse IP.


3) Configuration du serveur TFTP  (ici configuration avec Centos 7)

yum install tftp-server tftp
systemctl start tftp 
systemctl enable tftp

Mettre tous les fichiers nécessaires au boot d’un RPi2 (ou d’un RPi3) dans la racine du serveur TFTP.
Par défaut le serveur TFTP sert  les fichiers qui sont dans /var/lib/tftpboot

Télécharger les dernière versions depuis  https://github.com/raspberrypi/firmware/tree/master/boot
ou prendre des version plus 'mature' sur la partition FAST d'une sdcarte carte. Cette partition est ensuite montée sous le nom de /boot.


bootcode.bin
On l’a déjà mis sur la carte de notre Rpi2, mais un Rpi3 sans sdcard peut le prendre directement sur le serveur TFTP.

Les 4 fichiers start*.elf
Celui utilisé dépendra de la répartition mémoire entre GPU et CPU
(Voir paramètre gpu_mem=... dans config.txt)
    start.elf
    start_cd.elf
    start_x.elf
    start_db.elf 

A chaque fichiers start*.elf correspond un fichier fixup*.dat
    fixup.dat  
    fixup_cd.dat 
    fixup_x.dat
    fixup_db.dat  

Le kernel ARM7 32 bits multi cores commun à RPi2 et RPi3
    kernel7.img

Les Device Tree
    bcm2709-rpi-2-b.dtb
    bcm2710-rpi-3-b.dtb

Créer les deux fichiers de configuration vide (on les remplira plus tard)
    config.txt
    cmdline.txt


4) Enfin, mettre le RPi sous tension.
Dans /var/log/message on doit trouver l’activité du serveur TFTP
   tftpd: Client 192.168.0.126 finished config.txt
   tftpd: Client 192.168.0.126 finished start.elf
   tftpd: Client 192.168.0.126 finished fixup.dat
   tftpd: Client 192.168.0.126 finished config.txt
   tftpd: Client 192.168.0.126 finished config.txt
   tftpd: Client 192.168.0.126 finished cmdline.txt
   tftpd: Client 192.168.0.126 finished kernel7.img
   tftpd: Client 192.168.0.126 finished bcm2709-rpi-2-b.dtb
   tftpd: Client 192.168.0.126 finished config.txt

Note: Le serveur TFTP ne montre que les transferts effectifs. Si on regarde avec tcpdump le trafic réseaux on découvre que le processus de boot teste l’existence de bien d'autres fichiers:

tcpdump -l -n -v -ttttt -i eth0 -s 1500 udp  | grep –line-buffered RRQ | awk ‘{print $6}’


   358bec05/start.elf 
   autoboot.txt 
   config.txt 
   recovery.elf 
   start.elf 
   fixup.dat 
   recovery.elf 
   config.txt 
   dt-blob.bin 
   recovery.elf 
   config.txt 
   bootcfg.txt 
   cmdline.txt 
   recovery7.img 
   recovery.img 
   kernel7.img 
   armstub7.bin 
   armstub.bin 
   kernel7.img 
   bcm2709-rpi-2-b.dtb 
   config.txt

Cette séquence varie en fonction des fichiers effectivement trouvés sur le serveur TFTP et en fonction du contenu de config.txt

Si tout se passe bien vous aurez au bout d'environ 5 ou 6 secondes la mire colorée, puis les info du chargement du kernel qui se terminera pas un message du type:

PANIC Unable to mount root fs. 

C'est normal ! L’étape suivante est de justement fournir ce root file system via NFSv2.

Si rien ne ce passe il faudra debugger le DHCP puis le TFTP avec tcpdump ou wireshark.
Pour voir tout le trafic il faudra utiliser un hub, pas un switch.
Quand le processus de boot échoue le led d’activité clignote 4 fois (parfois 7).
Si le RPi2 émet plusieurs requêtes DHCP alors que le serveur DHCP lui répond c'est que la réponse ne lui convient pas.


Aucun commentaire:

Enregistrer un commentaire