Installer Linux Mint en LAN/PXE

Chez moi nous utilisons toujours un vieux PC, un vieux papy de 14/15 ans. Avec une installation très propre de Windows XP, cela fonctionnait bien. Surtout avec le boost de RAM, 2 Go. Sauf que de nos jours c’est bien loin du minimum pour avoir un PC fluide. En plus, une barette de RAM a cramer. Il lui reste donc plus qu’1,5 Go de RAM.

J’ai donc voulus migrer ce petit PC sous Linux Mint. Le problème semble simple, graver une clée USB et hop on la met dans le PC et c’est fini.

Oui, mais non. Les PC récents permettent de faire ça simplement, les anciens c’est toujours plus complexe. Ils n’acceptent pas les même méthodes de boot.

J’ai commencé par graver un DVD, changer le boot order de la machine et… Rien
Je me suis rendus compte que ce BIOS acceptait l’USB-CDROM et USB-FDD. J’ai donc tenté l’USB. J’ai formaté ma clée USB via la CMD et j’ai utilisé Rufus, en utilisant les deux modes de copie du logiciel… Rien sur tout les ports USB de la machine.
Je me suis donc dis, pourquoi pas le faire en Boot PXE. Bon déjà petit tricks, il faut penser a activer l’alimentation de la carte Ethernet avant la séquence de boot. Sinon bah… ça fait rien.

Préambule

Je vais donc vous présenter ici comment installer un serveur PXE sur votre machine afin de permettre l’installation de Linux Mint sur une autre machine.
Les procédures décrites ici partent du principe que c’est une installation temporaire faite depuis un Live CD Linux Mint et que le réseau qui relis le serveur au client et vide de tout serveurs (DHCP entre autre, donc pas de Box). Typiquement un câble reliant le serveur au client.
Si cela corresponds pas à votre configuration il suffira de changer certains chemins, et/ou modifier votre serveur DHCP pour qu’il donne les informations vers votre serveur TFTP.

Présentation du boot PXE

Utilisation

Cette technologie permet de démarrer (booter) une machine sur des ressources distantes qui vont êtres rapatriées à l’aide tu protocole TFTP. Cela est couramment utilisé par les admin sys car cela permet, couplé avec Wake On Lan de réinstaller des machines à intervalles réguliers. A chaque démarrage la machine va télécharger un fichier en TFTP pour savoir si il doit réinstaller son système ou non. Si c’est le cas, via TFTP un second script va été télécharger pour lancer la procédure d’installation. Sinon le script PXE va s’arrêter et le boot normal va alors se faire.

Fonctionnement

Cette technologie se repose sur DHCP/BOOTP. Au démarrage, client va demander une adresse IP au serveur DHCP de son LAN. Ce dernier va lui proposer une adresse IP et fournir les informations de connexion au serveur TFTP.
Le client va utiliser les informations de connexion (IP/port/fichier à télécharger) pour communiquer avec le serveur TFTP. (certains téléphones IP ont le nom du fichier à récupérer codé en dur).
Une fois le fichier principal récupéré (un script, pxelinux.0 en général pour du linux). Il va l’exécuter, et généralement télécharger de nombreuses dépendances pour installer un système pour démarrer un système.
Comme TFTP est un protocole simple(iste), il n’est pas performant. On couple donc souvent TFTP avec un protocole transfert de fichier. Dans le monde linux on utilise souvent NFS mais il est tout à fait possible d’utiliser HTTP ou bien SMB .

Sur un ordinateur disposant de Windows vous pouvez très bien booter sur un système linux (pxelinux.0).

Liste des serveurs à installer

On va installer :

  • Serveur DHCP pour fournir les informations du serveur TFTP (fichiers à télécharger et IP du serveur)
  • Serveur TFTP pour fournir les fichiers lors du boot PXE
  • Serveur NFS pour accélérer les transferts de fichiers une fois le premier script téléchargé

Configuration réseau

J’ai branché la clée USB de Linux Mint dans le pc qui servira de serveur TFTP. J’ai ensuite lancé le live CD de Mint. Le serveur disposera donc en directe de tout les fichiers requis pour le boot PXE.
J’ai branché directement en ethernet le serveur et le client (la veille machine).

Ce nouveau réseau va être configuré pour être 192.168.30.0/24
Le serveur sera en 192.168.30.254. (Cliquez ici si vous ne savez pas le faire).
Et le client va récupérer une adresse IP depuis le serveur DHCP du serveur.

Installation du DHCP

apt-get install isc-dhcp-server

Mainteant il faut configurer le serveur DHCP pour qu’il serve le réseau 192.168.30.0/24. Automatiquement il saura quelle interface écouter. Pour cela il va regarder quelle interface à un adresse IP dans les réseaux qu’il doit servir.

Fichier /etc/dhcp/dhcpd.conf

subnet 192.168.30.0 netmask 255.255.255.0 {
        range 192.168.30.100 192.168.30.200;
        filename "pxelinux.0";
}

Rien d’extraordinaire. On définis le sous réseau, on fixe le range des IPs qui seront délivrées par DHCP. Et on indique le fichier par défaut à récupérer en cas de PXE.

service isc-dhcp-server restart

Vérifiez bien dans /var/log/syslog que le serveur s’est lancé sans erreur

Installation du TFTP

apt-get install tftpd-hpa

On ne va pas installer xinetd ou bien inetutils-inetd. Pour rappel l’intérêt d’un super serveur est d’avoir un seul daemon qui écoute plusieurs services. Cela permet de vérifier qu’un client à le droit d’utiliser un service avant même de rediriger la requête vers ce dit service. Cela peut aussi réduire le nombre de daemons qui tournent sur une machine, ce qui est utiles si vous hébergez des services peu utilisés.

Contrairement à APACHE/PHP qui inclue le moteur PHP dans tout ses fork, xinetd va faire un appel vers le service demandé.

Fichier /etc/default/tftpd-hpa

# /etc/default/tftpd-hpa

TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
#TFTP_ADDRESS="[::]:69"
TFTP_ADDRESS="0.0.0.0:69"
TFTP_OPTIONS="--secure"

TFTP_USERNAME : Par défaut, via apt, un utilisateur tftp est crée. Autant l’utiliser.
TFTP_DIRECTORY : J’ai choisis comme racine TFTP ce dossier, mais vous pouvez le changer en /tftpboot
TFTP_ADDRESS : Adresse IP destination écoutée par le serveur TFTP. J’ai choisi n’importe quel adresse IPv4 de mon serveur tant que c’est à destination du port 69 (TFTP).
TFTP_OPTIONS : J’ai rajouté le secure, sans quoi une erreur « Only absolute filename allowed » risque d’apparaître sur le client (Lien du bug).

service tftpd-hpa start

Configuration des fichiers

Le majeur problème via l’ISO de Linux Mint c’est l’absence totale de fichier pour le boot PXE. On va donc les créer.

mkdir -p /var/lib/tftpboot/images/linuxmint /var/lib/tftpboot/pxelinux.cfg

L’argument -p de mkdir permet de créer les dossiers parents si ils n’existent pas.

cp -R /media/cdrom/* /var/lib/tftpboot/images/linuxmint

En supossant que le serveur fonctionne sur le live CD de Linux Mint.

Il est aussi possible d’utiliser mount à la place de copier :

mount --bind /media/cdrom/ /var/lib/tftpboot/images/linuxmint

Pour pas avoir de soucis d’accès pensez à donner les droits de lecteurs aux fichiers :

chmod -R o+r /var/lib/tftpboot

pxelinux.cfg/default

Via la configuration de DHCP on a indiqué a notre client de télécharger pxelinux.0. Mais il est possible de configurer ce script pour faire ce que nous voulons. Voici la configuration requise pour installer Linux Mint.
Fichier /var/lib/tftpboot/pxelinux.cfg/default :

DEFAULT Linux-Mint
 
LABEL Linux-Mint
MENU LABEL Linux-Mint
KERNEL images/linuxmint/casper/vmlinuz
APPEND root=/dev/nfs boot=casper netboot=nfs nfsroot=192.168.30.254:/var/lib/tftpboot/images/linuxmint initrd=images/linuxmint/casper/initrd.lz nosplash --

Dans ce fichier on doit donner le chemins vers le kernel et l’initrd qui va permettre d’installer notre Linux Mint. Evidemment on va utiliser les fichiers de notre Linux Mint.
C’est ici qu’on définis que nous allons utiliser NFS pour télécharger notre installation de Linux Mint. On entre donc l’adresse IP du serveur NFS ainsi que le dossier NFS à demander.

Télécharger pxelinux.0

On a indiqué dans le serveur DHCP que le fichier par défaut à téléharger en PXE (via TFTP) est pxelinux.0, sauf qu’on a pas ce fichier. Et il est pas fournis par Mint. On va donc le télécharger.

Il est possible de le télécharger depuis le site Kernel.org à l’adresse https://www.kernel.org/pub/linux/utils/boot/syslinux/

Le mieux est de télécharger le fichier qui corresponds au linux à déployer. Mais vu que le script de boot est basique on peut prendre presque n’importe quel fichier. Moi j’ai pris le dernier en date.

Il faut ensuite désarchiver et copier le fichier syslinux-x.xx/bios/core/pxelinux.0 vers /var/lib/tftpboot/pxelinux.0

Corriger l’erreur « failed to load ldlinux.c32 »

Il se peut que lors du boot votre client retourne l’erreur « failed to load ldlinux.c32 », a ce moment il faut copier ce fichier dans le dossier tftpboot.

cp /var/lib/tftpboot/images/linuxmint/isolinux/ldlinux.c32 /var/lib/tftpboot

Configuration de NFS

Le protocole TFTP (Trivial File Transfer Protocol) est comme son nom l’indique un protocole basique. Il est très lent et n’est pas fait pour transférer des gros fichiers. Mais comme nous voulons quand même qu’un système d’exploitation entier puisse être installé. On va utiliser un protocole dédier au transfert de fichier.
En gros TFTP va permettre de télécharger un système linux basique, qui va ensuite télécharger tout les gros fichier en NFS. Puis lancer le script d’installation du système.

apt-get install nfs-kernel-server

Fichier /etc/exports

# /etc/exports: the access control list for filesystems which may be exported
#		to NFS clients.  See exports(5).
#
# Example for NFSv2 and NFSv3:
# /srv/homes       hostname1(rw,sync,no_subtree_check) hostname2(ro,sync,no_subtree_check)
#
# Example for NFSv4:
# /srv/nfs4        gss/krb5i(rw,sync,fsid=0,crossmnt,no_subtree_check)
# /srv/nfs4/homes  gss/krb5i(rw,sync,no_subtree_check)
#
/var/lib/tftpboot/images/linuxmint 192.168.30.0/24(ro,sync,no_subtree_check,fsid=42)

On partage que /var/lib/tftpboot/images/linuxmint, car les fichiers qui se trouvent dans le dossier/var/lib/tftpboot/ ne seront accédés que depuis le serveur TFTP.
192.168.30.0/24 : La requête NFS doit être faite depuis une machine dans le réseau 192.168.30.0/24.
ro : On donne l’accès en Read Only.
sync : Permet d’avoir un fonctionnement de nfs-kernel-server tel que définis par le protocole NFS.
no_subtree_check : Réduit le nombre de vérifications a chaque requêtes. Ce qui accélère les accès mais réduit un peu la sécurité (pas dans notre cas).
fsid=42 : Si votre système de fichier n’as pas de UUID ou votre disque n’a pas device number vous devez spécifier un identifiant de de système de fichier. Sans quoi vous aurez cette erreur :

qword_eol: fflush failed: errno 22 (Invalid argument)
Cannot export /var/lib/tftboot/images/linuxmint possibly unsupported filesystem or fsid= required

Comme identifiant fsid vous pouvez mettre n’importe quelle chaîne hexadécimale. La longueur maximale est de 32 caractères. root et 0 sont des identifiants réservés.

service nfs-kernel-server restart
Remi

A propos de Rémi ANGENIEUX

Maintenant ingénieur en informatique et réseaux, j'ai commencé très tôt cette discipline. Dès l'âge de 12 ans j'ai appris le PHP. Grâce a ma capacité d'autodidacte j'ai pu rapidement apprendre de nombreuses technologies, consolidées par la suite grâce à une formation à l'IUT d'Annecy puis une école d'ingénieur à Grenoble-INP-ESISAR.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML :

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>