Bootnfs

Pour diminuer au maximum les sources de bruit de Mimosa, je n'utilise plus de disque dur, ni clés USB, ni flash. Il boote sur le réseau en PXE en récupérant une image d'une Debian customisée pour démarrer directement l'interface de Mythtv directement.

Le processus de démarrage d'un ordinateur sur le réseau est le suivant :

  1. au cours du boot du bios, celui ci envoie une requête DHCP;
  2. le serveur DHCP lui fourni une adresse IP, masque + passerelle ainsi que les options BOOTP contenant le nom du fichier d'amorce ainsi que l'adresse d'un serveur sur lequel le récupérer;
  3. le bios le télécharge alors via le protocole TFTP (Trivial FTP) puis exécute ce programme d'amorçage qui lit un fichier de description de menu pour choisir l'image Linux à démarrer;
  4. Finalement, le noyau linux choisi est démarré avec des options permettant de monter un dossier spécifique partagé par le serveur NFS en tant que /.

La mise en oeuvre n'est pas simple et requiert beaucoup de configuration/modifications que je vais tenter de détailler :

  • Configuration du serveur DHCP + TFTP
  • Paramétrage du serveur NFS
  • Installation d'une Debian capable de démarrer sur du NFS

Dnsmasq est un serveur DHCP que j'utilise depuis longtemps et qui est capable de répondre aux requêtes PXE et intègre un serveur TFTP.

Dans mon installation, le dossier contenant tout l'arborescence nécessaire au TFTP + NFS se trouve dans /mnt/nfsroot.

Pour activer les options BOOTP dans les réponses DHCP et activer le serveur TFTP intégré à Dnsmasq, ajouter les lignes suivantes :

/etc/dnsmasq.conf
enable-tftp
dhcp-boot=pxelinux.0
tftp-root=/mnt/nfsroot/tftp
  • enable-tftp : active le serveur TFTP intégré
  • dhcp-boot : nom du fichier que le client doit demander pour démarrer en PXE
  • tftp-root : dossier dans le lequel se trouve les fichiers à servir

Le dossier exposé via TFTP doit contenir au minimum des fichiers pxelinux.0 et pxelinux.cfg/default, le contenu est le suivant :

├── initrd.img
├── ldlinux.c32 -> /usr/lib/syslinux/modules/bios/ldlinux.c32
├── pxelinux.0 -> /usr/lib/PXELINUX/pxelinux.0
├── pxelinux.cfg
│   └── default
└── vmlinuz

Description des fichiers :

  • pxelinux.0 + pxelinux.cfg/default : programme d'amorçage + fichier de listing des images disponibles que le bios va lancer, équivalent à /boot/grub/grub.cfg;
  • ldlinux.c32 : loader de noyau linux, équivalent à lilo ou grub mais dédié au boot réseau;
  • vmlinuz + initrd.img : image du noyau linux accompagné de son “archive” pour avoir le minimum vitale pour démarrer : module noyau, quelques commandes… voir ci dessous pour le contenu

Pour récupérer les fichiers d'amorçage, il faut installer les paquets pxelinux et syslinux-common puis copier les fichiers dans l'arborescence cible :

sudo apt-get install -y pxelinux syslinux-common
cd /mnt/nfsroot/tftp/
sudo ln -s /usr/lib/PXELINUX/pxelinux.0
sudo ln -s /usr/lib/syslinux/modules/bios/ldlinux.c32
Les distributions récentes netboot de Debian intègre déjà ces fichiers, cette opération n'est plus nécessaire.

Le programme pxelinux est en mesure d'afficher un menu permettant de choisir l'image à démarrer ainsi que les options à passer au noyau. Voici mon fichier de menu pxelinux.cfg/default :

pxelinux.cfg/default
# image par défaut
DEFAULT mythtv
 
# déclaration d'une image
LABEL mythtv
# noyau à utiliser
KERNEL vmlinuz
# options du noyau
APPEND initrd=initrd nfsroot=/mnt/nfsroot/mythtv.0.26,v3 root=/dev/nfs panic=10 ro quiet ipv6.disable=1
 
# pas d'attente
PROMPT 0
TIMEOUT 60

Les options importantes transmises au noyau sont :

  • nfsroot : précise où se trouve la racine de l'image à démarrer. Comme il n'est pas précisé de serveur NFS particulier, le noyau le cherchera sur la même IP que celui qui a servit les fichiers PXE. Ce dossier sera monté en que / sur la machine cliente.
  • root : nom du block device référençant le périphérique contenant /

La configuration du serveur NFS est traditionnelle. La ligne suivante précise l'arborescence à exporter, l'option no_root_squash est importante pour conserver l'appartenance de l'utilisateur root aux fichiers :

/etc/exports
/mnt/nfsroot/mythtv.0.26  *(rw,no_subtree_check,no_root_squash,fsid=8)

La doc officielle décrit précisément comment initialiser une arborescence à partir d'un distribution netboot de Debian.

Il faut juste noter que lorsque le noyau de la machine cliente démarre, le dossier /mnt/nfsroot/mythtv.0.26 partagé par le serveur NFS doit être monté en tant que /. Pour se faire, comme indiqué plus haut, il faut ajouter l'option nfsroot au noyau et également modifier le fichier /etc/fstab pour qu'il référence alors un device spécifique /dev/nfs :

/etc/fstab
# <file system> <mount point>    <type>  <options>                       <d><p>
/dev/nfs        /                nfs     ro,hard                          1  1

Le lecteur attentif aura noté que / est monté en *lecture seule* (option ro) : mon objectif est de pouvoir démarrer 2 machines clientes sur la même arborescence de fichier coté serveur.

De plus, je veux pouvoir démarrer 2 machines (Mimosa + Wimpy) sur ce boot PXE en même temps et être en mesure de partager l'arborescence de base tout en évitant les effets de bord sans avoir à dupliquer l'arborescence de fichier coté serveur mais tout en pouvant spécialiser à l'exécution le paramétrage.

sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)
udev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=193215,mode=755)
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)

tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=155340k,mode=755)

10.0.0.1:/mnt/nfsroot/mythtv.0.26 on / type nfs (ro,relatime,vers=3,rsize=131072,wsize=131072,namlen=255,hard,nolock,proto=tcp,port=2049,timeo=7,retrans=3,sec=sys,local_lock=all,addr=10.0.0.1)

tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)

tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=310660k)

ramfsrwtmp on /tmp type tmpfs (rw,nosuid,nodev,noexec,noatime,size=20480k)

var_aufs on /var type aufs (rw,relatime,si=2a44a219)
etc_aufs on /etc type aufs (rw,relatime,si=2a65b219)

10.0.0.1:/mnt/nfsroot/home on /home type nfs4 (rw,noatime,vers=4.0,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.0.0.60,local_lock=none,addr=10.0.0.1)

home_aufs on /home/mythtv type aufs (rw,relatime,si=2a627219)

10.0.0.1:/mnt/media on /mnt/media type nfs4 (rw,noatime,vers=4.0,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=10.0.0.60,local_lock=none,addr=10.0.0.1)

Bootnfs file