Accueil

Installation de Slackware par PXE

Par yttrium.

Sommaire

Qu'est-ce que PXE ?

PXE signifie en anglais Pre-boot eXecution Environment soit en français environnement d'exécution de pré-amorçage. C'est un protocole propriétaire qui a été crée par IBM et fait partie de la norme WfM (Wired for Management) développée par Intel. La majorité des sociétés incluent la prise en charge de ce protocole dans leurs cartes réseau et dans le BIOS de leur carte mère.

La carte réseau possède une PROM (Programmable Read Only Memory) sur laquelle la machine va démarrer. Cette PROM contient des instructions qui permettent d'exécuter une image de système d'exploitation placée sur un serveur. Cela permet notamment à la machine qui a démarré en PXE d'installer sur son disque dur le système d'exploitation qu'elle a reçu par le réseau

Comment est-ce que ça fonctionne ?

Il faut au préalable configurer le BIOS pour activer la fonctionnalité de démarrage par PXE en priorité, c'est à dire, avant le démarrage par boot du disque dur ou par un autre média.

Le boot par PXE s'articule en plusieurs étapes exécutées par la PROM de la carte réseau :

Pré-requis

Du côté client, il vous faut :

Du côté serveur, il vous faut (tout est inclus dans votre distribution Slackware) :

Informations importantes

Dans ce tutoriel, nous allons apprendre à configurer un serveur DHCP, TFTP et NFS sur une Slackware 12.0.

Je vais utiliser une configuration réseau propre à l'objectif de ce tutoriel. Il sera nécessaire de modifier de votre côté les valeurs présentées ici afin que cela fonctionne chez vous.

Je vais utiliser la plage réseau 192.168.16.0 à 192.168.16.254 avec un masque 255.255.255.0 que l'on pourra noter 192.168.16.0/24.

Le serveur réseau portera l'adresse IP 192.168.16.1 et la passerelle sera également notre serveur.

Le service DHCP attribuera des adresses sur la plage 192.168.16.5 à 192.168.16.20.

Le nom de domaine sera example.net.

Le serveur héberge tous les services pré-cités ainsi que BIND, le serveur de noms de domaines.

La racine du répertoire contenant les paquets Slackware est stockée sur /usr/local/Slackware12.0.

La racine du répertoire contenant les fichiers de boot pour le serveur TFTP est située sur /tftpboot/Slackware12.0.

Configurer le serveur DHCP

Vous utilisez probablement un serveur DHCP basique placé sur votre routeur internet, il est nécessaire de le désactiver pour que vous puissiez utiliser celui de Slackware qui inclus beaucoup plus de fonctionnalités.

Votre distribution Slackware inclut le paquet ISC DHCP appelé également démon dhcpd.

Afin de pouvoir monter un serveur PXE bien configuré, il est nécessaire de travailler sur le fichier /etc/dhcpd.conf qui permet de définir de manière très fine les actions à exécuter auprès des clients de votre réseau.

Par défaut, il n'est pas possible d'allouer automatiquement un démarrage par le réseau, et heureusement, parce que n'importe quel ordinateur pourrait exécuter l'installation de Slackware !!

Dans le fichier de configuration /etc/dhcpd.conf, nous allons ajouter une section globale dans laquelle on pourra définir quels sont les ordinateurs qui pourront démarrer par le réseau.

Typiquement, dans la section globale, on rajoutera ce type de lignes pour chaque hôte habilité à booter par le réseau :

host torngat {
    hardware ethernet 00:15:56:D8:80:B5;
    fixed-address 192.168.16.21;
}

Dans la section hôte torngat, on définit un ordinateur client du même nom, son adresse MAC est 00:15:56:D8:80:B5 et nous lui assignons automatiquement l'adresse IP 192.168.16.21.

Les sections hôtes sont regroupées dans la section globale suivante :

group {
  # boot PXE
  allow bootp;
  next-server 192.168.16.1;
  use-host-decl-names on;
  if substring (option vendor-class-identifier, 0, 9) = "PXEClient" {
    filename "/Slackware12.0/pxelinux.0";
  }

  host A {
    #code
  }

  host Z {
    #code
  }
}

Le code ci-dessus permet au serveur DHCP d'identifier les clients qui ont besoin de booter par le réseau en utilisant PXE. Il est alors en mesure de leur distribuer le fichier de boot PXElinux stocké dans /Slackware12.0/pxelinux.0. Le fonctionnement du fichier de boot est expliqué plus loin dans ce tutoriel.

Le paramètre next-server contient l'adresse IP du serveur TFTP. La plupart du temps, le serveur TFTP et le serveur DHCP sont installés sur la même machine. Il est très important de définir l'adresse du serveur TFTP sur Slackware 12.0, que celui-ci soit sur la même machine ou non, sinon l'adresse IP retournée sera vide et interdira au client PXE de récupérer le fichier de démarrage puisqu'il n'aura pas connaissance de l'adresse IP correcte !

Le paramètre use-host-decl-names on; dit que pour chaque client définit dans la section globale, le nom d'hôte attribué deviendra son nom d'hôte sur le réseau. Pour être plus clair, voici un exemple concret du paramètre use-host-decl-names :

group {
  use-host-decl-names on;

  host tsointsoin {
    hardware-ethernet 05:01:30:4c:28:45;
    fixed-address 192.168.16.5;
  }
}

Le code ci-dessus correspond à :

  host tsointsoin {
    hardware-ethernet 05:01:30:4c:28:45;
    fixed-address 192.168.16.5;
    option host-name "tsointsoin";
  }

Astuce pour trouver une adresse MAC rapidement

Pour trouver rapidement une adresse MAC, il suffit d'envoyer un ping à une machine puis de lancer la commande arp :

ping 192.168.16.3
arp

Voici ce qui est affiché lorsque l'on lance la commande arp :

Address                  HWtype  HWaddress           Flags Mask            Iface
win98.example.net        ether   00:12:C5:04:43:9E   C                     eth0

Il suffit alors de récupérer le champ HWaddress manuellement ou par un script pour compléter le fichier /etc/dhcpd.conf.

Configurer le serveur TFTP

Le daemon tftpd est géré par inetd. Il faut décommenter la ligne tftpd dans le fichier /etc/inetd.conf :

tftp  dgram   udp     wait    root    /usr/sbin/in.tftpd  in.tftpd -s /tftpboot -r blksize

Il faut ensuite demander au démon inetd de recharger le fichier de configuration en lui envoyant le signal HUP avec la commande sudo :

sudo killall -HUP inetd

Si sudo n'est pas configuré sur votre ordinateur, il faut vous connecter en tant que root dans un terminal :

$ su
# killall -HUP inetd

Il est nécessaire ensuite de créer le répertoire tftpboot à la racine du système :

sudo mkdir /tftpboot

Ce répertoire est la racine d'un chroot qui est exécuté par le paramètre -s /tftpboot dans le fichier /etc/inetd.conf. Pour information, un chroot est un bac à sable dans lequel est exécuté un processus, mais attention c'est un genre de vserver énormément moins sécurisé.

Le daemon tftpd est configuré et opérationnel, il faut maintenant peupler le répertoire /tftpboot, ce que j'expliquerai plus loin dans le tutoriel.

Configurer le serveur NFS

Si ce n'est pas déjà fait, pour que NFS puisse fonctionner il faut installer sur votre Slackware 12.0 les paquets nfs-utils-1.1.0-i486-2.tgz et portmap-6.0-i486-1.tgz. Il faut ensuite configurer les fichiers /etc/exports, /etc/hosts.deny et /etc/hosts.allow.

Le fichier /etc/exports est structuré comme ceci :

nom_du_dossier_partagé hôte(options)

nom_du_dossier_partagé correspond au chemin du dossier partagé.

hôte correspond à l'hôte qui peut accéder au partage, il peut être défini de plusieurs manières :

Les options correspondent aux options de partage, voici les plus importantes :

A noter : l'utilisateur anonyme s'appelle nobody et porte l'UID et le GID 99 par défaut.

Voici un exemple de fichier /etc/exports qui donne accès à notre client aux paquets Slackware :

# See exports(5) for a description.
# This file contains a list of all directories exported to other computers.
# It is used by rpc.nfsd and rpc.mountd.

/usr/local/Slackware12.0    192.168.16.0/24(ro,all_squash,anonuid=5000,anongid=5000,sync)

ATTENTION : Le répertoire /usr/local/Slackware12.0 doit être le mirroir du site officiel pour que l'installation de Slackware puisse se faire correctement.

Nous allons configurer le fichier /etc/hosts.deny pour interdir par défaut l'utilisation à tout le monde de NFS :

#
# hosts.deny    This file describes the names of the hosts which are
#               *not* allowed to use the local INET services, as decided
#               by the '/usr/sbin/tcpd' server.
#
# Version:      @(#)/etc/hosts.deny     1.00    05/28/93
#
# Author:       Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org
#
#
portmap:ALL
lockd:ALL
mountd:ALL
rquotad:ALL
statd:ALL

# End of hosts.deny.

Nous allons configurer le fichier /etc/hosts.allow pour autoriser l'utilisation de NFS sur notre réseau :

#
# hosts.allow   This file describes the names of the hosts which are
#               allowed to use the local INET services, as decided by
#               the '/usr/sbin/tcpd' server.
#
# Version:      @(#)/etc/hosts.allow    1.00    05/28/93
#
# Author:       Fred N. van Kempen, <waltje@uwalt.nl.mugnet.org
#
#
portmap:192.168.16.0/24
lockd:192.168.16.0/24
mountd:192.168.16.0/24
rquotad:192.168.16.0/24
statd:192.168.16.0/24

# End of hosts.allow.

On rend exécutable le script de démarrage de NFS pour le système seulement par la commande suivante :

chmod 700 /etc/rc.d/rc.nfsd

On lance le démon nfsd en root :

/etc/rc.d/rc.nfsd start

Pour aller plus loin dans la configuration de NFS, je vous invite à vous rendre sur le linux NFS-HOWTO officiel.

Configurer PXELinux

PXELinux est comparable au bootloader isolinux de Slackware qui est utilisé par le CD-ROM d'installation de Slackware 12.0. Nous allons utiliser le fichier de configuration isolinux.cfg ainsi que le fichier image initrd.img qui sont utilisés pour créer le CD-ROM de Slackware et nous allons les transformer pour les rendre utilisables par un pxelinux bootable.

Peuplement du répertoire /tftpboot

Le fichier /Slackware12.0/pxelinux.0 est distribué par le serveur DHCP aux ordinateurs clients qui sont configurés pour booter sur le réseau. Ce fichier contient le code exécutable qui télécharge et installe un noyau linux puis télécharge et extrait le système de fichiers contenant le programme d'installation et de configuration de la Slackware 12.

Le fichier /Slackware12.0/pxelinux.0 est un chemin relatif assigné au serveur TFTP. Le client PXE va utiliser le protocole TFTP pour charger en mémoire ce fichier de démarrage. Nous allons donc créer le répertoire Slackware12.0 et copier les fichiers requit à l'intérieur de celui-ci :

mkdir /tftpboot/Slackware12.0
mkdir /tftpboot/Slackware12.0/pxelinux.cfg
cp /usr/lib/syslinux/pxelinux.0 /tftpboot/Slackware12.0/

Nous allons aussi avoir besoin des fichiers provenant du CD-ROM qui affichent des informations à l'écran lors du démarrage de l'installation. Ces fichiers doivent normalement être présents dans votre mirroir /usr/local/Slackware12.0 :

cp /usr/local/Slackware12.0/isolinux/message.txt /tftpboot/Slackware12.0/
cp /usr/local/Slackware12.0/isolinux/f2.txt /tftpboot/Slackware12.0/

Nous allons également avoir besoin des noyaux que vous pourrez choisir lors du démarrage de l'installation :

cp -a /usr/local/Slackware12.0/kernels/ /tftpboot/Slackware12.0/

Création du fichier initrd.img

L'installation habituelle de Slackware depuis un serveur NFS, consiste à démarrer depuis le CD-ROM, de choisir le pilote approprié pour la carte réseau avant de pouvoir lancer l'installation des paquets via le serveur NFS.
Dans notre cas, il n'y a pas de CD-ROM puisque nous démarrons par le réseau. Nous allons donc installer tous les pilotes dont nous avons besoin dans le système de fichiers que le fichier de démarrage PXElinux téléchargera depuis le serveur TFTP.

Nous allons créer le fichier initrd.img depuis le mirroir /usr/local/Slackware12.0 contenant tous les fichiers indispensables.

On crée un répertoire temporaire de travail :

mkdir -p /tmp/img

On extrait l'image contenant le système de fichiers depuis le fichier compressé initrd.img :

gunzip -cd /usr/local/Slackware12.0/isolinux/initrd.img > /tmp/img/initrd.dsk

On monte l'initrd sur le loopback dans notre répertoire temporaire :

cd /tmp/img
mkdir initrd
mount -o loop,ro initrd.dsk initrd/

On monte le pcmcia et le network sur le loopack dans notre répertoire temporaire :

mkdir pcmcia
mount -o loop,ro /usr/local/Slackware12.0/isolinux/pcmcia.dsk pcmcia/
mkdir network
mount -o loop,ro /usr/local/Slackware12.0/isolinux/network.dsk network/

On va utiliser la commande dd pour créer un fichier suffisamment grand appelé newinitrd. Ce fichier est destiné à recevoir un système de fichiers qui contient l'image de Slackware que nous venons de monter en loopback. On va créer un fichier d'une taille de 30Mo composé de blocs de 1Ko :

dd if=/dev/zero of=/tmp/img/newinitrd bs=1k count=30000

En ajoutant la taille des fichiers initrd.dsk, network.dsk et pcmcia.dsk, on obtient la somme de 29840Ko soit 29Mo, j'ai donc arrondi à la taille au-dessus pour être sûr que notre fichier soit assez grand pour contenir les données. On va créer un système de fichiers à l'intérieur de ce newinitrd en indiquant à mkfs que ce n'est pas un périphérique de type bloc et on va demander à fsck de ne jamais contrôler ce système de fichiers :

mkfs.ext2 -m 0 -F /tmp/img/newinitrd
tune2fs -i 0 /tmp/img/newinitrd

On va maintenant monter ce système de fichiers sur le loobpack :

mkdir -p /tmp/img/up/
mount -o loop /tmp/img/newinitrd /tmp/img/up/

On va copier l'intégralité des trois disques Slackware dans le nouveau fichier :

cp -a /tmp/img/initrd/* /tmp/img/up/
cp -a /tmp/img/network/* /tmp/img/up/
cp -a /tmp/img/pcmcia/* /tmp/img/up/

On va créer un fichier script appelé network qui servira à lancer le script de détection de cartes réseaux :

vi network

Voici le code à recopier en intégralité dans le fichier network :

#!/bin/sh
# This script configures support for ethernet cards needed during
# installation for an NFS install.
#
# Normally this automatically loads an image from the ISO, and if
# it cannot be found tries to load a floppy disk.
#
# You may also give a path to the network.dsk image, like this:
# network /some/exact/path/network.dsk
#

echo
echo "Network support for NFS install, 23-Sep-2004 volkerdi@slackware.com"
echo

# Now, let's call the network.sh script to actually do most of the work:

if [ -r /scripts/network.sh ]; then
  sh /scripts/network.sh
fi

echo
echo "The next step in your installation may be partitioning your hard drive"
echo "(if you're installing to a Linux partition) with 'fdisk' or 'cfdisk'"
echo "(the menu-driven version of fdisk).  If you already have a partition"
echo "prepared for Linux, run 'setup' to start the installer program."
echo

On copie le fichier network dans le nouveau système de fichiers :

cat network > /tmp/img/up/bin/network

On va créer un fichier script appelé pcmcia qui servira à initialiser votre carte pcmcia si nécessaire :

vi pcmcia

Voici le code à recopier en intégralité dans le fichier pcmcia :

#!/bin/sh
# This script configures support for PCMCIA and/or Cardbus cards needed during
# installation, such as a CD-ROM drive or an ethernet card used for an NFS
# install.

echo
echo "PCMCIA/Cardbus support script, 2003-02-18 volkerdi@slackware.com"
echo

# OK, here goes nothing:
/scripts/rc.pcmcia start

echo
echo
echo "The PCMCIA/Cardbus subsystem is now installed.  Please make sure that"
echo "all of the cards you'll need for the installation are in the machine."
echo "If you still need to insert any PCMCIA/Cardbus cards, do that now.  Once"
echo "the drive stops (indicating that all needed modules have been"
echo -n "loaded), then press [enter] to continue."
read inputjunk
echo

echo
echo "The next step in your installation may be partitioning your hard drive"
echo "(if you're installing to a Linux partition) with 'fdisk' or 'cfdisk'"
echo "(the menu-driven version of fdisk).  If you already have a partition"
echo "prepared for Linux, run 'setup' to start the installer program."
echo

On copie le fichier pcmcia dans le nouveau système de fichiers :

cat pcmcia > /tmp/img/up/bin/pcmcia

On va créer un fichier script appelé network.sh qui servira à détecter votre carte réseau :

vi network.sh

Voici le code à recopier en intégralité dans le fichier network.sh :

#!/bin/sh

# Remove extra whitespace
crunch() {
  while read line ; do
    echo $line
  done
}

echo
echo "******* Welcome to the network supplemental disk! *******"
echo

# main loop:
while [ 0 ]; do

echo "-- Press [enter] to automatically probe for all network cards, or switch"
echo "   to a different console and use 'modprobe' to load the modules manually."
echo "-- To skip probing some modules (in case of hangs), enter them after an S:"
echo "   S eepro100 ne2k-pci"
echo "-- To probe only certain modules, enter them after a P like this:"
echo "   P 3c503 3c505 3c507"
echo "-- To get a list of network modules, enter an L."
echo "-- To skip the automatic probe entirely, enter a Q now."
echo

# Clear "card found" flag:
rm -f /cardfound

echo -n "network> "
read INPUT;
echo

if [ "`echo $INPUT | crunch | cut -f 1 -d ' '`" = "L" \
     -o "`echo $INPUT | crunch | cut -f 1 -d ' '`" = "l" ]; then
  echo "Available network modules:"
  for file in /lib/modules/`uname -r`/kernel/drivers/net/* /lib/modules/`uname -r`/kernel/arch/i386/kernel/* /lib/modules/`uname -r`/kernel/drivers/pnp/* ; do
    if [ -r $file ]; then
      OUTPUT=`basename $file .gz`
      OUTPUT=`basename $OUTPUT .o`
      echo -n "$OUTPUT "
    fi
  done
  echo
  echo
  continue
fi

if [ ! "$INPUT" = "q" -a ! "$INPUT" = "Q"  \
     -a ! "`echo $INPUT | crunch | cut -f 1 -d ' '`" = "P" \
     -a ! "`echo $INPUT | crunch | cut -f 1 -d ' '`" = "p" ]; then
  echo "Probing for PCI/EISA network cards:"
  for card in \
    3c59x acenic de4x5 dgrs eepro100 e1000 epic100 hp100 ne2k-pci olympic pcnet32 rcpci 8139too 8139cp sktr tulip via-rhine yellowfin tg3 dl2k ns83820 \
    ; do
    SKIP=""
    if [ "`echo $INPUT | crunch | cut -f 1 -d ' '`" = "S" \
         -o "`echo $INPUT | crunch | cut -f 1 -d ' '`" = "s" ]; then
      for nogood in `echo $INPUT | crunch | cut -f 2- -d ' '` ; do
        if [ "$card" = "$nogood" ]; then
          SKIP=$card
        fi
      done
    fi
    if [ "$SKIP" = "" ]; then
      echo "Probing for card using the $card module..."
      modprobe $card 2> /dev/null
      grep -q eth0 /proc/net/dev
      if [ $? = 0 ]; then
        echo
        echo "SUCCESS: found card using $card protocol -- modules loaded."
        echo "$card" > /cardfound
        echo
        break
      else
        modprobe -r $card 2> /dev/null
      fi
    else
      echo "Skipping module $card..."
    fi
  done
  echo
  if [ ! -r /cardfound ]; then
    # Don't probe for com20020... it loads on any machine with or without the card.
    echo "Probing for MCA, ISA, and other PCI network cards:"
    # removed because it needs an irq parameter: arlan
    # tainted, no autoprobe: (arcnet) com90io com90xx
    for card in depca ibmtr 3c501 3c503 3c505 3c507 3c509 3c515 ac3200 \
      acenic at1700 cosa cs89x0 de4x5 de600 \
      de620 e2100 eepro eexpress es3210 eth16i ewrk3 fmv18x forcedeth hostess_sv11 \
      hp-plus hp lne390 ne3210 ni5010 ni52 ni65 sb1000 sealevel smc-ultra \
      sis900 smc-ultra32 smc9194 wd ; do 
      SKIP=""
      if [ "`echo $INPUT | crunch | cut -f 1 -d ' '`" = "S" \
           -o "`echo $INPUT | crunch | cut -f 1 -d ' '`" = "s" ]; then
        for nogood in `echo $INPUT | crunch | cut -f 2- -d ' '` ; do
          if [ "$card" = "$nogood" ]; then
            SKIP=$card
          fi
        done
      fi
      if [ "$SKIP" = "" ]; then
        echo "Probing for card using the $card module..."
        modprobe $card 2> /dev/null
        grep -q eth0 /proc/net/dev
        if [ $? = 0 ]; then
          echo
          echo "SUCCESS: found card using $card protocol -- modules loaded."
          echo "$card" > /cardfound
          echo
          break
        else
          modprobe -r $card 2> /dev/null
        fi
      else
        echo "Skipping module $card..."
      fi
    done
    echo
  fi
  if [ ! -r /cardfound ]; then
    echo "Sorry, but no network card was detected.  Some cards (like non-PCI"
    echo "NE2000s) must be supplied with the I/O address to use.  If you have"
    echo "an NE2000, you can switch to another console (Alt-F2), log in, and"
    echo "load it with a command like this:"
    echo
    echo "  modprobe ne io=0x360"
    echo
  fi
elif [ "`echo $INPUT | crunch | cut -f 1 -d ' '`" = "P" \
       -o "`echo $INPUT | crunch | cut -f 1 -d ' '`" = "p" ]; then
  echo "Probing for a custom list of modules:"
  for card in `echo $INPUT | crunch | cut -f 2- -d ' '` ; do
    echo "Probing for card using the $card module..."
    modprobe $card 2> /dev/null
    grep -q eth0 /proc/net/dev
    if [ $? = 0 ]; then
      echo
      echo "SUCCESS: found card using $card protocol -- modules loaded."
      echo "$card" > /cardfound
      echo
      break
    else
      modprobe -r $card 2> /dev/null
    fi
  done
  echo
else
  echo "Skipping automatic module probe."
  echo
fi

# end main loop
break
done

On copie le fichier network.sh dans le nouveau système de fichiers :

cat network.sh > /tmp/img/up/scripts/network.sh

On va recréer les fichiers de dépendances des modules du noyau afin d'avoir un système propre :

gunzip -cd /usr/local/Slackware12.0/kernels/hugesmp.s/System.map.gz > /tmp/img/System.map
rm -f /tmp/img/up/lib/modules/2.6.21.5/modules.*
/sbin/depmod -a -b /tmp/img/up -F /tmp/img/System.map 2.6.21.5

On va démonter tous les fichiers images et compresser avec gzip notre système de fichiers puis nous copierons celui-ci dans /tftpboot avant de nettoyer le répertoire temporaire :

umount /tmp/img/initrd
umount /tmp/img/network
umount /tmp/img/pcmcia
umount /tmp/img/up
gzip -9f /tmp/img/newinitrd
mv /tmp/img/newinitrd.gz /tftpboot/slackware12.0/initrd.img
rm -r /tmp/img

Création du fichier de configuration pxelinux

On crée le fichier isolinux.cfg qui lancera les noyaux placés dans le nouveau système de fichiers :

vi isolinux.cfg

Voici le code à recopier en intégralité dans le fichier isolinux.cfg :

default hugesmp.s
prompt 1
timeout 1200
display message.txt
F1 message.txt
F2 f2.txt
label huge.s
  kernel kernels/huge.s/bzImage
  append initrd=initrd.img load_ramdisk=1 prompt_ramdisk=0 rw SLACK_KERNEL=huge.s
label hugesmp.s
  kernel kernels/hugesmp.s/bzImage
  append initrd=initrd.img load_ramdisk=1 prompt_ramdisk=0 rw SLACK_KERNEL=hugesmp.s
label speakup.s
  kernel kernels/speakup.s/bzImage
  append initrd=initrd.img load_ramdisk=1 prompt_ramdisk=0 rw SLACK_KERNEL=speakup.s

On copie le fichier isolinux.cfg dans le nouveau système de fichiers :

cat isolinux.cfg > /tftpboot/Slackware12.0/pxelinux.cfg/default/isolinux.cfg

Test du serveur PXE

Configurez un ordinateur client afin que celui-ci puisse booter sur le réseau et lancer l'installeur de Slackware 12.0.

Voici quelques informations sur l'installation de Slackware 12.0 par NFS.

Tout d'abord connectez-vous en root, configurez vos partitions avec fdisk ou cfdisk, chargez un module du noyau pour votre carte réseau. Exécutez la commande network pour détecter automatiquement votre carte réseau.

Si la carte réseau n'est pas détectée, nous n'avez malheureusement pas de chance et il vous faudra un CD-ROM de Slackware 12.0 ou un disque dur externe contenant le mirroir de Slackware 12.0.

Si votre carte réseau est détectée, vous pouvez sélectionner la boîte de dialogue SOURCE et valider l'installation par NFS. Vous allez avoir besoin de donner à l'installeur de Slackware les paramètres réseaux suivants :

Fichiers de configuration

Voici ci-dessous mon propre fichier de configuration dhcpd.conf :

# dhcpd.conf
#
# Configuration file for ISC dhcpd (see 'man dhcpd.conf')
#
authoritative;
ddns-update-style ad-hoc;
ignore bootp;
option domain-name-servers 192.168.16.4;

subnet 192.168.16.0 netmask 255.255.255.0 {
  option domain-name "example.net";
  option broadcast-address 192.168.16.255;
  option subnet-mask 255.255.255.0;
  option routers 192.168.16.1;
  pool {
    # clients connus par leur adresse mac
    range 192.168.16.100 192.168.16.150;
    default-lease-time 604800;
    max-lease-time 2419200;
    deny unknown clients;
  }
  pool {
    # clients inconnus
    range 192.168.16.151 192.168.16.170;
    default-lease-time 28800;
    max-lease-time 86400;
    deny known clients;
  }      
}

group {
  # machines non PXE
  option domain-name "example.net";
  option broadcast-address 192.168.16.255;
  option subnet-mask 255.255.255.0;
  option routers 192.168.16.1;
  default-lease-time 604800;
  max-lease-time 2419200;
  host win98 {
    hardware ethernet 00:10:c6:04:44:9f;
    fixed-address 192.168.16.3;
  }

  host winXP {
    hardware ethernet 00:c0:9f:59:ba:d9;
    fixed-address 192.168.16.2;
  }
}

group {
  # boot PXE
  default-lease-time 86400;
  max-lease-time 172800;
  allow bootp;
  next-server 192.168.16.1;
  option log-servers 192.168.16.1;
  use-host-decl-names on;
  if substring (option vendor-class-identifier, 0, 9) = "PXEClient" {
    filename "/Slackware12.0/pxelinux.0";
  }
  else if substring (option-vendor-class-identifier, 0, 9) = "Etherboot" {
    filename "/Slackware12.0/kernels/hugesmp.s/bzImage";
  }

  host portable {
    hardware ethernet 00:c0:9e:58:bc:d7;
    fixed-address 192.168.16.6;
  }
}

Ci-dessous un script à placer dans /etc/rc.d/ pour lancer le serveur DHCPD :

#!/bin/sh
#
# /etc/rc.d/rc.dhcpd
#      This shell script takes care of starting and stopping
#      the ISC DHCPD service
#

# Put the command line options here that you want to pass to dhcpd:
DHCPD_OPTIONS="-q eth0"

[ -x /usr/sbin/dhcpd ] || exit 0

[ -f /etc/dhcpd.conf ] || exit 0

start() {
      # Start daemons.
      echo -n "Starting dhcpd:  /usr/sbin/dhcpd $DHCPD_OPTIONS "
      /usr/sbin/dhcpd $DHCPD_OPTIONS
      echo
}
stop() {
      # Stop daemons.
      echo -n "Shutting down dhcpd: "
      killall -TERM dhcpd
      echo
}
status() {
  PIDS=$(pidof dhcpd)
  if [ "$PIDS" == "" ]; then
    echo "dhcpd is not running!"
  else
    echo "dhcpd is running at pid(s) ${PIDS}."
  fi
}
restart() {
      stop
      start
}

# See how we were called.
case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        stop
        start
        ;;
  status)
        status
        ;;
  *)
        echo "Usage: $0 {start|stop|status|restart}"
        ;;
esac

exit 0

N'oubliez pas de rajouter les lignes suivantes dans votre rc.local pour lancer à chaque démarrage votre démon dhcpd :

# lignes précédentes
if [ -x /etc/rc.d/rc.dhcpd ]; then
  # Start the DHCP server:
  /etc/rc.d/rc.dhcpd start
fi
# lignes suivantes

Enfin, n'oubliez pas de rendre votre script rc.dhcpd exécutable :

chmod 700 /etc/rc.d/rc.dhcpd

Conclusion

L'installation de Slackware 12.0 par PXE demande quelques efforts qui sont récompensés par la compréhension du fonctionnement.

Cela permet à l'utilisateur avancé de mieux comprendre les arcanes du système. L'installation par PXE est très souvent utilisée pour déployer des dizaines de machines. Bon amusement :)

Thèmes : #articles #installation #reseau #yttrium

Sauf indication contraire, ce document est placé sous licence CC-BY-SA 3.0.