PANIC Unable to mount root fs.
Pour améliorer cela il faut faire 3 choses :
1) Dans le répertoire servit par le serveur TFTP (qui est l’équivalent de la partition FAT d’une sd-card) il faut créer le fichier cmdline.txt avec comme contenu cette unique ligne :
root=/dev/nfs nfsroot=192.168.0.100:/var/nfs/rpi-fs rw ip=dhcp rootwait
(Remplacez 192.168.0.100 par l’ip de votre serveur NFSv2)
2) Quand nous avions configuré le serveur NFS nous avions prévu d’exporter le répertoire /var/nfs/rpi-fs Ce qui se traduit dans le fichier /etc/exports par cette ligne :
/var/nfs/rpi-fs 192.168.0.0/24(rw,sync,no_root_squash,no_all_squash,no_subtree_check)
Il faut maintenant remplir ce répertoire avec ce qu’il y a dans la partition ‘/’ d’une sd-card.
Une fois le fichier kernel7.img chargé via TFTP, le noyau prendra le contrôle et chargera le reste en utilisant le serveur NFSv2 désigné sur sa ligne de commande par nfsroot=aa.bb.cc.dd:/path
Attention: c’est bien NFS version 2.
Version très ancienne et désactivée sur certaines distributions linux comme CentOS.
3) Dans les fichiers copiés depuis une sdcard dans le repertoire /var/nfs/rpi-fs il faut au minimum éditer le fichier /var/nfs/rpi-fs/etc/mtab et y mettre en commentaire les mount de /boot, de / et de swap. (/boot est maintenant géré par la partie TFTP, / est deja monte via nfs, et il n'y a pas de swap. Si nécessaire on pourrait créer une partition de swap en deuxième partition sur la sdcard).
Truc: Pour éviter que la phase de login n'efface l’écran et fasse disparaître les log du boot il faut éditer le fichier /var/nfs/rpi-fs/usr/lib/systemd/system/getty@.service et dans la section [service] remplacer TTYVTDisallocate=yes par TTYVTDisallocate=no
Ainsi, quand vous serez au niveau du "login: " vous pourrez remonter dans les logs du boot avec SHIFT+PgUP et SHIFT+PgDown.
Une fois ces 3 opérations effectuées vous pouvez mettre votre Raspberry Pi sous tension et observer la procédure de boot à l’écran. Il y aura des erreurs mais vous devriez arriver jusqu'au un login.
Une analyse du trafic réseau avec tcpdump (ou wireshark) montre que les premières opérations réseaux du noyau sont:
- DHCP pour obtenir (a nouveau) une ip.
- ARP pour trouver l'adresse mac du serveur nfs.
- Portmap pour obtenir le port du service 'mount'.
- MOUNT de /var/nfs/rpi-fs
- Portmap pour obtenir le port du service NFS
- NFS pour charger les fichiers
Les premiers répertoires et fichiers chargés via NFS sont
- dev
- sbin
- usr/bin
- init
- ../lib/systemd/systemd
- ld-linux-armhf.so.3
...
Pour analyser le trafic réseau, le plus efficace, est de capturer dans un fichier avec tcpdump sur la machine qui fait serveur NFS et de visualiser avec Wireshark.