Table of Contents

KVM: Virtualisation d'un système

Ce Tutoriel présente comment virtualiser un serveur physique.

Préparation de l'image disque

Les images disques dans l'hyperviseur ont l'extension .įmg

find / -name *.img 
/boot/initramfs-2.6.32-573.12.1.el6.x86_64.img
/usr/lib64/guestfs/supermin.d/init.img
/usr/lib64/guestfs/supermin.d/udev-rules.img
/usr/lib64/guestfs/supermin.d/daemon.img
/usr/lib64/guestfs/supermin.d/base.img
/root/.vagrant.d-back/boxes/demo-VAGRANTSLASH-centos6/1.0.0/libvirt/box.img
/var/lib/libvirt/images/dgfip-VAGRANTSLASH-centos7_vagrant_box_image_0.img
/var/lib/libvirt/images/ibm/centreon.img
/var/lib/libvirt/images/sandbox_dgfip-rhel7.img
/var/lib/libvirt/images/reseau/GLPI-new.img
/var/lib/libvirt/images/reseau/redmine.img
/var/lib/libvirt/images/reseau/hercule.img
/var/lib/libvirt/images/reseau/GLPI.img
/var/lib/libvirt/images/reseau/cftgcos.img
/var/.vagrant.d/boxes/dgfip-VAGRANTSLASH-centos7/0/libvirt/box.img
/var/.vagrant.d/boxes/dgfip-base/0/libvirt/box.img
/var/.vagrant.d/boxes/demo-VAGRANTSLASH-centos6/1.0.0/libvirt/box.img

Il est possible de dupliquer une image disque existante comme base pour virtualiser le système d'un serveur.

Il faut choisir une image contenant un système similaire (ou istaller la base du système sur une image disque vierge):

cat /mnt/etc/redhat-release\\ CentOS release 6.7 (Final)

Dand l'exemple on va utiliser l'image disque de centreon (Centos 6.7) car elle est plus petite (25G) que celle de GLPI (141G).

[root@s013e13p-snmp /]# dd if=/var/lib/libvirt/images/ibm/centreon.img of=/var/lib/libvirt/images/reseau/redmine.img
51094272+0 enregistrements lus
51094272+0 enregistrements écrits
26160267264 octets (26 GB) copiés, 320,91 s, 81,5 MB/s

Préparation du nouveau système

Avant de démarrer le nouveau système il faut modifier quelques paramètres pour pouvoir utiliser le disque dans une nouvelle VM (adresse ip, compte root), il faut donc monter le système de fichier dans un répertoire du système hôte.

Montage des partitions avec losetup et kpartx

libvirt peut utiliser des images au format raw, et qemu-img permet d'identifier le type de l'image:

[root@s013e13p-snmp /]# qemu-img info /opt/images/centos7.img 

image: /opt/images/centos7.img
file format: raw
virtual size: 16G (17179869184 bytes)
disk size: 4.2G

Une image disque au format raw peut être montée comme périphérique de type bloc avec losetup:

[root@s013e13p-snmp /]# losetup -f /opt/images/centos7.img
[root@s013e13p-snmp /]# losetup -a
/dev/loop0: [fd05]:2363831 (/opt/images/centos7.img)

Lorsqu'on utilise LVM avec des schémas communs pour construire les machines virtuelles il est probale qu'on se retrouve avec des noms de volumes identiques, cela peut être probèmatique lors de l'activation du volume group.

Récupérer l'UUID du volume group de l'hôte

[root@s013e13p-snmp /]# vgdisplay | egrep -i "uuid|name"

File descriptor 6 (/dev/pts/2) leaked on vgdisplay invocation. Parent PID 24194: -bash
  VG Name               vg00
  VG UUID               cndaZQ-Wu30-iYXY-fbiA-mdXK-lXHR-L9EUFz

Créer les maps de périphérique depuis la table de partition périphérique de bloc, et récupérer l'UUID du volume group ajouté:

[root@s013e13p-snmp /]# kpartx -a /dev/loop0
[root@s013e13p-snmp /]# vgdisplay | egrep -i "uuid|name"

File descriptor 6 (/dev/pts/2) leaked on vgdisplay invocation. Parent PID 24194: -bash
  VG Name               vg00
  VG UUID               X1G903-dfKl-q09q-XbpD-OSSg-CJq0-a3BGS9
  VG Name               vg00
  VG UUID               cndaZQ-Wu30-iYXY-fbiA-mdXK-lXHR-L9EUFz

Dans l'exemple l'UUID du volume group ajouté est X1G903-dfKl-q09q-XbpD-OSSg-CJq0-a3BGS9.

Renommer le volume group, par exemple vg02:

[root@s013e13p-snmp /]# vgrename -v X1G903-dfKl-q09q-XbpD-OSSg-CJq0-a3BGS9 vg02

File descriptor 6 (/dev/pts/2) leaked on vgrename invocation. Parent PID 24194: -bash
    Using volume group(s) on command line.
    Wiping cache of LVM-capable devices
    Cache: Duplicate VG name vg00: Prefer existing cndaZQ-Wu30-iYXY-fbiA-mdXK-lXHR-L9EUFz vs new X1G903-dfKl-q09q-XbpD-OSSg-CJq0-a3BGS9
  Processing VG vg00 because of matching UUID X1G903-dfKl-q09q-XbpD-OSSg-CJq0-a3BGS9
    Cache: Duplicate VG name vg00: Prefer existing cndaZQ-Wu30-iYXY-fbiA-mdXK-lXHR-L9EUFz vs new X1G903-dfKl-q09q-XbpD-OSSg-CJq0-a3BGS9
    Cache: Duplicate VG name vg00: Prefer existing X1G903-dfKl-q09q-XbpD-OSSg-CJq0-a3BGS9 vs new cndaZQ-Wu30-iYXY-fbiA-mdXK-lXHR-L9EUFz
    Writing physical volume data to disk "/dev/mapper/loop0p2"
    Physical volume "/dev/mapper/loop0p2" successfully written
    Archiving volume group "vg00" metadata (seqno 4).
    Writing out updated volume group
    Cache: Duplicate VG name vg00: X1G903-dfKl-q09q-XbpD-OSSg-CJq0-a3BGS9 (created here) takes precedence over cndaZQ-Wu30-iYXY-fbiA-mdXK-lXHR-L9EUFz
    Renaming "/dev/vg00" to "/dev/vg02"
    Creating volume group backup "/etc/lvm/backup/vg02" (seqno 5).
  Volume group "X1G903-dfKl-q09q-XbpD-OSSg-CJq0-a3BGS9" successfully renamed to "vg02

Vérifier que le nom de volume associé à l'UUID a bien changé

[root@s013e13p-snmp /]# vgdisplay | egrep -i "uuid|name"
File descriptor 6 (/dev/pts/2) leaked on vgdisplay invocation. Parent PID 24194: -bash
  VG Name               vg02
  VG UUID               X1G903-dfKl-q09q-XbpD-OSSg-CJq0-a3BGS9
  VG Name               vg00
  VG UUID               cndaZQ-Wu30-iYXY-fbiA-mdXK-lXHR-L9EUFz

Les volumes associés au volume group vg02 sont inactive par défaut:

[root@s013e13p-snmp /]# lvscan 

File descriptor 6 (/dev/pts/2) leaked on lvscan invocation. Parent PID 24194: -bash
  inactive          '/dev/vg02/lvswap' [1,00 GiB] inherit
  inactive          '/dev/vg02/lvroot' [8,00 GiB] inherit
  ACTIVE            '/dev/vg00/lvroot' [5,00 GiB] inherit
  ACTIVE            '/dev/vg00/lvtmp' [1,00 GiB] inherit
  ACTIVE            '/dev/vg00/lvvar' [30,00 GiB] inherit
  ACTIVE            '/dev/vg00/lvvarlog' [10,00 GiB] inherit
  ACTIVE            '/dev/vg00/lvapp' [48,94 GiB] inherit
  ACTIVE            '/dev/vg00/lvproduits' [512,00 MiB] inherit
  ACTIVE            '/dev/vg00/lvswap' [3,88 GiB] inherit
-(mer. sept. 07 14:06:03)--(nessus:/opt/images)-
[root] # vgchange -ay
File descriptor 6 (/dev/pts/2) leaked on vgchange invocation. Parent PID 24194: -bash
  2 logical volume(s) in volume group "vg02" now active
  7 logical volume(s) in volume group "vg00" now active

Activer le volume group vg02:

[root@s013e13p-snmp /]# lvchange -ay /dev/vg02

Les volumes associés au volume group vg02 doivent passer ACTIVE

[root@s013e13p-snmp /]# lvscan

File descriptor 6 (/dev/pts/2) leaked on lvscan invocation. Parent PID 24194: -bash
  ACTIVE            '/dev/vg02/lvswap' [1,00 GiB] inherit
  ACTIVE            '/dev/vg02/lvroot' [8,00 GiB] inherit
  ACTIVE            '/dev/vg00/lvroot' [5,00 GiB] inherit
  ACTIVE            '/dev/vg00/lvtmp' [1,00 GiB] inherit
  ACTIVE            '/dev/vg00/lvvar' [30,00 GiB] inherit
  ACTIVE            '/dev/vg00/lvvarlog' [10,00 GiB] inherit
  ACTIVE            '/dev/vg00/lvapp' [48,94 GiB] inherit
  ACTIVE            '/dev/vg00/lvproduits' [512,00 MiB] inherit
  ACTIVE            '/dev/vg00/lvswap' [3,88 GiB] inherit

Monter le volume racine /dev/vg00/lvroot sur le dossier /mnt

mount /dev/vg00/lvroot /mnt

Montage des partitions avec libguestfs

Les disques créés par l'hyperviseur étant au format qcow2, il faut utiliser les outils de libguestfs:

[root@s013e13p-snmp /]# qemu-img info /var/lib/libvirt/images/reseau/redmine.img 
image: /var/lib/libvirt/images/reseau/redmine.img
file format: qcow2
virtual size: 70G (75161927680 bytes)
disk size: 20G
cluster_size: 65536

Récupérer la liste des volumes dans l'image avec virt-filesystems

[root@s013e13p-snmp /]# virt-filesystems -a /var/lib/libvirt/images/reseau/redmine.img

/dev/sda1
/dev/vg_s013centreon/lv_home
/dev/vg_s013centreon/lv_root

Monter le volume racine /dev/vg_s013centreon/lv_root avec guestmount:

guestmount -a /var/lib/libvirt/images/reseau/redmine.img -m /dev/vg_s013centreon/lv_root /mnt

Adaptation des paramètres

Le disque clôné embarque un système qui hérite des paramètres de la machine d'origine, il faut adapter ces paramères afin de personnaliser la VM avant de la démarrer.

Adapter manuellement l'adresse ip essentiellement dans le script ifcfg-eth0:

[root@s013e13p-snmp /]# vi /mnt/etc/sysconfig/network-scripts/ifcfg-eth0 

DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=xx.xx.xxx.xxx
PREFIX=24
GATEWAY=xx.xx.xxx.x
DNS1=xx.xxx.xx.xxx
DNS2=xx.xxx.xx.xx
DEFROUTE=yes
IPV4_FAILURE_FATAL=yes
IPV6INIT=no
NAME="System eth0"

Pour ne pas affecter l'association nom d'interface/adresse MAC désactiver le script 70-persistent-net.rules:

[root@s013e13p-snmp /]# mv /mnt/etc/udev/rules.d/70-persistent-net.rules /mnt/etc/udev/rules.d/70-persistent-net.bkup

Remplacer le fichier /etc/shadow par celui du serveur à virtualiser:

-(ven. sept. 16 07:58:41)--(nessus:~)-
[root] # scp /etc/shadow user@xx.xx.xxx.xxx:/mnt/etc/

Une fois cela fait on peut démonter les sytème de fichier.

[root@s013e13p-snmp /]# umount /mnt

Si on a utilisé losetup et kpartx pour monter le système il faut également libérer les ressources:
kpartx -d /dev/loop0
losetup -d /dev/loop0

Préparation du nouveau système

Synchronisation des fichiers du système

On doit exclure de la synchronisation les éléments attachés au serveur physique (ainsi que ceux qu'il n'est pas utile de virtualiser, par exemple le répertoire /opt/image qui ne contient que des images disques volumineuses)

-(ven. sept. 16 07:59:51)--(nessus:~)-
[root] # cat > ~/exclude-rsync<< 'EOF'
/dev
/proc
/sys
/tmp
/run
/mnt
/media
/opt/images
lost+found
/etc/sysconfig/network-scripts
/etc/sysconfig/network
/etc/sysconfig/static-routes
/etc/fstab
/etc/udev/rules.d/70-persistent-net.rules
EOF

La synchronisation peut prendre un temps plus ou moins long en fonction de la volumétrie sur le serveur que l'on veut virtualiser:

[root@s013e13p-snmp /]# rsync -aPKHxv -e ssh --exclude-from=exclude-rsync /opt user@xx.xx.xxx.xxx:/opt

sent 4480728368 bytes  received 5444641 bytes  8999344.05 bytes/sec
total size is 5341445575  speedup is 1.19

Après la synchronisation la taille du disque doit logiquement augmenter:

[root@s013e13p-snmp /]# ls -alh /var/lib/libvirt/images/ibm/redmine.img
-rw------- 1 qemu qemu 36G 16 sept. 14:55 /var/lib/libvirt/images/ibm/redmine.img