Réinstallation du labo 504
L'école dispose de labos «stables» administrés par un technicien et sur lesquels nous n'avons pas la main. Ces labos sont très bien pour les cours de langages, d'analyse, ... mais pas pour des cours qui nécessitent les privilèges de «root» tels que des cours d'administration des réseaux par exemple. Pour ces cours, puisqu'il y a un risque que la machine devienne instable suite à une mauvaise manip, il faut qu'un prof se charge de maintenir la stabilité minimale du réseau ... c'est moi qui m'y colle pour le labo 504.
L'an dernier, on avait choisi de répliquer une machine sur les autres et un pote s'était chargé du boulot. Aujourd'hui, on va s'y prendre un peu différemment ...
Contraintes
- Il faut que tous les étudiants aient les privilèges de root / Administrateur.
- Les machines doivent être multiboot MS Windows / linux afin de répondre aux besoins de plusieurs cours.
- Une machine rendue instable par une mauvaise manip doit être rapidement réinstallée.
- (C'est bien de facilement obtenir des machines toutes nues à la veille des examens par exemple)
Jadis, la solution retenue consistait à passer sur les machines avec un Live CD et une image sur une clé USB ... mais booter sur un CD, ça prend du temps et seul le détenteur du CD et de l'image peut réinstaller. À l'ère des réseaux, c'est moche.
L'an dernier la réplication, mise en place avec Antoine et bien que rapide, ne m'a pas permis de réinstaller en cours d'année. Cette année, l'idée est d'obtenir au boot de la machine un menu permettant de choisir
- de booter MS Windows
- de booter linux
- de réinstaller complètement la machine (avec son IP et son nom en fonction de sa position dans le local; je sais que la machine orval [1] se trouve physiquement à tel endroit)
- de réinstaller soit linux, soit MS Windows
let's go !
Les machines sont capables de booter sur le réseau. Comme le BIOS PXE ne connait pas grand chose au départ, il faut l'informer.
- c'est un serveur DHCP qui se charge de donner une IP et un nom au client
apt-get install ics-dhcp-serveur
Il suffit de configurer dhcp pour qu'il attribue la « bonne » IP à la « bonne » machine ... ce qui nécessite de relever les MAC adresses des machines et d'ajouter, outre le range IP, des lignes du style dans le fichier de conf /etc/dhcp/dhcpd.conf
[2]
host orval { option send-host orval; hardware ethernet 2c:27:d7:2e:20:29; fixed-address 192.168.210.4; }
- lorsque le client reçoit une IP, il a besoin de télécharger un OS sur lequel booter. Il utilise, pour ce faire, un serveur tftp
- ce serveur tftp met à disposition pxelinux, un petit soft dérivant de linux et ayant la capacité de booter sur le réseau. pxelinux peut proposer un menu permettant de choisir l'action suivante.
apt-get install atftp
atftp ne faisant pas le boulot pour d'obscures raisons, nous le remplaçons rapidement par son copain tftpd-hpa
dhcp doit dire au client qu'il est prié de télécharger /srv/tftp/pxelinux.o
afin de l'exécuter. On ajoute au fichier /etc/dhcp/dhcpd.conf
next-server 192.168.210.1; filename "pxelinux.0";
À ce fichier, est associé le menu qui sera présenté à l'utilisateur (/srv/tftp/pxelinux.cfg/default
). Menu à adapter à ses besoins.
- ce menu propose
- de booter sur le disque local en MS Windows ou en linux
- de réinstaller tout ou partie du disque
Le menu a l'allure suivante ...
DEFAULT vesamenu.c32 menuconf/design.conf ~ TIMEOUT 50 MENU TITLE Labo 504 MENU AUTOBOOT Starting Windows System in # seconds LABEL - MENU LABEL Local boot MENU DISABLE TOTALTIMEOUT 9000 TIMEOUT 9000 LABEL bootlocal-win MENU LABEL ^Windows 7 KERNEL chain.c32 APPEND hd0 0 MENU INDENT 1 LABEL bootlocal-debian MENU LABEL ^Debian KERNEL chain.c32 APPEND hd0 MENU INDENT 1 MENU DEFAULT ...
- pour réinstaller, nous utilisons partimage ... qui a besoin d'une machine linux opérationelle
apt-get install debootstrap apt-get install nfs-kernel-server
Nous créons une machine linux qui se trouvera sur le serveur et sera proposée aux clients via nfs. Le client la boote et le dernier script de boot sera un script perso permettant la réinstallation à grands coups de dd et de partimage.
debootstrap est un outil qui permet d'installer un système debian de base dans le sous-répertoire d'un autre système déjà existant. Il n'a pas besoin d'un CD d'installation, juste d'un accès à un dépôt debian
Extrait de Wiki debian
En quelques commandes , ça donne;
mkdir /srv/pxelinux debootstrap wheezy /srv/pxelinux http://ftp.us.debian.org/debian mount /dev /srv/pxelinux/dev -o bind mount /proc /srv/pxelinux/proc -o bind mount /sys /srv/pxelinux/sys -o bind chroot /sys/pxelinux apt-get install «kernel»
Modifier le fichier /etc/initramfs
en y remplaçant MODULE=netboot
et exécuter un update-initramfs -u -k all
afin de mettre à jour le fichier initrd
.
Le fichier /etc/fstab
a, quant à lui, l'allure suivante,
proc /proc proc defaults 0 0 192.168.210.1:/srv/pxelinux / nfs defaults 0 0 192.168.210.1:/var/images /var/images nfs defaults 0 0 tmpfs /var/lib/dhcp tmpfs defaults,size=10M 0 0 tmpfs /var/run tmpfs defaults,size=10M 0 0
Ligne par ligne;
proc
comme d'habitude,/
est un partage nfs (que l'on vient de créer),/var/images
car c'est là que se trouveront les images de nos partitions,/var/lib/dhcp
car c'est là que se trouvent les leases de dhcp et ils risquent de poser problème lorsque plusieurs machines bootent sur le réseau, et/var/run
pour la même raison
Il reste a créer les images dans /var/images
, copier le mbr, créer le script et tester le tout
partimage -z1 -o -d save /dev/sda3 /var/images/linux-sda3.img partimage -z1 -o -d save /dev/sda2 /var/images/windows-sda2.img dd if=/dev/sda of=/var/images/mbr bs=512 count=1
Le script est lancé en fin de séquence de boot par le biais du fichier /etc/inittab
. Le script a l'allure suivante
#!/bin/bash case "$1" in LINUX) echo "reinstall linux"; /usr/sbin/partimage -b restore /dev/sda3 /var/images/ \ linux-sda3.img.000 /sbin/mkswap /dev/sda4 /bin/mount -t ext4 /dev/sda3 /mnt echo `hostname` > /mnt/etc/hostname /bin/umount /mnt ;; WINDOWS) echo "reinstall windows"; /bin/dd if=/var/images/windows-sda1.img of=/dev/sda1 /usr/sbin/partimage -b restore /dev/sda2 /var/images/ \ windows-sda2.img.000 ;; MBR) echo "reinstall all"; /bin/dd if=/var/images/mbr of=/dev/sda /sbin/sfdisk -R /dev/sda /bin/dd if=/var/images/windows-sda1.img of=/dev/sda1 /usr/sbin/partimage -b restore /dev/sda2 /var/images/ \ windows-sda2.img.000 /usr/sbin/partimage -b restore /dev/sda3 /var/images/ \ linux-sda3.img.000 /sbin/mkswap /dev/sda4 /bin/mount -t ext4 /dev/sda3 /mnt echo `hostname` > /mnt/etc/hostname /bin/umount /mnt ;; esac /sbin/halt
À ce stade, tout est mis en place et tout devrait fonctionner ...