====== Installation du serveur des Abeilles numéro 1 de clonage iPXE/Clonezilla sur Debian 13 ====== Cette documentation a été élaborée avec l'aide de Lumo, l'assistant d'intelligence artificielle développé par Proton (https://lumo.proton.me). L'analyse du serveur, la rédaction des procédures et les corrections ont été réalisées conjointement : les commandes de diagnostic ont été exécutées et vérifiées sur le serveur réel, et les configurations proposées validées avant publication mais sans pour autant être certain que tout fonctionne. A vous de vérifier :) ReunigKozh ===== ## 1. Vue d'ensemble de l'architecture ===== Le serveur permet de démarrer des machines en réseau (PXE) et de leur proposer soit la **restauration automatique d'une image système** (Debian, Ubuntu, Mint, PrimTux, MX Linux...), soit l'**effacement sécurisé** d'un disque (HDD, SSD, NVMe). PC client (PXE) │ ├─1─ DHCP (isc-dhcp-server, UDP 67) → donne une IP + le nom du bootloader │ ├─2─ TFTP (tftpd-hpa, UDP 69) → sert ipxe.efi (UEFI) ou undionly.kpxe (BIOS) │ ├─3─ HTTP (nginx, TCP 80) → sert boot.ipxe, vmlinuz, initrd.img, squashfs │ └─4─ NFS (TCP 2049) → monte /home/partimag (images + scripts) Hypothèses : le serveur a **deux cartes réseau** — une reliée à Internet, l'autre (``) au LAN de déploiement isolé. Le serveur garde l'adresse **192.168.100.1**, codée dans la configuration : ne la changez pas sans tout relire. ===== ## 2. Installation des paquets ===== sudo apt update sudo apt install isc-dhcp-server tftpd-hpa nginx nfs-kernel-server nfs-common rsync > Pendant l'installation d'`isc-dhcp-server`, il peut demander une interface : renseignez `` (vous pourrez la corriger ensuite dans `/etc/default/isc-dhcp-server`). ===== ## 3. Configuration de la carte réseau LAN ===== Identifier le nom de la carte (débrancher la carte Internet pour lever le doute, ou regarder `nmcli device status`) : ip link Créer la connexion statique (remplacer `` par le nom réel, ex. `enp3s0`) : sudo nmcli connection add type ethernet con-name "pxe-lan" ifname \ ipv4.method manual ipv4.addresses 192.168.100.1/24 ipv6.method disabled sudo nmcli connection up pxe-lan ⚠️ **Ne jamais brancher la carte LAN PXE sur un réseau existant** tant que le DHCP tourne : le serveur attribuerait des IP 192.168.100.x à votre réseau habituel. ===== ## 4. Configuration DHCP ===== Créer sudo nao /etc/dhcp/dhcpd.conf option domain-name "pxe.local"; option domain-name-servers 8.8.8.8; option space PXE; option PXE.arch code 93 = unsigned integer 16; default-lease-time 600; max-lease-time 7200; authoritative; subnet 192.168.100.0 netmask 255.255.255.0 { range 192.168.100.10 192.168.100.120; option routers 192.168.100.1; option broadcast-address 192.168.100.255; next-server 192.168.100.1; if exists user-class and option user-class = "iPXE" { # iPXE sait parler HTTP : on lui passe directement le menu filename "http://192.168.100.1/boot.ipxe"; } elsif option PXE.arch = 00:07 or option PXE.arch = 00:09 { # UEFI x64 → iPXE EFI filename "ipxe.efi"; } else { # BIOS legacy → iPXE en mode chainloader filename "undionly.kpxe"; } } Déclarer l'interface d'écoute dans sudo nano /etc/default/isc-dhcp-server INTERFACESv4="" INTERFACESv6="" ===== ## 5. Configuration TFTP ===== sudo nano /etc/default/tftpd-hpa TFTP_USERNAME="tftp" TFTP_DIRECTORY="/srv/tftp" TFTP_ADDRESS="0.0.0.0:69" TFTP_OPTIONS="--secure" Créer la racine TFTP **minimaliste** (seuls les bootloaders sont servis par TFTP — tout le reste passe en HTTP) : sudo mkdir -p /srv/tftp # Copier depuis l'ancien serveur ou récupérer depuis une compilation iPXE : sudo rsync -av ancien:/srv/tftp/ipxe.efi ancien:/srv/tftp/undionly.kpxe /srv/tftp/ sudo chown -R root:tftp /srv/tftp chmod 644 /srv/tftp/* > **Pourquoi ne pas recopier tout l'ancien `/srv/tftp/` ?** Il contient ~1 Go de vestiges (ISO dupliquées, modules GRUB/syslinux, installateur Debian) issus d'essais précédents et non utilisés par la chaîne actuelle. Archivez l'ancien serveur tel quel sur un support externe, puis ne migrez que ces deux fichiers (+ `efi32/` si vous voulez le fallback UEFI 32 bits). ===== ## 6. Contenu HTTP (nginx) ===== La config nginx par défaut de Debian sert `/var/www/html` sur le port 80 : elle convient telle quelle. Y copier : sudo rsync -av ancien:/var/www/html/boot.ipxe /var/www/html/ sudo rsync -av ancien:/var/www/html/clonezilla/ /var/www/html/clonezilla/ Contenu attendu dans `/var/www/html/clonezilla/live/` (Clonezilla Live **personnalisé** — voir §9) : filesystem.squashfs (352 Mo) initrd.img (37 Mo) vmlinuz (8,9 Mo) ===== ## 7. NFS (images et scripts) ===== Créer le répertoire des images et y copier le contenu de l'ancien serveur : sudo rsync -av ancien:/home/partimag/ /home/partimag/ Arborescence attendue : /home/partimag/ ├── sda/ ← images pour cibles SATA (disques détectés en /dev/sda) ├── nvme/ ← images pour cibles NVMe └── scripts/ ├── restore-by-disk.sh └── effacement.sh Déclarer l'export dans sudo nano /etc/exports /home/partimag 192.168.100.0/24(rw,sync,no_subtree_check,no_root_squash) Puis : sudo exportfs -ra ===== ## 8. Démarrage et activation des services ===== sudo systemctl enable --now isc-dhcp-server tftpd-hpa nginx nfs-server Vérifications : sudo systemctl status isc-dhcp-server tftpd-hpa nginx nfs-server ss -tulpn | grep -E ':(67|69|80|2049)' # les 4 ports doivent répondre curl http://localhost/boot.ipxe # doit afficher le menu iPXE curl -sI http://localhost/clonezilla/live/filesystem.squashfs | head -3 # 200 OK showmount -e localhost # l'export doit être listé Si un pare-feu est actif, autoriser sur l'interface LAN : 67/udp, 69/udp, 80/tcp, 2049/tcp + rpcbind. ===== ## 9. Le Clonezilla Live personnalisé (point critique) ===== Le `filesystem.squashfs` servi n'est **pas** le Clonezilla Live standard : il intègre `nwipe`, `hdparm`, `nvme-cli` nécessaires au script d'effacement (c'est le sens du nom `clonezilla-3.2.2-15-AUTO-et-effacement.iso`). Concrètement, lors de l'installation : 1. Récupérer le squashfs, vmlinuz et initrd.img depuis l'ancien serveur — **la version de `/var/www/html/`, pas celle de `/srv/tftp/`** (elles diffèrent) ; 2. Conserver une copie de l'ISO personnalisé hors production ; 3. Documenter la méthode de reconstruction : personnaliser Clonezilla Live (mode "génération d'une version personnalisée" de Clonezilla, ou décompression du squashfs + `unsquashfs`/`mksquashfs` après ajout des paquets `nwipe hdparm nvme-cli`), puis redéployer les trois fichiers dans `/var/www/html/clonezilla/live/`. ===== ## 10. Tests finaux ===== Brancher un PC client sur le LAN de déploiement, démarrer en PXE : le menu doit apparaître en ~10 secondes (timeout du `choose`). Tester au minimum une machine **UEFI** et une machine **BIOS** avant production. --- ====== Utilisation au quotidien ====== ===== ## 1. Restaurer un poste ===== * 1. Relier le PC au LAN de déploiement (switch dédié, pas le réseau Internet) * 2. Démarrer en PXE (touche F12/F9/F11 selon le constructeur, ou boot réseau en premier dans l'UEFI) * 3. Le menu s'affiche — **taper sur une touche dans les 10 secondes** sinon le choix par défaut (dernier item) part tout seul * 4. Choisir l'image correspondant **au firmware** de la machine (une image `-UEFI-img` pour un PC UEFI, `-BIOS-img` pour un PC legacy) * 5. Confirmer avec `oui` au message d'avertissement (tout autre mot de réponse = annulation) * 6. Le poste se restaure puis **s'éteint tout seul** (`-p poweroff`) * Comment ça marche sous le capot : iPXE charge Clonezilla Live (kernel + squashfs en RAM via HTTP), Clonezilla monte le dépôt d'images par NFS, puis exécute `restore-by-disk.sh ` qui détecte le disque (`sda` → sous-dossier `sda/`, NVMe → sous-dossier `nvme/`) et lance `ocs-sr restoredisk`. ===== ## 2. Effacer un disque ===== Choisir **EFFACEMENT** dans le menu. Le script `effacement.sh` détecte le type de disque et adapte la méthode : | Disque | Outil | Méthode | |---|---|---| | HDD magnétique | `nwipe` | écriture de zéros | | SSD | `hdparm` | security-erase (+ dégel si disque *frozen*) | | NVMe | `nvme-cli` | `nvme format` (crypto-erase puis erase si non supporté) | Cas particulier SSD *frozen* : le script propose de mettre la machine en veille profonde pour débloquer la sécurité ATA ; à la sortie de veille, vérifier `not frozen` avant de continuer. ===== ## 3. Ajouter une image au serveur ===== ==== **Méthode A ==== — capturer depuis une machine modèle** (recommandé) : démarrer la machine modèle en PXE, mais démarrer Clonezilla manuellement (éditer la ligne `kernel` dans le menu avec l'option `ocs_live_run` vide ou démarrer en shell), puis créer l'image vers `/home/partimag/sda/` ou `nvme/` avec `ocs-sr`. Ou plus simple : faire l'image avec une clé USB Clonezilla Live, puis copier le dossier d'image dans le bon sous-dossier du serveur. === **Méthode B === — ajouter une entrée au menu** : éditer sur le serveur : sudo nano /var/www/html/boot.ipxe item Ma-Distrib-UEFI-img Ma distribution UEFI et s'assurer que le fichier image existe dans `/home/partimag/sda/` (ou `nvme/`). Le nom d'item (`Ma-Distrib-UEFI-img`) devient l'argument `${IMAGE}` passé au script. **Aucun service à redémarrer** : le fichier est relu à chaque boot client. ==== ## 4. Maintenance courante ==== **Voir les logs des clients** : sudo journalctl -u isc-dhcp-server -f # demandes DHCP en temps réel sudo tail -f /var/log/nginx/access.log # chargements kernel/squashfs **Espace disque des images** : df -h /home/partimag du -sh /home/partimag/sda/* /home/partimag/nvme/* **Redémarrer un service après modification** : sudo systemctl restart isc-dhcp-server # après modification de dhcpd.conf sudo exportfs -ra # après modification de /etc/exports sudo systemctl reload nginx # après modification de boot.ipxe (optionnel) **Sauvegarder la configuration du serveur** : sudo tar czf config-ipxe-$(date +%F).tgz \ /etc/dhcp/dhcpd.conf /etc/default/isc-dhcp-server \ /etc/default/tftpd-hpa /etc/exports \ /var/www/html/boot.ipxe /home/partimag/scripts/ ==== ## 5. Dépannage rapide ==== | Symptôme | Vérifier | |---|---| | Le client ne boot pas en PXE, pas d'IP | Câble sur le bon port ? DHCP actif ? `journalctl -u isc-dhcp-server -f` pendant un essai ; carte LAN bien en `192.168.100.1` | | Le client affiche "PXE-E53 / no boot filename" | `ipxe.efi` / `undionly.kpxe` présents dans `/srv/tftp/` et lisibles par l'utilisateur `tftp` | | Le menu iPXE ne s'affiche pas (bootloop) | Le DHCP renvoie bien `http://.../boot.ipxe` aux clients iPXE ? `curl http://192.168.100.1/boot.ipxe` depuis le serveur | | Le client bloque après le choix (chargement squashfs) | nginx opérationnel ? `curl -sI http://192.168.100.1/clonezilla/live/filesystem.squashfs` | | "Impossible de monter /home/partimag" chez le client | NFS exporté ? `showmount -e localhost` ; pare-feu sur 2049 ? | | Restauration échoue sur le choix du disque | Le script cherche `sda` ou `nvme0n1` — machine avec plusieurs disques ou contrôleur RAID à régler dans le BIOS | | Deux serveurs DHCP sur le même câble | ⚠️ **Ne jamais relier la carte LAN PXE au réseau Internet** : le DHCP du serveur attribuerait des IPs 192.168.100.x sur votre réseau principal | ==== ## 6. Sécurité et bonnes pratiques ==== - Le LAN de déploiement doit rester **isolé** : seule l'interface Internet (`eno1` sur l'ancien serveur) porte la route par défaut - Le menu d'effacement est volontairement dangereux : il ne devrait être utilisé qu'en présence d'un encadrant - Après chaque modification de `boot.ipxe` ou des scripts, tester sur **une machine cobaye** avant une session de clonage en salle - Conserver l'archive tar de configuration (§4.5) à jour après chaque changement Quelques pistes d'amélioration possibles pour la suite, si vous le souhaitez : ajouter un inventaire simple des restaurations effectuées (log côté serveur via les scripts), sécuriser l'accès SSH du serveur (ce qu'il a déjà activé), ou mettre en place une sauvegarde automatique de `/home/partimag` — les images représentent le vrai patrimoine de ce serveur, bien plus que sa configuration. Voulez-vous aussi une version imprimable (schéma + une page recto) pour l'atelier ?