blog-image

Rock64 - Démarrage Bootp

  • dHENRY
  • 13/09/2018
  • (Durée de lecture : 8 mn)

J’utilise des Rock64-4Gb (fabriqués par la société PINE64) qui sont beaucoup plus puissants qu’un Raspberry Pi 3, pas tellement plus chers, et disposent d’une connexion Ethernet Gigabits. Faire démarrer une unité Rock64 à partir du réseau n’a pas été aussi simple qu’avec un Raspberry PI. La documentation, en anglais uniquement, est très éparse sur Internet. Les sources ayant permis la création de ce document sont impossible à citer dans leur totalité, tellement j’ai navigué.
Pour démarrer, une unité a besoin d’un “bootloader” et d’un système Linux (kernel, commandes, etc…). Dans le cadre d’un démarrage au travers d’un réseau, le “bootloader” sera distribué par un serveur TFTP et le système Linux par un serveur NFS.

Séquence de boot - (c)Mytinydc.com

Séquence de boot - (c)Mytinydc.com

La mise en place d’un service de démarrage par le réseau (BOOTP) est le résultat d’un paramétrage spécifique de plusieurs services. Vous devrez disposer de ces prérequis :

  • un serveur TFP fonctionnel (paquet DEBIAN tftp-hpa)
  • un serveur DHCP fonctionnel (paquet DEBIAN isc-dhcp-server)
  • un serveur NFS fonctionnel.
  • une unité Rock64, équipée d’une carte SD sur laquelle est installée la distribution ARMBIAN (voir https://www.armbian.com), et les paquets nfs-common, rsync.

**PS **: Les 3 services pré-cités, peuvent, bien entendu, être hébergés sur un seul et même serveur.

Préparation des serveurs TFTP et NFS

Nous allons créer nos deux systèmes, “bootloader” et Linux, à partir d’une unité déjà démarrée. Ces systèmes ne seront qu’une copie du système installé sur l’unité Rock64. Par conséquent je vous conseille de faire cette opération à partir d’un Rock64 fraîchement installé, sans paquets additionnels.

Serveur TFTP

Sur DEBIAN, le répertoire “/srv/tftp” est créé automatiquement lors de l’installation du paquet “tftp-hpa”. Nous l’utiliserons afin de respecter cette architecture.
La suite de cette procédure implique l’exportation NFS de ce répertoire.
Connecté au serveur TFTP :

vi /etc/exports
#Ajouter la ligne :
/srv/tftp *(rw,sync,no_subtree_check,no_root_squash)

Enregistrez, et exécuter :

exportfs -ra

Cet export NFS est temporaire, je désactiverai cette ressource en fin de procédure.

Serveur NFS

Après avoir obtenu le “bootloader” auprès du service TFTP, l’unité, démarrant par le réseau (l’unité Rock64 sans carte SD) aura aussi besoin d’un système Linux complet (kernel, commandes, shells, etc…). Ces fichiers, selon le protocole « bootp » sont disponibles à partir d’un serveur NFS (Pour plus d’informations au sujet de NFS, voir l’article Wikipédia. Connecté au serveur NFS :

mkdir -p /nfs/boot/rock64
# J'ajoute au fichier « **/etc/exports** » la ligne 
* /nfs/boot/rock64 *(rw,sync,no_subtree_check,no_root_squash)

Enregistez et exportez cette configuration avec la commande :

exportfs -ra

(“r” pour réexporter la config, “a” toute la configuration).

Préparation des systèmes Bootloader - Linux

Les répertoires /srv/tftp du serveur TFTP et /nfs/boot/rock64 du serveur NFS doivent être maintenant accessibles de l’unité Rock64 par une liaison NFS.

Accès NFS nécessaires

Accès NFS nécessaires

Bootloader

Reliez l’unité Rock64 au réseau, démarrer et connectez-vous à sa console (root)

# Créer un point de montage 
mdkir /tftp
# Installer le paquet nécessaires pour l’opération (NFS)
apt-get -y install nfs-common
# Monter maintenant le répertoire distant NFS du serveur TFTP :
mount -t nfs [Adresse ip du serveur TFTP]://srv/tftp /tftp
cp /boot/initrd.img-4.4.152-rockchip64 /tftp
cp /boot/vmlinuz-4.4.152-rockchip64 /tftp
cp -r /boot/dtb /tftp/.
mkdir /tftp/pxelinux.cfg

Créez le fichier /tftp/pxelinux.cfg/default-arm, avec ce contenu :

label Linux-aarch64  
kernel /vmlinuz-4.4.152-rockchip64
initrd /initrd.img-4.4.152-rockchip64  
devicetreedir /dtb  
append earlycon=uart8250,mmio32,0xff130000 printk.devkmsg=on panic=10 coherent_pool=1M ethaddr=${ethaddr} eth1addr=${eth1addr} serial=${serial#} hostname=${board}-${serial#} ip=::::${board}-${serial#}::: root=/dev/nfs rw nfsroot=${serverip}:/nfs/boot/rock64,rsize=32768,wsize=32768 cloud-init=disabled mtdparts=spi32766.0:32k(system),4064k(loader),3840k(reserved),256k(vendor),4M(uboot),4M(atf)

#La ligne "append" tient sur une seule ligne, aucun retour chariot.

Modifiez les permissions du répertoire /tftp

chmod -R 755 /tftp/

Arborescence finale de /tftp

├── dtb
│  ├── *.dtb
└── pxelinux.cfg
│  ├── default-arm
├── vmlinuz-4.4.152-rockchip64
├── initrd.img-4.4.152-rockchip64

Linux

Connectez-vous à la console de l’unité rock64

# Créer un point de montage : 
mdkir /fsnfs
# Installer les paquets nécessaires pour l’opération (NFS rsync) : 
apt-get -y install nfs-common rsync
# Monter le répertoire disant NFS du serveur NFS, sur le point de montage : 
mount -t nfs [Adresse ip du serveur NFS]://nfs/boot/rock64 /fsnfs
# Copiez le système Linux en excluant les répertoires provisionnés au boot d’un serveur et les répertoires personnalisés de l’unité, vers le répertoire NFS (utilisation de la commande « **rsync** ») : 
rsync -rxa --delete --progress --exclude=fsnfs --exclude=var/www/* --exclude=var/log/* --exclude=dev/* --exclude=sys/* --exclude=proc/* --exclude=tmp/* --exclude=root/.ssh/* / /fsnfs/.

chroot dans le nouveau système Linux :

chroot /fsnfs

Vous allez vous retrouver dans un environnement Linux complet et disposé sur le serveur NFS. Toutes les commandes qui suivent, impacteront cet environnement et non l’unité sur laquelle vous êtes actuellement connecté.
Changer le nom hôte du système en modifiant le contenu de “/etc/hostname” (utilisez la commande vi). Ce nom hôte sera identique à toutes les unités qui démarreront par le réseau. Si vous recherchez une solution alternative, reportez-vous à la documentation https://fr.wikipedia.org/wiki/Linux_Terminal_Server_Project

#Changez le mot de passe "root" : 
passwd
# Le mot de passe que vous venez de modifier, sera le mot de passe à utiliser pour se connecter à l'unité par SSH, une fois cette dernière démarrée par le réseau.
# Modifier le fichier /etc/fstab comme suit 
* tmpfs /tmp tmpfs defaults,nosuid 0 0
# Sortir de l'environnement chroot : 
exit

Désactivation de l’export NFS du serveur TFTP

Je n’ai plus besoin de cette ressource, le service TFTP se charge de distribuer les fichiers par son protocole. Connecté au serveur TFTP :

vi /etc/exports
# supprimer la ligne :  /srv/tftp *(rw,sync,no_subtree_check,no_root_squash)

Enregistrer et exécuter la commande :

exportfs -ra

Paramétrage du serveur DHCP

Connecté au serveur DHCP, vous devrez autoriser “Bootp” dans la configuration du service DHCP (isc-dhcp-server). Ajoutez ces lignes dans l’entête du fichier “/etc/dhcp/dhcpd.conf” :

allowbootp;
allow booting;
boot-unknown-clients false;

La dernière ligne indique au service DHCP de n’autoriser le “boot réseau” que pour les hôtes connus, c’est à dire déclarés en tant que “hôte” dans la configuration DHCP.

Redémarrer le service DHCP :

service isc-dhcp-server restart

Préparation du Rock64 au démarrage BOOTP/PXE

Les Rock64, sorties d’usine, ne bénéficient pas du paramétrage pour un démarrage à partir de la carte réseau, comme bon nombre de PC d’ailleurs, vous allez devoir le démarrer une première fois et activer cette fonctionnalité.
Source : https://github.com/ayufan-rock64/linux-build/blob/master/recipes/flash-spi.md

Procédure Flash SPI avec l’image U-boot

  • Récupérer l’image uboot : https://github.com/ayufan-rock64/linux-u-boot/releases/latest, choisir l’image “u-boot-flash-spi-rock64.img.xz”
  • Écrire cette image sur une carte SD. Attention, cette procédure détruira toutes les données disponibles sur la carte SD. Selon votre système :
  • Windows : renommer l’image téléchargée en utilisant l’extension “gz”. Vous pouvez décompresser l’image avec l’outil 7zip. Ouvrez l’outil Win32DiskImager et chargez l’image décompressées. Insérez une carte SD et utilisez le bouton “Write”.
  • Linux : utilisez l’outil xz : xz -k -d -c -v -T 3 [Nom de l’image] | dd of=/dev/[device carte SD] bs=1M
  • Vous n’avez pas besoin d’écran pour effectuer cette opération.

Démarrer le rock64 en ayant inséré la carte SD qui dispose de l’image téléchargée. Après démarrage, votre unité sera “flashée”. Attendre 30 sec environ et vous verrez la led “Power” s’allumer une fois par seconde. Débranchez le Rock64 et retirer la carte SD.

Démarrage du Rock64 par le réseau

  • Connectez le Rock64 au switch réseau
  • Retirez la carte SD
  • Connecté au serveur DHCP, ouvrez une console (root) et exécuter la commande :
tail -f /var/log/syslog
  • A ce stade vous ne connaissez pas l’adresse MAC du Rock64.
  • Allumez l’unité Rock64 et regardez les logs qui apparaissent sur la console du serveur DHCP.
  • Vous obtenez : plusieurs lignes ressemblant à ceci :
Sep 10 15:43:59 raspi1 dhcpd[27651]: DHCPDISCOVER from xx:xx:xx:xx:xx:xx via eth0: unknown client

## Le plus important ici est : **unknown client**. Ceci indique bien que l'unité tente un démarrage par bootp.
  • Pour terminer, ajoutez cette unité à votre configuration DHCP (chapitre suivant)

Ajout d’un hôte au service DHCP

Ajoutez un bloc correspondant au nouvel hôte du réseau. Ceci s’effectue dans le fichier “/etc/dhcp/dhcpd.conf”

Adaptez ce paramétrage à votre configuration réseaux :

host rock64-1{  
hardware ethernet a7:37:ac:bc:16:0a;  
option host-name "rock64-1";  
DDNS-hostname "rock64-1";  
fixed-address 172.28.0.5;   
option tftp-server-name "172.28.0.1";  
next-server 172.28.0.1;  
}

Explications :
Ligne “hardware ethernet” : indiquez l’adresse Mac qui est apparu dans les traces syslog, ci-avant.
Ligne option “tftp-server-name” : Adresse IP du serveur TFTP
Ligne “next-server” : Adresse IP du serveur NFS
Redémarrer le service DHCP :

service isc-dhcp-server restart

Démarrage bootp

Après avoir accompli toutes les étapes de cette procédure, redémarrez le Rock64.

Problèmes rencontrés

Il arrive parfois que le Rock64 ne finalise pas son démarrage, et s’arrête au niveau du chargement du driver “rk3328-rock64.dtb”. Ne sachant pas comment déboguer ce genre de processus, je redémarre l’unité en appuyant sur son bouton “Reset”.

Il se peut aussi que l’unité, n’atteigne même pas le premier niveau, l’étape où elle demande au réseau un démarrage Bootp.
Dans ce cas vous disposez de deux solution :

Conclusion

Votre Rock64 est maintenant démarré sans carte SD. Les Raspberry PI et Rock64 disposent de la fonction “hotplug” pour la carte SD. **Intéressant : cela va bien nous aider pour le prochain billet qui sera intitulé : “Installations automatisées de nouveaux serveurs (provision de serveurs)

Licence de ce document : Creative Commons (CC BY-NC-ND 4.0)

CETTE DOCUMENTATION EST LIVRÉE “EN L’ÉTAT”, SANS GARANTIE D’AUCUNE SORTE ET DISTRIBUÉE DANS UN BUT ÉDUCATIF EXCLUSIVEMENT. L’AUTEUR, CONTRIBUTEURS DE CETTE DOCUMENTATION OU ©MYTINYDC.COM NE SAURAIENT EN AUCUN CAS ÊTRE TENUS RESPONSABLES DES DOMMAGES DIRECTS OU INDIRECTS POUVANT RÉSULTER DE L’APPLICATION DES PROCÉDURES MISES EN ŒUVRE DANS CETTE DOCUMENTATION, OU DE LA MAUVAISE INTERPRÉTATION DE CE DOCUMENT.