BlackSponge's Blog

Installation de VM avec PXE et kickstart

Posted on in Tutorials by BlackSponge . KVM PXE Centos Kickstart

Blog header: BlackSponge presents « Fun with Virtual Machines - PXE Install »

Comment que quoi ?

Installation et config :

  • DHCP : pour indiquer l'adresse du serveur tftp et le nom du fichier pxe
  • TFTP : pour servir un menu et le noyau de l'os a installer
  • FTP (ou HTTP / NFS) : pour servir les fichiers d'installation de l'os

Salissons nous les mains

D'abord il faut créer une vm avec deux interfaces réseau :

  • une pour avoir internet (parce que ca peut etre pratique) configurer par exemple en mode NAT
  • une pour etre sur le réseau qui servira a déployer les machines configurer par exemple en mode private sans DHCP (vu qu'il sera fait par la machine qui est le serveur d'installation)

Ici on va dire que la premiere s'appelle ens3 et la deuxieme ens4, que le premier réseau, default, est configuré en NAT avec dhcp avec ses ip dans 192.168.0.0/24 et que le deuxième, private, est configuré en mode private sans le dhcp et que son subnet sera 192.168.1.0/24.

D'abord pour configurer la deuxième interface en ip statique on va éditer le fichier /etc/sysconfig/network-scripts/ens4 pour que le contenu soit le suivant :

TYPE=Ethernet         # Type de l'interface, ici de l'ethernet, rien a changer
BOOTPROTO=static      # On passe en ip statique si c'etait en DHCP
NAME=ens4
DEVICE=ens4           # Le nom de la carte réseau, pas de raison de le changer
ONBOOT=yes            # On active l'interface pour qu'elle démarre en meme temps que la machine
IPADDR=192.168.1.1    # IP de la machine
NETMASK=255.255.255.0 # Masque de sous réseau pour avoir un /24

Puis il n'y a plus qu'a redémarrer le réseau pour appliquer la configuration \o/

# systemctl restart NetworkManager

Le DHCP

Puisqu'il faut bien commencer quelque part pourquoi pas le DHCP, ca va etre le plus rapide a faire normalement. Pour ca il faut d'abord installer les paquets pour ca.

# yum install dhcp

Puis on va aller éditer le fichier de conf qui est /etc/dhcp/dhcpd.conf. Pour le moment on a pas besoin de faire quelque chose de bien complexe, seulement donner une ip aux VM, on verra le reste plus tard au besoin.

subnet 192.168.1.0 netmask 255.255.255.0 {    # On définit un réseau sur lequel le dhcp va assigner les IP
        range 192.168.1.10 192.168.1.254;     # Les IP vont de 192.168.1.10 à 192.168.1.254 (j'aime bien laisser quelques IP statiques dispo au cas ou)
}

Et voila ! Il faut maintenant activer le dhcp (pour qu'il démarre au boot) et le démarrer.

# systemctl enable dhcpd
# systemctl start dhcpd

Par la même occasion on va l'autoriser a passer le firewall puis on reload les règles du pare-feu pour qu'elles soient effectives.

# firewall-cmd --add-service=dhcp --permanent
# firewall-cml --reload

Le serveur TFTP

Maintenant le vrai fun commence et comme juste avant il faut commencer par installer le serveur tftp, on va aussi avoir besoin d'un autre paquet, syslinux, qui contient et programmes et noyaux pour pouvoir charger le boot en pxe et faire de jolis menus.

# yum install tftp-server syslinux

Le dossier depuis lequel les fichiers vont etre servis est /var/lib/tftpboot. Pour garder les choses bien ranger on va créer un dossier pxelinux dans ce dossier dans lequel on va copier le pxelinux.0 de syslinux ainsi que le fichier vesamenu.c32

# mkdir /var/lib/tftpboot/pxelinux
# cp /usr/share/syslinux/pxelinux.0 /var/lib/tftpboot/pxelinux/
# cp /usr/share/syslinux/vesamenu.c32 /var/lib/tftpboot/pxelinux/

Ensuite on va créer la configuration PXE. Pour ca on va créer un dossier pxelinux.cfg toujours dans le dossier pxelinux.

# mkdir /var/lib/tftpboot/pxelinux/pxelinux.cfg

Dans ce dossier on crée un fichier default avec le contenu suivant :

default vesamenu.c32
prompt 0
timeout 600

label linux
  menu label ^Install system
  menu default
  kernel ../images/centos7/vmlinuz
  append initrd=../images/centos7/initrd.img ip=dhcp inst.repo=ftp://192.168.1.1/centos7/

Ce fichier sera le fichier par défaut utilisé par PXE, bien que ici ce ne soit pas nécessaire on pourrait faire une configuration par machine en utilisant leur MAC ou IP.

Aussi on vient d'anticiper légèrement sur la suite en spcéfiant le chemin vers le noyau a charger et l'url de l'endroit ou il y a les fichier d'installation.

On peut maintenant activer et démarrer le serveur TFTP comme on a fait pour le dhcp.

# systemctl enable tftp
# systemctl start tftp

Avant de passer tout de suite a la suite on va revenir un peu sur le dhcp pour rajouter les lignes spécique au PXE.

subnet 192.168.1.0 netmask 255.255.255.0 {
        range 192.168.1.10 192.168.1.254;

        next-server 192.168.1.1;              # Adresse du serveur TFTP
        filename "pxelinux/pxelinux.0";       # Fichier à charger
}

Puis on redémarre le serveur DHCP.

# systemctl restart dhcpd

On peut aussi rajouter les regles firewall pour laisser passer le serveur tftp.

# firewall-cmd --add-service=tftp --permanent
# firewall-cmd --reload

Si on test maintenant de créer une vm sur le réseau private en selectionnant le Démarrage sur le réseau à la création on devrait pouvoir voir au bout de quelque seconde un écran comme le suivant (qui boucle parce que la machine ne peut pas encore trouver le kernel qu'on lui a dit).

menu de boot pxe

Servir les fichiers d'installation avec FTP (et le noyau en TFTP)

Avant de commencer il nous faut récupérer les fichiers d'installation de l'os (ceux qui sont dans l'iso en fait). Le plus simple dans ce cas je trouve c'est de monter l'iso en tant que cdrom sur la machine virtuelle puis de les copier. Mais il est tout a fait envisageable de faire autre chose.

Pour ca on peut aller dans virt-manager et dans la vue détaillé de la machine virtuelle, à la rubrique IDE CDROM selectionner l'iso d'installation dans le champ Source path. Si il n'y a pas de cdrom disponible on peut en rajouter en cliquant sur Add hardware puis Storage et selectionner CDROM dans le champ Device type, il faudra surement eteindre la vm puis la rallumer pour voir la modification appliquée.

Aussi il est conseillé pour eviter certains problèmes de permission d'avoir l'iso dans /var/lib/libvirt/images (au même endroit que les disques).

Une fois que c'est bon on peut monter le cdrom.

# mount /dev/cdrom /mnt

On crée maintenant le dossier qui va accueillir le noyau.

# mkdir -p /var/lib/tftpboot/images/centos7

Puis on copie les fichiers dedans.

# cp /mnt/images/pxeboot/{initrd.img,vmlinuz} /var/lib/tftpboot/images/centos7/

Maintenant que ça c'est fait on peut vraiment passer au serveur FTP avec comme d'habitude l'installation du paquet.

# yum install vsftpd

Ensuite on crée un dossier pour eviter de tout mettre en vrac puis on copie les fichiers.

# mkdir /var/ftp/centos7
# cp -r /mnt/* /var/ftp/centos7/

On active démarre le service et met les règles firewall.

# systemctl enable vsftpd
# systemctl start vsftpd
# firewall-cmd --add-service=ftp --permanent
# firewall-cmd --reload

A ce moment on devrait pouvoir faire démarer une machine sur l'installation de l'os. La vm peut avoir un peut de mal avec 1GiB de ram vu qu'elle doit charger pas mal de chose en mémoire, ça marche bien avec 2 GiB.

Installation automatisée avec kickstart

Dans le dossier des fichiers ftp, on va créer un dossier ks.

# mkdir /var/ftp/ks

Dans lequel on va placer un fichier kickstart.cfg avec le contenu suivant.

#version=DEVEL
cmdline

# Run the Setup Agent on first boot
firstboot --enable
ignoredisk --only-use=vda

# Keyboard layouts
keyboard --vckeymap=fr --xlayouts='fr'
# System language
lang en_US.UTF-8

# Network information
network  --bootproto=dhcp --device=eth0 --noipv6 --activate
network  --hostname=guest

# Root password
rootpw --plaintext toto

# System services
services --disabled="chronyd"

# System timezone
timezone Europe/Paris --isUtc --nontp

# System bootloader configuration
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=vda

# Partition clearing information
clearpart --none --initlabel
# Disk partitioning information
part /boot --fstype="ext4" --ondisk=vda --size=1024
part swap --fstype="swap" --ondisk=vda --size=1024
part / --fstype="ext4" --ondisk=vda --size=8191

%packages
@^minimal
@core
kexec-tools

%end

%addon com_redhat_kdump --enable --reserve-mb='auto'

%end

Il faut noter que certaines option peuvent changer en fonction de la configuration de la vm :

  • nom du disque d'installation : vda pour un os type Centos, hda pour du generic
  • nom de la carte réseau : eth0 pour une carte type virtio et ens3 pour rtl8139
  • la taille du disque d'installation (le partitionnage est configuré dans cet conf pour un disque de 10GiB)

Pour plus d'info sur les commandes dans le kickstart : https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/7/html/installation_guide/sect-kickstart-syntax

Pour vérifier les erreurs de syntaxes sans avoir a installer des millions de vm on utiliser la commande ksvalidator du package pykickstart.

# yum install pykickstart
# ksvalidator /var/ftp/ks/kickstart.cfg

Puis on peut editer la configuration PXE pour dire d'utiliser le fichier kickstart qu'on vient de créer en rajoutant inst.ks=ftp://192.168.1.1/ks/kickstart.cfg a la fin de la ligne qui commence par append ....

default vesamenu.c32
prompt 0
timeout 600

label linux
  menu label ^Install system
  menu default
  kernel ../images/centos7/vmlinuz
  append initrd=../images/centos7/initrd.img ip=dhcp inst.repo=ftp://192.168.1.1/centos7/ inst.ks=ftp://192.168.1.1/ks/kickstart.cfg

Et à partir de la si tout c'est bien passé on peut installer des vm automatiquement ! \o/

Victoire !