orvalalacolonne.png

Une p'tite Orval à «La Colonne» avant de commencer ...

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 ...

Liens

Notes

[1] Oui, mes machines portent des noms de bières

[2] Oui, aujourd'hui, c'est sponsorisé par Orval