====== Un serveur PXE pour une installation automatisée par le réseau ====== ''PXE'' est une option d'amorçage permettant à un ordinateur de charger son système d'exploitation à partir du réseau (Les autres options d'amorçage sont le disque dur ou un média CD/DVD ou USB). Le système d'exploitation est délivré par un serveur ''PXE''. Cette technique peut être utilisée pour amorcer l'installation simultanée d'un grand nombre de stations à partir d'un média unique (Le serveur ''PXE''). Elle peut également être utilisée pour amorcer des clients légers (des ordinateurs sans disque dur) Cette page documente la mise en place d'un serveur ''PXE'' dans le but d'une installation de système d'exploitation par le réseau. La gestion de clients léger fera l'objet d'un autre document. ===== Préparation de l'environnement ===== Le serveur ''PXE'' sera installé sur une machine virtuelle. La procédure de création d'une machine virtuelle est détaillée sur [[virtualiser_avec_kvm|Virtualiser un système]]. ==== Sur l'hôte ==== La machine virtuelle sera nommée ici ''pxe-server'' et hébergera un serveur ''DHCP'' et ''TFTP''. Sur l'hôte on crée un bridge réseau ''pxe-br0'' sur lequel vont se brancher les machines virtuelles concernées par cette procédure créant ainsi un réseau virtuel. La création du bridge réseau se fait avec la commande : sudo brctl addbr pxe-br0 On attribute une addresse **IP** au bridge avec : sudo ip a add 192.168.111.1/24 dev pxe-br0 On édite la définition de la machine ''pxe-server'' pour ajouter une nouvelle interface réseau connectée au bridge qu'on vient de créer : (La modification de la définition d'une machine virtuelle est documentée ici: [[virtualiser_avec_kvm#configurer_les_guests|Virtualiser un système]]) Les machines connectées à ce birdge ne peuvent accéder à internet que si le système hôte permet la redirection du traffic. On peut s'en assurer avec la commande suivante sur le système hôte : echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward Le système hôte doit également pouvoir effectuer une traduction (NAT) des paquets émanants du réseau virtuel. La commande suivante exécutée sur l'hôte active cette fonctionnalité. sudo iptables -t nat -A POSTROUTING -s 192.168.111.0/24 ! -d 192.168.111.0/24 -j MASQUERADE ==== Sur la VM ==== La VM ''pxe-server'' sera maintenant dotée d'une nouvelle interface réseau qu'il faudra paramétrer en IP static dans le réseau 192.168.111.0/24. On donnera au serveur une adresse ''192.168.111.2'' grâce à la configuration suivante dans ''/etc/network/interface''. auto ens10 iface ens10 inet static address 192.168.111.2 netmask 255.255.255.0 gateway 192.168.111.1 === Paramétrage du serveur 'DHCP' === Le serveur ''DHCP'' s'installe avec la commande suivante : sudo apt-get install isc-dhcp-server Le serveur ''DHCP'' échouera probablement lors de son premier lancement. Nous devons l'informer de l'interface réseau sur laquelle il écoutera les requêtes DHCP. Cette configuration se fait dans le fichier ''/etc/default/isc-dhcp-server'' en indiquant le nom de l'interface à ''INTERFACESv4''. INTERFACESv4="ens10" Vient ensuite la configuration du réseau que le serveur ''DHCP'' gérera. La configuration de ''isc-dhcp-server'' se fait dans le fichier ''/etc/dhcp/dhcpd.conf''. Le bloc de configuration suivant déclare un sous réseau et fournit aux clients dhcp des informations de paramétrages supplémentaires. subnet 192.168.111.0 netmask 255.255.255.0 { // le subnet range dynamic-bootp 192.168.111.5 192.168.111.100; // portée des adresses distribuées authoritative; allow unknown-clients; option domain-name-servers 8.8.8.8, 8.8.4.4; option routers 192.168.111.1; // adresse du routeur ici la machine hôte option subnet-mask 255.255.255.0; option broadcast-address 192.168.111.255; next-server 192.168.111.2; // L'adresse du serveur TFTP (cette même machine) filename "pxelinux.0"; // le chemin au fichier d'amorçage de l'installation // réseau default-lease-time 21600; max-lease-time 43200 ; } Si la configuration est correcte la commande suivante ne devrait pas retourner d'erreurs. sudo systemctl restart isc-dhcp-server Le serveur ''DHCP'' sert à connecter les clients au réseau en leur attribuant une adresse ''IP''. Le serveur ''DHCP'' sert également à fournir aux clients qui souhaitent faire un démarrage par le réseau des informations sur l'emplacement du fichier d'amorçage. Le fichier d'amorçage doit être servi par un serveur ''tftp'' === Paramétrage du serveur 'TFTP' === Sur la même machine ''pxe-server'' on installe le serveur ''tftp'' avec la commande suivante : sudo apt-get install tftp tftpd-hpa La configuration du serveur ''tftp'' se fait dans le fichier ''/etc/default/tftpd-hpa''. La directive ''TFTP_DIRECTORY'' indique où doit se trouver le contenu que ''tftpd'' servira. TFTP_DIRECTORY="/srv/tftp" TFTP_ADDRESS=":69" TFTP_OPTIONS="--secure --create --listen --verbose" Le dossier ''/srv/tftp'' doit être accessible sans droits d'utilisations spécifiques. sudo chmod -R 777 /srv/tftp sudo chown -R nobody:nogroup /srv/tftp Le démarrage du serveur ''tftp'' ne doit pas générer d'erreurs. sudo systemctl restart tftpd-hpa === Récupération et mise en place de l'image d'amorçage === Une image d'amorçage est disponible au téléchargement sur les serveurs de la distribution debian. wget "http://ftp.debian.org/debian/dists/buster/main/installer-amd64/current/images/netboot/netboot.tar.gz" L'archive sera décompressée dans le dossier servi par le serveur tftp avec la commande suivante : tar xzf netboot.tar.gz -C /srv/tftp Le contenu du dossier devrait ressemblera à ça : $ ll /srv/tftp total 8,0K drwxrwxr-x 3 nobody nogroup 4,0K nov. 7 12:10 debian-installer lrwxrwxrwx 1 nobody nogroup 47 nov. 7 12:10 ldlinux.c32 -> debian-installer/amd64/boot-screens/ldlinux.c32 lrwxrwxrwx 1 nobody nogroup 33 nov. 7 12:10 pxelinux.0 -> debian-installer/amd64/pxelinux.0 lrwxrwxrwx 1 nobody nogroup 35 nov. 7 12:10 pxelinux.cfg -> debian-installer/amd64/pxelinux.cfg -rw-rw-r-- 1 nobody nogroup 62 nov. 7 12:10 version.info ===== Installation par le réseau ===== L'installation par réseau peut être testée avec une machine virtuelle avec la commande suivante : sudo virt-install \ --pxe \ --disk size=8,device=disk,bus=virtio \ --virt-type kvm \ --os-type linux \ --name=guest \ --ram=512 \ --vcpus=1 \ --os-variant generic \ --graphics=vnc \ --network=bridge:pxe-br0 ===== Automatiser l'installation avec un 'preseed.cfg' ===== Un fichier ''preseed.cfg'' est une fichier de préconfiguration qui permet une installation automatisée du système d'exploitation. (voir [[preseed_debian_install|ici]]) On peut modifier le comportement de l'installateur en lui fournissant le chemin du fichier de préconfiguration à charger. Un fichier ''preseed.cfg'' est placé dans le dossier du serveur ''tftp'' On modifie le fichier ''/srv/tftp/debian-installer/amd64/boot-screens/txt.cfg'' en passant les paramètres supplémentaires suivants au kernel : auto=true priority=critical url=tftp://192.168.111.2/preseed.cfg Ce qui donnera un fichier ''txt.cfg'' qui ressemblera à ça : default install label install menu label ^Install kernel debian-installer/amd64/linux append auto=true priority=critical url=tftp://192.168.111.2/preseed.cfg \ vga=788 initrd=debian-installer/amd64/initrd.gz --- quiet La confirmation du début de l'installation peut également être rendue automatique en modifiant le temps d'attente au premier écran avec la commande suivante : sed -i 's/^timeout.*$/timeout 1/' \ /srv/tftp/debian-installer/amd64/boot-screens/{syslinux.cfg,prompt.cfg} Un exemple de fichier ''preseed.cfg'' orienté installation réseau ressemblerait à ce qui suit : # do we need to use mirror d-i apt-setup/use_mirror boolean true apt-mirror-setup apt-setup/no_mirror boolean false d-i partman/early_command string debconf-set grub-installer/bootdev "$(list-devices disk | head -n1)" # if we need mirror d-i mirror/protocol string http d-i mirror/country string manual d-i mirror/http/hostname string deb.debian.org d-i mirror/http/directory string /debian d-i mirror/http/proxy string d-i mirror/suite string stretch d-i mirror/udeb/suite string stretch # localization d-i debian-installer/locale string fr_FR d-i keyboard-configuration/xkb-keymap select fr(latin9) # hostname/domain, network interface d-i netcfg/choose_interface select auto d-i netcfg/link_wait_timeout string 5 d-i netcfg/get_hostname string dinopc d-i netcfg/hostname string dinopc d-i netcfg/get_domain string d-i netcfg/get_nameservers string d-i netcfg/wireless_wep string d-i hw-detect/load_firmware boolean true # accounts d-i passwd/root-login boolean false d-i passwd/user-fullname string dino d-i passwd/username string dino d-i passwd/user-password password dingo d-i passwd/user-password-again password dingo # time d-i clock-setup/utc boolean true d-i time/zone string Africa/Algiers d-i clock-setup/ntp boolean true # partitioning d-i partman-auto/init_automatically_partition select biggest_free d-i partman-auto/method string regular d-i partman-lvm/device_remove_lvm boolean true d-i partman-md/device_remove_md boolean true d-i partman-auto/choose_recipe select atomic d-i partman-partitioning/confirm_write_new_label boolean true d-i partman/choose_partition select finish d-i partman/confirm boolean true d-i partman/confirm_nooverwrite boolean true d-i partman-md/confirm boolean true d-i partman-partitioning/confirm_write_new_label boolean true d-i partman/choose_partition select finish d-i partman/confirm boolean true d-i partman/confirm_nooverwrite boolean true d-i partman/mount_style select uuid #apt settings d-i base-installer/install-recommends boolean true d-i apt-setup/non-free boolean true d-i apt-setup/contrib boolean true d-i apt-setup/services-select multiselect security, updates d-i apt-setup/security_host string security.debian.org d-i debian-installer/allow_unauthenticated boolean true apt-cdrom-setup apt-setup/cdrom/set-double boolean false apt-cdrom-setup apt-setup/cdrom/set-first boolean false apt-cdrom-setup apt-setup/cdrom/set-next boolean false # packages to install tasksel tasksel/first multiselect standard d-i pkgsel/include string d-i pkgsel/upgrade select none popularity-contest popularity-contest/participate boolean false # boot loader d-i grub-installer/only_debian boolean true d-i grub-installer/with_other_os boolean true # late install commands d-i preseed/late_command string \ in-target adduser sysadm --disabled-password --shell /bin/bash --home /var/sysadm --gecos ""; \ true; # reboot d-i finish-install/reboot_in_progress note