Création automatisée d’une machine virtuelle Debian

Cet article vise à fournir les commandes minimales permettant la création, de manière totalement automatisée, d’une machine virtuelle tournant sous une distribution Debian Wheezy 64 bits. Ce script s’appuiera sur certains outils déjà vus sur admin-linux.fr (nbd, loop, kpartx) et sur debootstrap qui va nous aider à installer le système d’exploitation.

Au travers de la construction d’un script personnalisé, cet article décrit le fonctionnement de « genvm » présenté dans « genvm : Génération de machine virtuelles« .

Conception de l’image

Avant toute chose, chargeons les deux modules dont nous aurons besoin :

#! /bin/bash
 
modprobe nbd
modprobe loop

Création du disque

Nous allons tout d’abord créer à l’aide de qemu-img l’image virtuelle que nous connecterons ensuite à un Network Bloc Device afin de pouvoir travailler dessus.

Le nbd nous offre un peu de souplesse puisque nous pouvons utiliser directement le format de notre choix, qui sera ici le vmdk. L’image fera 5 Go et nous supposerons que /dev/nbd0 est libre.

qemu-img create -f vmdk disk.vmdk 5G
qemu-nbd -c /dev/nbd0 disk.vmdk

Partitionnement

Nous avons opté pour « parted » pour le partitionnement du disque car ce dernier dispose d’une option de script.

La table de partition sera de type msdos et l’image contiendra une unique partition, primaire et bootable.

parted -s /dev/nbd0 mklabel msdos
parted -s -a none /dev/nbd0 mkpart primary 64s 100%
parted -s /dev/nbd0 set 1 boot on

Système de fichiers

kpartx détecte la partition présente sur l’image et crée un point d’accès en /dev/mapper/nbd0p1.
Nous installerons ensuite le système de fichiers sur cette partition.

kpartx -av /dev/nbd0
mkfs.ext4 /dev/mapper/nbd0p1

Configuration de l’image

Montage

Connectons la partition à un périphérique de bloc (nous supposerons que /dev/loop0 est libre) puis nous la monterons dans /mnt/image.

losetup /dev/loop0 /dev/mapper/nbd0p1
mkdir /mnt/image
mount /dev/loop0 /mnt/image

Installation du système

« debootstrap » nous offre un moyen simple d’installer une Debian Wheezy 64 bits muni du noyau de base de la distribution (linux-image-3.2.0-4-amd64).
Outre le chargeur de démarrage qui est nécessaire au boot (nous utiliserons grub), vous pouvez ajouter les paquets que vous jugerez intéressants.

debootstrap --arch=amd64 --include=linux-image-3.2.0-4-amd64,grub2 \
--variant=minbase wheezy /mnt/image http://ftp2.fr.debian.org/debian

Mise en place du chroot

Afin de configurer le système, nous allons utiliser chroot. Il faut donc monter les dossiers adéquats.

mount -o bind /dev /mnt/image/dev
mount -t proc /proc /mnt/image/proc

Configuration du système

Tout d’abord, il faut donner un nom à la machine virtuelle (si vous sautez cette étape, elle prendra le nom de l’ordinateur sur lequel vous avez lancé le script) et un mot de passe à root, qui sera pour l’exemple… rootpwd.

echo 'vmdebian' > /mnt/image/etc/hostname
chroot /mnt/image << __EOF__
source /etc/profile
echo "root:rootpwd" | chpasswd
__EOF__

Ensuite, nous allons configurer le réseau :

echo -e '\nauto lo' >> /mnt/image/etc/network/interfaces
echo -e 'iface lo inet loopback\n' >> /mnt/image/etc/network/interfaces
echo 'auto eth0' >> /mnt/image/network/interfaces
echo 'iface eth0 inet dhcp' >> /mnt/image/network/interfaces

Installation du bootloader

Ici, nous allons spécifier à grub la configuration du disque virtuel. Grub2 utilisent pour cela le fichier device.map que nous allons créer avec les bons paramètres (disques et partitions sur lesquels se trouvent le système d’exploitation). Ensuite, nous utiliserons grub-install auquel nous indiquerons l’emplacement de notre device.map.

echo '(hd0) /dev/nbd0' > /mnt/image/boot/grub/device.map
echo '(hd0,1) /dev/loop0' >> /mnt/image/boot/grub/device.map
chroot /mnt/disk << __EOF__
source /etc/profile
grub-install --no-floppy --grub-mkdevicemap=/boot/grub/device.map \
 --root-directory=/ /dev/nbd0

Enfin, nous aurions dû utiliser update-grub pour terminer la configuration mais ce dernier génère un fichier grub.cfg trop complexe qui ne fonctionne pas. Nous allons donc créer un grub.cfg minimal à l’aide de grub-mkconfig. Grub n’appréciant que moyennement les disques et les partitions qui ne sont pas accessibles directement sous /dev, grub-probe enverra un message d’erreur mais cela n’influe pas sur le résultat.

grub-mkconfig | grep -v ^[[:blank:]]loopback.* | grep -v \
 "^[[:blank:]]set\ root=.*" > /boot/grub/grub.cfg
__EOF__

Pour finir…

Comme le script doit être lancé en root, je vous conseille de changer les droits sur l’image virtuelle à l’aide de chown.

chown past:users disk.vmdk

Il faut aussi démonter les partitions, libérer les points d’accès et les périphériques de loop et, éventuellement, décharger les modules.

#! /bin/bash
 
umount /mnt/image/proc
umount /mnt/image/dev
umount /mnt/image
rm -rf /mnt/image
losetup -d /dev/loop0
kpartx -dv /dev/nbd0
qemu-nbd -d /dev/nbd0
modprobe -r loop
modprobe -r nbd

Vous pouvez maintenant lancer la machine virtuelle via Qemu/KVM par exemple.

qemu-system-x86_64 disk.vmdk

Références

KVM : monter les disques des machines virtuelles
Creating a bootable virtual appliance, fully automated
Create a disk image with a booting running Debian
grub-pc (Documentation Ubuntu Francophone)
Man : qemu-img, parted, losetup, deboostrap, grub-install, update-grub, grub-mkconfig

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *