Publié le: 2014-01-17

Package mirror

Debian est une distribution communautaire très populaire, prônant la stabilité.

L’installeur de Debian est extrêmement complet et il permet de faire une installation par le réseau sans avoir à toucher son clavier. Cette fonction est extrêmement utile pour du déploiement d’échelle sur une ferme de serveurs, ou même sur une infrastructure moyenne, pour installer Debian sans bouger de son bureau (enfin si, il faut appuyer sur le bouton de démarrage de la machine).

Etape 1: serveur TFTP

Dans un premier temps nous allons installer et configurer un serveur TFTP pour faire du PXE.

Pour de bonnes performances, nous n’utiliserons pas le démon fourni par inetd, étant un peu lent. Le déploiement sera fait depuis un FreeBSD 9.1, mais peut être fait sous Linux

cd /usr/ports/ftp/tftp-hpa
make install clean

On va maintenant configurer proprement notre serveur tftp. Nous installerons les fichiers dans /usr/local/tftp et /usr/local/tftp/pxe pour nos boot PXE

mkdir -p /usr/local/tftp/pxe

Etape 2: PXE

Etape 2.1: Debian, PXELinux et TFTP

Pour la partie PXE, Debian nous fournit tout ce donc nous avons besoin.

Téléchargez l’archive suivante et décompressez la dans le répertoire pxe nouvellement créé:

fetch http://ftp.fr.debian.org/debian/dists/wheezy/main/installer-amd64/current/images/netboot/netboot.tar.gz
cd /usr/local/tftp/pxe
tar xvzf netboot.tar.gz

L’arborescence devrait ressembler à ceci:

pxelinux.0
version.info
debian-installer/
pxelinux.cfg/

Etape 2.2: PXE et DHCP

Il faut maintenant configurer le DHCP pour faire du PXE. Ici plusieurs choix s’offrent à vous. Soit vous décidez d’un déploiement par réseau ou par hôte.

Si le déploiement est ponctuel et que vos machines sont toujours en DHCP (cas de PC clients par exemple), je vous suggère de le lier à un hôte.

En revanche s’il s’agit d’un déploiement de serveurs, il peut être judicieux de garder un range de 4-5 adresses DHCPdynamiques pour le boot PXE, les serveurs n’étant (normalement) pas en DHCP une fois installés, et le PXE désactivé après installation.

Que l’un ou l’autre des cas soit choisi, vous devrez ajouter les 2 lignes suivantes à l’hôte/subnet (1.2.3.4 étant l’IP de votre serveur TFTP)

next-server 1.2.3.4;
filename "pxe/pxelinux.0";

Votre configuration PXE est prête.

Note: Si vous vous arrêtez à ce stade de l’installation, vous pourrez déployer vos machines manuellement via le réseau, comme si vous utilisiez le CD de netinstall de Debian.

Etape 3: Configuration de pxelinux

Notre but étant d’établir des installation automatisées et personnalisées, il va falloir travailler encore un peu.

Pour rappel, pxelinux va demander le fichier de configuration pxelinux de la manière suivante:

/pxe/pxelinux.cfg/01-88-99-aa-bb-cc-dd
/pxe/pxelinux.cfg/C0A87A0A
/pxe/pxelinux.cfg/C0A87A0
/pxe/pxelinux.cfg/C0A87A
/pxe/pxelinux.cfg/C0A87
/pxe/pxelinux.cfg/C0A8
/pxe/pxelinux.cfg/C0A
/pxe/pxelinux.cfg/C0
/pxe/pxelinux.cfg/C
/pxe/pxelinux.cfg/default
  • 01-88-99-aa-bb-cc-dd: correspond à 01-adresse-mac
  • C000025B: l’adresse IP de la machine en hexadécimal (ici 192.168.122.10)
  • default: le fichier par défaut

Notre but étant de personnaliser chaque machine (la configuration réseau et le nom d’hôte, notamment), nous allons utiliser la notation par IP (réservation DHCP oblige).

Créez le fichier /usr/local/etc/pxe/pxelinux.cfg/C0A87A0A (IP de votre machine en hexa) et insérez le contenu suivant:

include debian-installer/amd64/boot-screens/bootscreen-custom.cfg
default install
label install
    menu label ^Install
    menu default
    kernel debian-installer/amd64/linux url=tftp://1.2.3.4/pxe/debian-installer/./preseed-custom.cfg netcfg/get_domain=domain.tld netcfg/get_hostname=myname languagechooser/language-name=French countrychooser/shortlist=FR debian-installer/locale=fr_FR.UTF-8 keyboard-configuration/xkb-keymap=fr
    append vga=788 initrd=debian-installer/amd64/initrd.gz -- quiet
    prompt 0
    timeout 0

default debian-installer/amd64/boot-screens/vesamenu.c32

Ce fichier est le plus important. Il va indiquer à votre machine sa configuration de base, lui permettant d’accéder au réseau et à ses autres paramètres. Détaillons un peu la ligne du kernel.

La ligne kernel définit le noyau et des options de boot nécessaires à l’installeur Debian pour se mettre en réseau. Vous notererez que ce sont les premières questions de l’installeur en mode normal.

  • url: le chemin vers le fichier de configuration de l’installation automatisée (preseed). Cela peut être un serveur Apache, un serveur FTP ou encore un serveur TFTP. Dans notre cas, nous préférerons le TFTP, le preseed contenant le mot de passe de l’utilisateur root de la machine. L’utilisation du /./ n’est pas une faute de frappe, il s’agit d’un élément obligatoire séparant le répertoire du nom de fichier.
  • netcfg/get_domain: le suffixe DNS du nom d’hôte
  • netcfg/get_hostname: le nom (court) d’hôte de la machine
  • languagechooser/language-name: la langue de l’installeur
  • countrychooser/shortlist: le nom court correspondant au language-name
  • debian-installer/locale: quel fichier de localisation l’installeur Debian doit utiliser
  • keyboard-configuration/xbk-keymap: quel clavier configurer

Avant de passer au fichier preseed, nous allons customiser un peu les fichiers de Debian Installer afin de les épurer. Ouvrez le fichier /usr/local/tftp/pxe/debian-installer/amd64/boot-screens/bootscreen-custom.cfg et laissez uniquement les lignes suivantes:

menu hshift 7
menu width 61

menu title ^GDebian GNU/Linux automated installer boot menu
include debian-installer/amd64/boot-screens/stdmenu.cfg

Etape 4: Configuration de l’installeur Debian

Passons maintenant aux choses sérieuses. Nous allons configurer toutes les options de l’installeur Debian afin de formater la machine, installer les paquets, le bootloader…

Etape 4.1: locales

Dans un premier temps nous allons configurer la langue pour le système que l’on va installer et le clavier:

d-i debian-installer/locale string fr_FR
d-i keymap select fr

Etape 4.2: réseau

Le système va devoir choisir automatiquement une interface réseau. Nous allons dire à l’installeur de choisir automatiquement une interface. Si plusieurs interfaces sont connectées, il est possible de forcer celle-ci en précisant son nom (eth0…)

d-i netcfg/choose_interface select auto

Etape 4.3: miroir Debian

On configure maintenant l’accès au repository Debian (ici http://ftp.fr.debian.org/Debian). Si vous utilisez un ftp, vous pouvez l’utiliser dans la partie protocol.

d-i mirror/protocol string http
d-i mirror/country string manual
d-i mirror/http/hostname string ftp.fr.debian.org
d-i mirror/http/directory string /debian

Si vous utilisez un proxy, vous aurez besoin d’ajouter l’option suivante:

d-i mirror/http/proxy string http://myproxy:3128

On va maintenant dire à l’installeur quelle version de la distribution il doit installer. Cette option est extrêmement pratique, puisqu’elle vous permettra de garder le même système de déploiement au fil des versions.

d-i mirror/suite string wheezy
d-i mirror/udeb/suite string wheezy

Etape 4.4: utilisateurs

Passons maintenant à la configuration des comptes. On configure dans un premier temps le compte root:

d-i passwd/root-password password rootStr0ngPWD
d-i passwd/root-password-again password rootStr0ngPWD

Vous noterez que le mot de passe est en clair. Il est possible de le mettre au format MD5. L’utilisation du TFTP s’avère pratique dans notre cas, nous permettant de ne le rendre disponible que pour le serveurs et ainsi de cacher le mot de passe root. Cette fonction n’exclut pas le changement de mot de passe une fois l’installation terminée.

On va maintenant configurer l’utilisateur non privilégié de la machine (login, nom et mot de passe).

d-i passwd/username string unixxp
d-i passwd/user-fullname string John Doe
d-i passwd/user-password password unixxppwd
d-i passwd/user-password-again password unixxppwd

Si vous souhaitez forcer l’UID de l’utilisateur, vous pouvez ajouter la ligne suivante:

d-i passwd/user-uid string 1001

Etape 4.5: horloge

Passons maintenant à la configuration du temps. On définit si l’horloge matérielle est UTC, puis le fuseau et enfin un serveur NTP.

d-i clock-setup/utc boolean true
d-i time/zone string Europe/Paris
d-i clock-setup/ntp-server string ntp.unix-experience.fr

Etape 4.6: disques

La partie suivante consiste à configurer les disques. Il est possible de faire quelque chose de complexe, avec du LVM chiffré, multi partitions, etc… nous allons nous contenter de quelque chose de simple à une seule partition.

Tout d’abord on définit le disque sur lequel installer et la méthode

d-i partman-auto/disk string /dev/sda
d-i partman-auto/method string regular

Ensuite on va nettoyer le LVM et les arrays MD existants, s’il y en a

d-i partman-lvm/device_remove_lvm boolean true
d-i partman-md/device_remove_md boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true

On installe tout dans une seule partition (atomic). Si vous voulez séparer le /home, indiquez home et si vous voulez séparer /home, /usr, /var, /tmp indiquez multi.

d-i partman-auto/choose_recipe select atomic

Les options suivantes vont permettre de partitionner automatiquement le disque.

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

Enfin on va demander à partman de monter les partitions par UUID.

d-i partman/mount_style select uuid

Etape 4.7: installation du système de base

On va maintenant installer le système de base. On va dire à l’installeur quel meta-paquet installer. Pour Debian 64bits c’est linux-image-amd64:

d-i base-installer/kernel/image string linux-image-amd64

Etape 4.8: repositories additionnels

On va maintenant configurer Debian afin d’utiliser des repositories et flavors. Dans un premier temps, on active les flavors non-free et contrib pour le repository ftp.frdebian.org précédemment configuré.

d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true

Si vous possédez un repository local additionnel avec des paquets supplémentaires, par exemple, vous pourrez indiquer jusqu’à 10 repositories locaux (local0-9).

d-i apt-setup/local0/repository string \
       http://mirror.mydomain.tld/pub/Debian wheezy main contrib non-free

Si jamais celui-ci n’est pas authentifié (GPG), ajoutez la ligne suivante (non recommandé, préférez toujours un apt-key add)

d-i debian-installer/allow_unauthenticated boolean true

Etape 4.9: installation de paquets additionnels

tasksel et pkgsel vont nous permettre d’installer des paquets additionnels. tasksel correspond à la fenêtre vous proposant un environnement de bureau, serveur web, SSH… Ici nous voulons quelque chose de minimaliste, on le met à none.

tasksel tasksel/first multiselect none

Néanmoins, nous voulons installer quelques paquets de plus, comme openssh et puppet, on va donc dire à pkgsel de nous les installer:

d-i pkgsel/include string openssh-server puppet

Etape 4.10: popularity-contest

Si vous souhaitez activer les sondages sur l’utilisation des paquets, activez l’option autrement laissez à false.

popularity-contest popularity-contest/participate boolean false

Etape 4.11: bootloader

Pour terminer nous allons installer le grub à la racine de notre disque et dire à l’installeur de redémarrer:

d-i grub-installer/only_debian true
d-i grub-installer/bootdev string /dev/sda

d-i finish-install/reboot_in_progress note

Etape 4.12: commandes additionnelles (facultatif)

Si vous souhaitez lancer quelques commandes avant le démontage des disques et le redémarrage, indiquez les dans l’option late_command.

d-i preseed/late_command string echo "Just a late command" > /target/tmp/useless.tmp

Voilà, vous avez terminé votre preseed !

Afin de récapituler, voici le fichier que vous devriez avoir au final:

#### Contents of the preconfiguration file (for wheezy)
### Localization
d-i debian-installer/locale string fr_FR
d-i keymap select fr

### Network configuration
d-i netcfg/choose_interface select auto

### Mirror settings
d-i mirror/protocol string http
d-i mirror/country string manual
d-i mirror/http/hostname string ftp.fr.debian.org
d-i mirror/http/directory string /debian
d-i mirror/http/proxy string http://myproxy:3128

# Suite to install.
d-i mirror/suite string wheezy
d-i mirror/udeb/suite string wheezy

### Account setup
d-i passwd/root-password password rootStr0ngPWD
d-i passwd/root-password-again password rootStr0ngPWD

# To create a normal user account.
d-i passwd/user-fullname string UNIXExperience
d-i passwd/username string unixxp
d-i passwd/user-password password unixxppwd
d-i passwd/user-password-again password unixxppwd
d-i passwd/user-uid string 1001

### Clock and time zone setup
d-i clock-setup/utc boolean true
d-i time/zone string Europe/Paris
d-i clock-setup/ntp-server string ntp.unix-experience.fr

### Partitioning
d-i partman-auto/disk string /dev/sda
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-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite 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

# This makes partman automatically partition without confirmation.
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

## Controlling how partitions are mounted
d-i partman/mount_style select uuid

### Base system installation
d-i base-installer/kernel/image string linux-image-amd64

### Apt setup
d-i apt-setup/non-free boolean true
d-i apt-setup/contrib boolean true

# Additional repositories, local[0-9] available
d-i apt-setup/local0/repository string \
       http://mirror.mydomain.tld/pub/Debian wheezy main contrib non-free
d-i debian-installer/allow_unauthenticated boolean true

### Package selection
tasksel tasksel/first multiselect none

d-i pkgsel/include string openssh-server

popularity-contest popularity-contest/participate boolean false

d-i grub-installer/only_debian true
d-i grub-installer/bootdev string /dev/sda

### Finishing up the installation
d-i finish-install/reboot_in_progress note

d-i preseed/late_command string echo "Just a late command" > /target/tmp/useless.tmp

Conclusion

Un axe d’amélioration serait de coupler l’installeur avec puppet afin de déployer la machine intégralement et automatiquement. Ceci fera l’objet d’un autre article.

Vous disposez désormais d’une petite infrastructure vous permettant d’automatiser rapidement l’installation de Debian sur votre parc, vous n’avez plus besoin de rester derrière la console de votre serveur pour installer la machine, elle se configure tout seule !

Sources

http://www.debian.org/distrib/netinst http://www.syslinux.org/wiki/index.php/PXELINUX http://www.debian.org/releases/stable/i386/apb.html http://www.debian.org/releases/stable/example-preseed.txt