Fun with virtual machines

Posted on

fun with virtual machines (avec sheldon cooper)

Installation sur le réseau avec PXE

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 à 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 première s'appelle ens3 et la deuxième 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/ifcfg-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, ça va etre le plus rapide à faire normalement. Pour ça 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 à passer le firewall puis on reload les règles du pare-feu pour qu'elles soient effectives.

# firewall-cmd --add-service=dhcp --permanent
# firewall-cmd --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 rangées 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 ça 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 50

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 spécifiant le chemin vers le noyau a charger et l'url de l'endroit où il y a les fichiers 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éciques 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 règles firewall pour laisser passer le serveur TFTP.

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

Si on teste maintenant de créer une vm sur l'hôte en utilisant virt-manager sur le réseau private en sélectionnant le Démarrage sur le réseau à la création on devrait pouvoir voir au bout de quelques secondes 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 ça on peut aller dans virt-manager et dans la vue détaillée de la machine virtuelle, à la rubrique IDE CDROM selectionner l'iso d'installation dans le champ Source path. S'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émarrer 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

# Installation automatique
cmdline

# Run the Setup Agent on first boot
firstboot --enable

# On utilise seulement le premier disque
ignoredisk --only-use=vda

# Configuration du clavier
keyboard --vckeymap=fr --xlayouts='fr'

# Langue
lang en_US.UTF-8

# Configuration réseau
network  --bootproto=dhcp --device=eth0 --noipv6 --activate
network  --hostname=guest

# Desactivation de la connection par mot de passe pour le root
rootpw --lock

# Configuration de l'heure
timezone Europe/Paris --isUtc --nontp

# Configuration du bootloader
bootloader --append=" crashkernel=auto" --location=mbr --boot-drive=vda

# Suppression des données sur le disque d'installation
clearpart --drives=vda --all

# Configuration du partitionnement
part /boot --fstype="ext4" --ondisk=vda --size=1024
part swap --fstype="swap" --ondisk=vda --size=1024
part / --fstype="ext4" --ondisk=vda --size=8191

# Création d'un utilisateur
user --name=roger --password=toto --plaintext

# Installation minimal des paquets
%packages
@^minimal
@core
%end

# Commandes post-install
%post

# Création du répertoire de config ssh
mkdir -p /root/.ssh

# Ajout d'une clé publique ssh pour le root
echo "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDQoUWa0+Z4NhGrDjCVeb80UzhEL5VmRu+Sq/pye7FWXuZQEGdAcqI1I4YUetHZ9fDLjJxOnCxqQ2c6Lkt//2fnW8zVORNQXjHMYFIcCJ/QV6JL5O3m07/3f8280soyWXZ2MNHEhUhOBfTtVZ4os6xcCOSa/4PZuQLAhuZlKQVDEKoo55o2hrDmVZOKpK/fLycLEsraOLixY5SSKVzfCAhqXsNckWJwWX46Zw2DIY4YnizHtjuDDxjevtDK6mo2j2+Px9SP4eGRfh5BsMr1Dic0SsH/fFRuqzBBpTDoim0hr9K6k/hMFKbASrjzAhZfgPjgAknHF0pesjfr7vnshvn9 zorg@destiny-explorer" > /root/.ssh/authorized_keys

%end

# Reboot à la fin de l'installation
reboot

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

  • nom du disque d'installation : vda pour un disque sur un bus Virtio, hda pour de l'IDE, sda pour du SATA...
  • 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 cette 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 à installer des millions de vm on utilise la commande ksvalidator du package pykickstart.

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

Puis on peut éditer 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 50

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 là si tout c'est bien passé on peut installer des vm automatiquement ! \o/

Victoire !