Ehko blog

Aller au contenu | Aller au menu | Aller à la recherche

mardi, janvier 29 2019

Debug avec ULink2 et OpenOCD

sonde-ulink2-openocd_entete.jpg

Contrairement à ce qu'on peut lire sur quelques forums sur Internet, les sondes ULink2 sont compatibles avec OpenOCD. La seule chose à faire, c'est de changer leur mode de boot.

Les sondes ULink2 ont deux modes de démarrage : le mode ULink et le mode CMSIS-DAP. Seul ce dernier mode est pris en charge par OpenOCD. Or par défaut, le mode ULink est activé sur les sondes si la version du firmware est inférieure à 2.00. Grosso-modo, cela correspond à toutes les sondes achetées avant mi 2017.

Dans tous les cas, il est possible de passer d'un mode à l'autre en utilisant l'utilitaire "UL2_Configure.exe" fournit par Keil dans son environnement µVision. Je vous ai mis cet utilitaire en annexe de ce billet. Celui-ci se lance depuis la ligne de commande Windows et voici comment on l'utilise :

UL2_Configure.exe [SN] {B0|B1}

Avec :

  • SN : numéro de série de la sonde dont vous voulez changer le mode de boot. Nécessaire seulement si plusieurs sondes sont connectées à l'ordinateur, optionnel sinon.
  • B0 : passage en mode ULink.
  • B1 : passage en mode CMSIS-DAP.

Petit exemple d'utilisation : ulink2-boot-mode.png

Une fois le mode de boot de la sonde modifié, il ne reste plus qu'à réaliser le script OpenOCD qui va bien, en spécifiant qu'on utilise une interface de type CMSIS-DAP. Exemple de config OpenOCD avec une sonde ULink2 pour debugger un STM32F207 en mode SWD :

source [find interface/cmsis-dap.cfg]
transport select swd
source [find target/stm32f2x.cfg]
reset_config srst_only

source

mercredi, mai 2 2018

Serveur IPXE - Partie 2 - Installation

Ce billet est la suite du billet Mise en place d'un serveur IPXE - partie 1 qui explique le principe du serveur IPXE et l'organisation du système que nous avons mis en place. Je vais maintenant rentrer dans la partie pratique : l'installation et la configuration du serveur.

Attention ! Le serveur IPXE n'a jamais été finalisé. Je laisse ce billet publié. Ca pourra toujours servir à quelqu'un.


Installation des paquets nécessaires :

apt-get install dnsmasq lighttpd samba nfs-kernel-server

Nous utilisons lighttpd comme serveur HTTP car il est léger et simple à mettre en place.


Réglage de l'adresse IP du serveur

Le serveur utilise une adresse IP fixe pour pouvoir être adressé par les machines sur le réseau. Ce réglage peut soit être effectué sur l'interface du routeur, soit directement sur le serveur. Dans ce dernier, bien choisir une adresse IP en dehors de la plage DHCP pour éviter une double attribution.

Pour le réglage sur le serveur, éditer le fichier /etc/networks/interfaces et ajouter les lignes suivantes :

auto eth0
iface eth0 inet static
    address 192.168.0.200
    netmask 255.255.255.0
    gateway 192.168.0.1
    dns-nameservers 9.9.9.9

Le nom de l'interface réseau (ici eth0) est à adapter en fonction de votre machine. De même qu'il vous faudra peut-être adapter l'adresse IP ou celle du routeur (qui est parfois en 192.168.0.254).


Création de l'arborescence :

L'arborescence globale est présentée dans le premier billet. Je ne détaille ici que les commandes pour la créer.

  • Création des répertoires principaux.

mkdir -p /srv/tftp
mkdir -p /srv/samba
mkdir -p /srv/http

  • Création des répertoires accueillant les distributions GNU/Linux et wimboot.

mkdir -p /srv/http/archlinux
mkdir -p /srv/http/debian/9/{32-bit,64-bit}
mkdir -p /srv/http/debian/8/{32-bit,64-bit}
mkdir -p /srv/http/emmabuntus/3/{32-bit,64-bit}
mkdir -p /srv/http/emmabuntus/de2/{32-bit,64-bit}
mkdir -p /srv/http/linux_mint/cinammon/{32-bit,64-bit}
mkdir -p /srv/http/linux_mint/MATE/{32-bit,64-bit}
mkdir -p /srv/http/linux_mint/LXDE/{32-bit,64-bit}
mkdir -p /srv/http/linux_mint/KDE/{32-bit,64-bit}
mkdir -p /srv/http/mageia/{32-bit,64-bit}
mkdir -p /srv/http/ubuntu/UNITY/{32-bit,64-bit}
mkdir -p /srv/http/ubuntu/GNOME/{32-bit,64-bit}
mkdir -p /srv/http/ubuntu/KDE/{32-bit,64-bit}
mkdir -p /srv/http/ubuntu/LXDE/{32-bit,64-bit}
mkdir -p /srv/http/ubuntu/XFCE/{32-bit,64-bit}
mkdir -p /srv/http/ubuntu/MATE/{32-bit,64-bit}
mkdir -p /srv/http/windows


Préparation des fichiers d'amorce :

1ère possibilité

Nous utilisons les fichiers d'amorce IPXE disponibles dans le paquet ipxe lorsqu'ils sont disponibles.

ln -s /usr/lib/ipxe/undionly.kpxe /srv/tftp/
ln -s /usr/lib/ipxe/ipxe.efi /srv/tftp/ipxe_64-bit.efi

Les fichiers d'amorce manquants doivent être compiler depuis les sources. Pour cela, il faut récupérer les sources, en clonant le dépôt git par exemple :

git clone https://github.com/ipxe/ipxe

Puis il faut se rendre dans l'arborescence et lancer la compilation :

cd ipxe/src
make bin-i386-efi/ipxe.efi

On peut ensuite récupérer le fichier généré :

cp bin/ipxe.efi /srv/tftp/ipxe_32-bit.efi

Sur la page de document de ipxe suivante, vous trouverez la liste des plateformes et des drivers qu'il est possible de générer : http://ipxe.org/appnote/buildtargets.


2eme possibilité

Nous n'utilisons pas les fichiers d'amorce PXE fournis dans le package ipxe car il nous faut recompiler chaque fichier pour y intégrer un script IPXE. Ce dernier comporte simplement l'url de notre script IPXE principal.

Pour la compilation, il faut récupérer les sources, en clonant le dépôt git par exemple :

git clone https://github.com/ipxe/ipxe

Puis il faut se rendre dans l'arborescence et créer notre script IPXE qui sera intégré dans le fichier d'amorce :

cd ipxe/src
nano embed.ipxe

Contenu du fichier intégré :

#!ipxe
dhcp
chain http://192.168.0.200/master.ipxe

On peut ensuite lancer la compilation intégrant notre script...

make bin/undionly.kpxe EMBED=embed.ipxe

... et récupérer le fichier généré :

cp bin/ipxe.efi /srv/tftp/ipxe_32-bit.efi

Sur la page de document de ipxe suivante, vous trouverez la liste des plateformes et des drivers qu'il est possible de générer : http://ipxe.org/appnote/buildtargets. Par exemple, pour un fichier UEFI 64-bit, on lancera :

make bin-x86_64-efi/ipxe.efi EMBED=embed.ipxe


Configuration de dnsmasq :

La configuration se fait en modifiant le fichier /etc/dnsmasq.conf (par exemple avec nano)

nano /etc/dnsmasq.conf

Voici la configuration dnsmasq utilisée :

#===============================================================
# Configuration file for dnsmasq
#===============================================================
# Disable DNS Server (DNS already provide by the router)
port=0

# Enable DHCP logging
log-dhcp

# Respond to PXE requests for the specified network;
# run as DHCP proxy
dhcp-range=192.168.0.0,proxy,255.255.255.0
#If not running as a DHCP proxy (first IP, last IP, mask, bail duration)
#dhcp-range=192.168.0.100,192.168.0.150,255.255.255.0,12h

#Detect the client architecture
dhcp-match=set:x86PC, option:client-arch, 0 #BIOS
dhcp-match=set:UEFI32, option:client-arch, 6 #UEFI32
dhcp-match=set:UEFI64, option:client-arch, 7 #UEFI64
dhcp-match=set:UEFI64, option:client-arch, 9 #EBC ->use the same bootloader as UEFI64
#Detect IPXE request
dhcp-match=set:IPXE,175 # iPXE sends a 175 option

# Load different PXE boot image depending on client architecture (when not running as a proxy DHCP)
dhcp-boot=tag:x86PC, undionly.kpxe
dhcp-boot=tag:UEFI32, ipxe_32-bit.efi
dhcp-boot=tag:UEFI64, ipxe_64-bit.efi
#Serve the IPXE config file over HTTP
dhcp-boot=tag:IPXE, http://192.168.0.200/master.ipxe

# Load different PXE boot image depending on client architecture (when running as a proxy DHCP)
pxe-service=tag:x86PC, X86PC, "BIOS Network Boot", undionly.kpxe
pxe-service=tag:UEFI32, BC_EFI, "UEFI32 Network Boot", ipxe_32-bit.efi
pxe-service=tag:UEFI64, X86-64_EFI, "UEFI64 Network Boot", ipxe_64-bit.efi
#Serve the IPXE config file over HTTP
pxe-service=tag:IPXE, X86PC, http://192.168.0.200/master.ipxe

## Activate TFTP and set the root directory
enable-tftp
tftp-root=/srv/tftp


Désactivation du DNS de dnsmasq :

Cette modification permet d'empêcher dnsmasq de se définir comme serveur DNS pour les machines démarrées via PXE. Cela permet d'utiliser le routeur comme serveur DNS, comme d'habitude.

nano /etc/default/dnsmasq

DNSMASQ_EXCEPT=lo


Redémarrage du service dnsmasq :

On termine en redémarrant le service dnsmasq pour prendre en compte les modifications.

systemctl restart dnsmasq


Configuration du serveur NFS :

nano /etc/exports

Il faut ajouter la ligne suivante pour activer le partage sur le répertoire /srv/http/.

/srv/http 192.168.0.0/24(ro,async,no_root_squash,no_subtree_check)

Nous limitons l'accès au réseau local (192.168.0.0/24) et empêchons les modifications (paramètre ro pour read-only).

Application des modifications :

exportfs -rav


Configuration du serveur Samba :

nano /etc/samba/smbd.conf

Il faut ajouter un partage de fichier sur le répertoire que nous avons créé précédemment. Ce partage est configuré en lecture seul pour éviter toutes les modifications par la machine client et permet de se connecter sans se soucier du nom d'utilisateur et du mot de passe.

La configuration déjà présente dans le fichier smbd.conf n'est pas modifiée. Seule la partie suivante a été ajoutée :

\[pxe\]
    path = /srv/samba
    browsable = yes
    guest only = yes
    read only = yes
    public = yes

On applique les modifications en redémarrant le serveur Samba :

systemctl restart smbd


Création du fichier de configuration ipxe :

Nous avons configuré notre serveur pour qu'un client récupère automatiquement le fichier principal ipxe, nommé master.ipxe via le protocole HTTP. Il ne nous reste donc plus qu'à créer ce dernier et le placer dans le dossier /srv/http/.

Serveur IPXE - Partie 1 - Fonctionnement

Attention ! L'installation du serveur n'a jamais été finalisée. Ce billet sera modifié si le projet est repris un jour.

J'avais commencé à installer un serveur PXE pour l'atelier-soudé, comme détaillé dans ces deux billets de blog : 1 et 2. Le système était d'ailleurs plutôt bien abouti mais il était particulièrement lent sur les transferts d'images disques. J'ai donc décidé de changé de système pour installer un serveur IPXE.

L'avantage de IPXE par rapport à PXE est qu'il permet d'utiliser d'autres protocoles que le TFTP pour le transfert des fichiers. Ceci permet donc d'avoir des vitesses de transfert beaucoup plus importantes.

Pour pouvoir fonctionner, IPXE doit soit être intégré directement dans une carte réseau en remplacement du binaire PXE, soit être chainé après PXE. Dans ce dernier cas, l'ordinateur démarre en utilisant le binaire PXE intégré dans sa carte réseau. Il émet une requête DHCP et reçoit un fichier d'amorce compatible IPXE depuis le serveur PXE. Il exécute donc un second démarrage en utilisant ce fichier qui se termine soit en lançant une nouvelle requête DHCP pour recevoir depuis le serveur PXE un script IPXE à exécuter, soit en exécutant un script intégré dans le fichier d'amorce lorsque ce dernier est disponible.


Présentation du système mis en place

Le fonctionnement de notre serveur IPXE reprends une partie des concept du serveur PXE que nous avions installés précédemment. Mais il y a également pas mal de changements.

Voici les éléments/logiciels utilisés :

  • dnsmasq : logiciel intégrant un serveur DNS (non utilisé ici), un serveur DHCP permettant de faire du PXE et un serveur TFTP. Le choix s'est porté sur ce logiciel car il permet de faire du proxy DHCP, qu'il est simple à configurer et qu'il intègre la plupart des outils nécessaires au serveur PXE.

Petite parenthèse : un proxy DHCP permet de fournir les éléments du protocole DHCP nécessaires au démarrage PXE sans être le serveur DHCP principal qui fournit les adresses IP. Cette fonctionnalité là était nécessaire car le routeur fournissant l'accès à internet pour l'atelier-soudé fait également office de serveur DHCP et nous ne voulions pas modifier sa configuration. De plus, le routeur est constamment démarré contrairement au serveur PXE.

  • IPXE : un système d'amorçage réseau reprenant le fonctionnement de PXE en ajoutant des protocoles supplémentaires.
  • Un serveur HTTP : permet de fournir les scripts IPXE, les images disques et les fichiers de démarrage des systèmes d'exploitation. Il peut également remplacer le serveur NFS pour le transfert des autres fichiers.
  • Un serveur NFS : système de partage de fichiers distant entre machine de type Unix. Il fournit les images disques de tous les systèmes d'exploitation (excepté Windows).
  • Un serveur Samba : système de partage de fichiers distant utilisant le protocole propriétaire SMB de Microsoft. Ce serveur fournit les images disques des systèmes d'exploitation Windows.

Le serveur est installé sur le même ordinateur que le précédent serveur PXE : une machine sous Linux Mint. Linux Mint est une distribution dérivée de Ubuntu, elle même dérivée de Debian. L'ensemble des commandes présentées dans ce billet et les suivants devraient donc être compatible avec tous les systèmes dérivés de Debian, Ubuntu compris. Et tout doit également fonctionner sur d'autres distributions GNU/Linux, moyennant quelques modifications simples au niveau des commandes du gestionnaire de paquet.

Notre serveur PXE est également capable de fournir à l'ordinateur le fichier d'amorçage correspondant à son système bas niveau : BIOS ou UEFI.


Structure des répertoires

Voici à quoi ressemble la structure des répertoires du serveur IPXE après installation :

/srv/
    |_ tftp/
    |      |_ ipxe.efi
    |      |_ undionly.kpxe
    |
    |_ http/
    |      |_ archlinux/
    |      |_ linux_mint/
    |      |         |_ cinammon/
    |      |         |           |_ 32-bit/
    |      |         |           |_ 64-bit/
    |      |         |_ MATE/
    |      |         |           |_ 32-bit/
    |      |         |           |_ 64-bit/
    |      |         |_ XFCE/
    |      |         |           |_ 32-bit/
    |      |         |           |_ 64-bit/
    |      |         |_ KDE/
    |      |         |           |_ 32-bit/
    |      |         |           |_ 64-bit/
    |      |_ mageia/
    |      |         |_ 32-bit/
    |      |         |_ 64-bit/
    |      |_ utilitaires/
    |      |_ windows/
    |      |         |_ 32-bit/
    |      |         |_ 64-bit/
    |      |         |_ wimboot
    |      |         |_ 
    |      |         |_ 
    |      |
    |      |_ master.ipxe
    |      |_ boot.png
    |      |_ ...
    |
    |_ samba/
    |      |_ windows/
    |      |      |_ windows_10/
    |      |      |         |_ 32-bit/
    |      |      |         |_ 64-bit/
    |      |      |_ windows_8.1/
    |      |      |         |_ 32-bit/
    |      |      |         |_ 64-bit/
    |      |      |_ windows_7/
    |      |      |_ windows_vista/
    |      |      |         |_ 32-bit/
    |      |      |         |_ 64-bit/
    |      |      |_ windows_XP/

J'ai préféré détailler les instructions pour installer et configurer le serveur IPXE dans un second billet plutôt que d'en faire un seul indigeste. Vous le trouverez ici.

vendredi, mars 23 2018

Mise en place d'un serveur PXE - partie 2

Je continue ma suite de billet sur l'installation d'un serveur PXE. Le premier est disponible ici.

Maintenant que les principes généraux ont été expliqués, je vais rentrer dans la partie plus pratique : l'installation et la configuration du serveur.


Installation des paquets nécessaires :

apt-get install syslinux syslinux-efi dnsmasq pxelinux


Réglage de l'adresse IP du serveur

Le serveur utilise une adresse IP fixe pour pouvoir être adressé par les machines sur le réseau. Ce réglage peut soit être effectué sur l'interface du routeur, soit directement sur le serveur. Dans ce dernier, bien choisir une adresse IP en dehors de la plage DHCP pour éviter une double attribution.

Pour le réglage sur le serveur, éditer le fichier /etc/networks/interfaces et ajouter les lignes suivantes :

auto eth0
iface eth0 inet static
    address 192.168.0.200
    netmask 255.255.255.0
    gateway 192.168.0.1
    dns-nameservers 9.9.9.9

Le nom de l'interface réseau (ici eth0) est à adapter en fonction de votre machine. De même qu'il vous faudra peut-être adapter l'adresse IP ou celle du routeur (qui est parfois en 192.168.0.254).


Création de l'arborescence :

L'arborescence est présentée dans le premier billet si vous voulez avoir une vue d'ensemble ;-)

  • Création des répertoires.

mkdir -p /srv/tftp/boot/
mkdir -p /srv/tftp/bios/pxelinux.cfg/
mkdir -p /srv/tftp/efi32/pxelinux.cfg/
mkdir -p /srv/tftp/efi64/pxelinux.cfg/

  • Création de liens symboliques vers le répertoire /srv/tftp/boot/ dans chacun des sous-répertoire dédiés à une architecture. De cette façon les images disque sont disponibles pour toutes les architectures sans être dupliquées.

cd /srv/tftp/bios && ln -s ../boot boot
cd /srv/tftp/efi32 && ln -s ../boot boot
cd /srv/tftp/efi64 && ln -s ../boot boot


Préparation des répertoires :

Il s'agit maintenant de remplir les répertoires avec les fichiers syslinux correspondant au bon système d'amorçage.

  • Partie BIOS

ln -s /usr/lib/syslinux/modules/bios/* /srv/tftp/bios/
ln -s /usr/lib/PXELINUX/pxelinux.0 /srv/tftp/bios/

  • Partie EFI64

ln -s /usr/lib/syslinux/modules/efi64/* /srv/tftp/efi64/
ln -s /usr/lib/SYSLINUX.EFI/efi64/syslinux.efi /srv/tftp/efi64/

  • Partie EFI32

ln -s /usr/lib/syslinux/modules/efi32/* /srv/tftp/efi32/
ln -s /usr/lib/SYSLINUX.EFI/efi32/syslinux.efi /srv/tftp/efi32/


Configuration de dnsmasq :

La configuration se fait en modifiant le fichier /etc/dnsmasq.conf (par exemple avec nano)

nano /etc/dnsmasq.conf

Voici la configuration dnsmasq utilisée :

#===============================================================
# Configuration file for dnsmasq
#===============================================================
# Disable DNS Server (DNS already provide by the router)
port=0

# Enable DHCP logging
log-dhcp

# Respond to PXE requests for the specified network;
# run as DHCP proxy
dhcp-range=192.168.0.0,proxy,255.255.255.0

#Detect the client architecture
dhcp-match=set:x86PC, option:client-arch, 0 #BIOS
dhcp-match=set:UEFI32, option:client-arch, 6 #UEFI32
dhcp-match=set:UEFI64, option:client-arch, 7 #UEFI64
dhcp-match=set:UEFI64, option:client-arch, 9 #EBC ->use the same bootloader as UEFI64

# Load different PXE boot image depending on client architecture (when runing not as a proxy DHCP)
dhcp-boot=tag:x86PC, bios/pxelinux
dhcp-boot=tag:UEFI32, efi32/syslinux.efi
dhcp-boot=tag:UEFI64, efi64/syslinux.efi

# Load different PXE boot image depending on client architecture (when runing as a proxy DHCP)
pxe-service=tag:x86PC, X86PC, "BIOS Network Boot", bios/pxelinux
pxe-service=tag:UEFI32, BC_EFI, "UEFI32 Network Boot", efi32/syslinux.efi
pxe-service=tag:UEFI64, X86-64_EFI, "UEFI64 Network Boot", efi64/syslinux.efi

## Activate TFTP and set the root directory
enable-tftp
tftp-root=/srv/tftp


Désactivation du DNS de dnsmasq :

Cette modification permet d'empêcher dnsmasq de se définir comme serveur DNS pour les machines démarrées via PXE. Cela permet d'utiliser le routeur comme serveur DNS, comme d'habitude.

nano /etc/default/dnsmasq

DNSMASQ_EXCEPT=lo


Redémarrage du service dnsmasq

On termine en redémarrant le service dnsmasq pour prendre en compte les modifications.

systemctl restart dnsmasq


Installation du serveur NFS

apt-get install nfs-kernel-server


Configuration du serveur NFS:

nano /etc/exports

Il faut ajouter la ligne suivante pour activer le partage sur le répertoire /srv/tftp/boot/.

/srv/tftp/boot 192.168.0.0/24(ro,async,no_root_squash,no_subtree_check)

Application des modifications :

exportfs -rav


Configuration pxelinux

PXELinux charge automatiquement le fichier nommé "default" et situé dans le répertoire "pxelinux.cfg". Si vous démarrez une machine BIOS, ce sera le fichier /srv/tftp/bios/pxelinux.cfg/default qui sera chargé et pour une machine UEFI64, ce sera le fichier /srv/tftp/efi64/pxelinux.cfg/default.

Sur notre serveur, nous utilisons ce fichier pour présenter à l'utilisateur un menu. Celui-ci liste tous les systèmes que nous avons mis en place.

pxe_menu-principal.png

Notre configuration est découpée en plusieurs fichiers regroupant les systèmes dans des catégories : linux mint, windows, utilitaires et autres systèmes. Nous utilisons également un fichier séparé pour la coloration et la mise en page, ainsi qu'une image de fond. Je vous ai mis en pièce jointe de ce billet de blog l'ensemble des fichiers de configuration que nous utilisons.

Attention ! Du fait que nous ayons abandonnés ce système pour nous tourner vers un serveur IPXE (billet explicatif ici), seuls les démarrages de Linux Mint et de ArchLinux ont été testés. Le chargement des isos de WinPE fonctionne également mais est particulièrement lent, du fait de l'utilisation du TFTP.


Préparation des images linux

Le kernel et le fichier d'initialisation de la RAM sont fournis par TFTP. Le reste des images disques GNU/Linux est envoyé par NFS afin d'augmenter la vitesse de transfert. De ce fait, il est nécessaire de décompresser les images disques et de changer les permissions pour qu'aussi bien le serveur TFTP que le serveur NFS puissent y accéder.

  • Téléchargement de l'image disque par votre méthode favorite
  • Décompression de l'image disque dans le répertoire adéquat. Exemple pour Linux Mint Cinammon 64-bit, avec l'iso dans le répertoire de téléchargement de l'utilisateur "user" :

cd /srv/tftp/boot/linux_mint/cinammon/64-bit/ && 7z x /home/user/Downloads/limuxmint-18.3-cinammon-64bit.iso

  • Changement des permissions

chmod -R 775 /srv/tftp/boot/linux_mint/

Note : plutôt que de changer les permissions de manière bourrine comme montré au dessus, il est plus orthodoxe de créer un utilisateur pour chaque logiciel et un groupe commun. En attribuant les fichiers au groupe commun, tous peuvent donc fonctionner correctement et présenter les fichiers sans erreur.

Sources en vrac

Voici une liste de sources sur lesquels je me suis basé pour la mise en place du serveur. Cette liste n'est pas complète car je n'ai pas gardé trace de toutes mes lectures.

Mise en place d'un serveur PXE - partie 1

Je suis membre de l'atelier-soudé depuis quelques mois. Il s'agit d'une association de co-réparation d'objets électroniques et électriques. En gros, si vous avez un soucis avec un de vos appareils, vous venez et vous allez pouvoir le réparer vous même en bénéficiant de l'aide, des connaissances et des conseils des membres, et en utilisant le matériel mis à disposition.

Au sein de l'association, nous réparons régulièrement des ordinateurs et il faut souvent réinstaller le système d'exploitation ou démarrer sur un support externe pour diagnostic la panne. Nous utilisions jusqu'à présent des clés USB pour installer les systèmes d'exploitation. Le soucis majeur de cette solution est que nous n'avions jamais le bon système sous la main ou la bonne version et que nous passions donc notre temps à effacer et flasher ces clés USB.

Mais cette époque est (bientôt) révolue ! Nous sommes en train de mettre en place un serveur PXE pour pouvoir démarrer des systèmes d'exploitation depuis le réseau. Cette suite de billet détaille la démarche que nous avons suivis.

Attention ! Le système présenté dans ce billet et le suivant n'est pas complet. Lors de la mise en place du démarrage des systèmes Windows, j'ai fait le choix de basculer d'un serveur PXE à un serveur IPXE. Ceci car le téléchargement des isos WinPE en TFTP est beaucoup trop lent. IPXE permet de passer ces fichiers en HTTP ce qui fait passer le temps de chargement de quelques minutes à quelques secondes. Seul le démarrage des systèmes Linux Mint et ArchLinux est fonctionnel.

J'ai tout de même décidé de publier ces billets car l'ensemble est fonctionnel et plutôt bien abouti. Il est seulement lent pour le transfert des images disques WinPE et des utilitaires en ISO, pas pour les systèmes d'exploitation Linux car il utilise NFS. Je n'ai également testé qu'un nombre réduit de systèmes d'exploitation.

Le billet détaillant la mise en place du serveur IPXE est disponible ici.


Principe

Un serveur PXE permet à un ordinateur de démarrer depuis le réseau en récupérant une image qui se trouve sur un serveur. Le démarrage PXE, appelé amorce PXE, s'effectue en trois étapes :

  • Récupération d'une adresse IP sur un serveur DHCP. Par le biais du protocole DHCP, le fichier à amorcer est également indiqué à la machine.
  • Téléchargement du fichier à amorcer depuis un serveur Trivial FTP (TFTP).
  • Exécution du fichier à amorcer.

Le fichier d'amorçage peut ensuite lancer le démarrage d'un installateur, présenter un menu de choix pour l'utilisateur, récupérer des fichiers distants...


Présentation du système mis en place

Notre serveur PXE fonctionne avec les éléments suivants :

  • dnsmasq : logiciel intégrant un serveur DNS (non utilisé ici), un serveur DHCP permettant de faire du PXE et un serveur TFTP. Le choix s'est porté sur ce logiciel car il permet de faire du proxy DHCP, qu'il est simple à configurer et qu'il intègre la plupart des outils nécessaires au serveur PXE.

Petite parenthèse : un proxy DHCP permet de fournir les éléments du protocole DHCP nécessaires au démarrage PXE sans être le serveur DHCP principal qui fournit les adresses IP. Cette fonctionnalité là était nécessaire car le routeur fournissant l'accès à internet pour l'atelier-soudé fait également office de serveur DHCP et nous ne voulions pas modifier sa configuration. De plus, le routeur est constamment démarré contrairement au serveur PXE.

  • pxelinux : logiciel dérivé de Syslinux permettant le démarrage PXE depuis un serveur. L'utilisation des éléments de Syslinux permet ensuite de présenter un menu personnalisé à l'utilisateur, de charger des utilitaires ou de démarrer n'importe quel système d'exploitation.
  • Un serveur NFS : système de partage de fichiers distant entre machine de type Unix. Il fournit les images disques de tous les systèmes d'exploitation (excepté Windows).

Le serveur est installé sur une machine sous Linux Mint car c'est ce que l'atelier-soudé avait en stock. Linux Mint est une distribution dérivée de Ubuntu, elle même dérivée de Debian. L'ensemble des commandes présentées dans ce billet et les suivants devraient donc être compatible avec tous les systèmes dérivés de Debian, Ubuntu compris. Et tout doit également fonctionner sur d'autres distributions GNU/Linux, moyennant quelques modifications simples au niveau des commandes du gestionnaire de paquet.

Notre serveur PXE est également capable de fournir à l'ordinateur le fichier d'amorçage correspondant à son système bas niveau : BIOS ou UEFI.


Structure des répertoires

Voici à quoi ressemble la structure des répertoires du serveur PXE après installation :

/srv/
    |_ tftp/
    |      |_ boot/
    |      |      |_ linux_mint/
    |      |      |         |_ cinammon/
    |      |      |         |           |_ 32-bit
    |      |      |         |           |_ 64-bit
    |      |      |         |_ MATE/
    |      |      |         |           |_ 32-bit
    |      |      |         |           |_ 64-bit
    |      |      |         |_ XFCE/
    |      |      |         |           |_ 32-bit
    |      |      |         |           |_ 64-bit
    |      |      |         |_ KDE/
    |      |      |         |           |_ 32-bit
    |      |      |         |           |_ 64-bit
    |      |      |_ windows_10/
    |      |      |         |_ 32-bit
    |      |      |         |_ 64-bit
    |      |      |_ windows_7
    |      |      |_ windows_XP
    |      |      |_ archlinux/
    |      |      |         |_ x86_64
    |      |      |_ utilitaires
    |      |      |_ ...
    |      |
    |      |_ bios/
    |      |      |_ boot  -> ../boot/
    |      |      |_ pxelinux.cfg/
    |      |      |              |_ default
    |      |      |              |_ linux_mint.menu
    |      |      |              |_ windows.menu
    |      |      |              |_ autre.menu
    |      |      |              |_ utilitaires.menu
    |      |      |_ pxelinux.0
    |      |      |_ ldlinux.c32
    |      |      |_ (bios)*.c32
    |      |      |_ ...
    |      |
    |      |_ efi32/
    |      |      |_ boot  -> ../boot/
    |      |      |_ pxelinux.cfg/
    |      |      |              |_ default
    |      |      |              |_ ...
    |      |      |_ syslinux.efi
    |      |      |_ ldlinux.e32
    |      |      |_ (efi32)*.c32
    |      |      |_ ...
    |      |
    |      |_ efi64/
    |      |      |_ boot  -> ../boot/
    |      |      |_ pxelinux.cfg/
    |      |      |              |_ default
    |      |      |              |_ ...
    |      |      |_ syslinux.efi
    |      |      |_ ldlinux.e34
    |      |      |_ (efi64)*.c32
    |      |      |_ ...
    |
    |_ samba/
    |      |_ windows/
    |      |      |_ windows_10/
    |      |      |         |_ 32-bit
    |      |      |         |_ 64-bit
    |      |      |_ windows_7
    |      |      |_ windows_XP

Ce billet commence à être bien assez long à mon goût. Et il me reste encore à expliciter l'installation et la configuration du serveur PXE. Je vous réserve donc tout ça pour un autre billet (disponible ici).

- page 1 de 4