Libvirt

De Wiki doc

Installation

Installation des paquets

# apt install qemu-kvm libvirt-bin virtinst virt-viewer bridge-utils vde2
  • qemu-kvm Hyperviseur (provient d'un autre tuto mais je pense qu'il est indispensable)
  • libvirt-bin Librairie de virtualisationde virtinst (ça ne m'étonnerai pas qu'il en soit une dépendance)
  • virtinst Manageur d'hyperviseur
  • virt-viewer Installe les outils liés à l'affichage des VM
  • bridge-utils Permet de configurer une interface bridge pour que les VM aient internet sans passer par cet horrible NAT (est une dépendance de libvirt-bin donc inutile de le préciser)
  • vde2 Permet de créer une interface tap qui est lié au bridge pour je ne sais quelle rason mais indispensable apparemment


Configuration du bridge

# apt install bridge-utils
# vim /etc/network/interfaces
 iface eth0 inet manual
 
 auto br0 
 iface br0 inet static
         address 192.168.1.140
         network 192.168.1.0
         broadcast 192.168.1.255
         netmask 255.255.255.0
         gateway 192.168.1.15
         pre-up ip tuntap add dev tap0 mode tap user root
         pre-up ip link set tap0 up
         bridge_ports all tap0
         bridge_stp off 
         bridge_maxwait 0
         bridge_fd      0   
         post-down ip link set tap0 down
         post-down ip tuntap del dev tap0 mode tap

Initialiser la variable d'environnement XDG_RUNTIME_DIR

# vim /etc/environment
 # export XDG_RUNTIME_DIR=/tmp/
# reboot

Création de la machine virtuelle

Après la création, la machine virtuelle se lance automatiquement.

# virt-install --connect qemu:///system --virt-type kvm --name debian-test --ram 512 --disk /var/lib/libvirt/images/debian-test.qcow2,format=qcow2,size=10 --cdrom /srv/iso/debian-7.4.0-amd64-i386-netinst.iso --network bridge=br0 --vnc --vnclisten=0.0.0.0 --os-type linux --os-variant debianwheezy --vcpus=1 --check-cpu

Les VM sont stockés dans /var/lib/libvirt/images/

Commandes de monitoring et de management des VM

Lister

# virsh -c qemu:///system list --all

Interation avec les VM

# virsh -c qemu:///system <option> <nom_VM>
  • reboot pour initier un redémarrage
  • shutdown pour arrêter proprement une machine virtuelle
  • destroy pour la stopper brutalement
  • suspend pour la mettre en pause
  • resume pour la sortir de pause
  • autostart pour activer (ou désactiver lorsque l'option --disable est employée) le démar- rage automatique d'une machine virtuelle au démarrage de l'hôte
  • undefine pour effacer toute trace de la machine virtuelle au sein de libvirtd

Connextion sur la vm avec un client graphique

Connaitre le port d'écoute pour une VM donnée :

# virsh vncdisplay NOM_DE_LA_VM

Connexion VNC à la VM (depuis un terminal sans connexion ssh préalable)

# virt-viewer -c qemu+ssh://root@192.168.1.140/system debian-test

Connexion depuis un client distant une fois connecté en ssh

# virt-viewer -c qemu+ssh://root@192.168.1.140/system debian-test

Connexion via VNC depuis un client sans ssh (j'ignore si c'est chiffré mais je ne pense pas)

# remote-viewer vnc://192.168.1.140:5900

Gestion VM

Créer une VM Windows 7

# virt-install --connect qemu:///system --virt-type kvm --name windows7 --ram 2048 --disk /var/lib/libvirt/images/windows7.qcow2,format=qcow2,size=64 --cdrom /srv/iso/en_windows_7_ultimate_x64_dvd_x15-65922.iso --network bridge=br0 --vnc --vnclisten=0.0.0.0 --os-type windows --os-variant win7 --vcpus=2 --check-cpu

Cloner une VM

# virt-clone --connect=qemu:///system -o VM_source -n Nouvelle_VM -f /var/lib/libvirt/images/Nouvelle_VM.qcow2

Créer un snapshot

# virsh snapshot-create-as VM_source Nom_snapshot "Déscription du snapshot" --atomic

Lister snapshot

# virsh snapshot-list VM_source

Restaurer snapshot

# virsh snapshot-revert VM_source Nom_snapshot

Éditer un snapshot

# virsh snapshot-edit windows7 snapshot1

Supprimer un snapshot

# virsh snapshot-delete windows7 snapshot1


Les variantes d'OS

# virt-install --os-variant list

win2k8               : Microsoft Windows Server 2008 (or later)
win2k3               : Microsoft Windows Server 2003
win7                 : Microsoft Windows 7 (or later)
vista                : Microsoft Windows Vista
winxp64              : Microsoft Windows XP (x86_64)
winxp                : Microsoft Windows XP
win2k                : Microsoft Windows 2000
openbsd4             : OpenBSD 4.x (or later)
freebsd9             : FreeBSD 9.x
freebsd8             : FreeBSD 8.x
freebsd7             : FreeBSD 7.x
freebsd6             : FreeBSD 6.x
freebsd10            : FreeBSD 10.x (or later)
solaris9             : Sun Solaris 9
solaris11            : Sun Solaris 11 (or later)
solaris10            : Sun Solaris 10
opensolaris          : Sun OpenSolaris (or later)
netware6             : Novell Netware 6 (or later)
netware5             : Novell Netware 5
netware4             : Novell Netware 4
msdos                : MS-DOS
generic              : Generic
altlinux             : ALT Linux (or later)
debianwheezy         : Debian Wheezy (or later)
debiansqueeze        : Debian Squeeze
debianlenny          : Debian Lenny
debianetch           : Debian Etch
fedora20             : Fedora 20 (or later)
fedora19             : Fedora 19
fedora18             : Fedora 18
fedora17             : Fedora 17
fedora16             : Fedora 16
fedora15             : Fedora 15
fedora14             : Fedora 14
fedora13             : Fedora 13
fedora12             : Fedora 12
fedora11             : Fedora 11
fedora10             : Fedora 10
fedora9              : Fedora 9
fedora8              : Fedora 8
fedora7              : Fedora 7
fedora6              : Fedora Core 6
fedora5              : Fedora Core 5
mes5.1               : Mandriva Enterprise Server 5.1 (or later)
mes5                 : Mandriva Enterprise Server 5.0
mandriva2010         : Mandriva Linux 2010 (or later)
mandriva2009         : Mandriva Linux 2009 and earlier
mageia1              : Mageia 1 (or later)
rhel7                : Red Hat Enterprise Linux 7 (or later)
rhel6                : Red Hat Enterprise Linux 6
rhel5.4              : Red Hat Enterprise Linux 5.4 or later
rhel5                : Red Hat Enterprise Linux 5
rhel4                : Red Hat Enterprise Linux 4
rhel3                : Red Hat Enterprise Linux 3
rhel2.1              : Red Hat Enterprise Linux 2.1
sles11               : Suse Linux Enterprise Server 11 (or later)
sles10               : Suse Linux Enterprise Server
opensuse12           : openSuse 12 (or later)
opensuse11           : openSuse 11
ubuntusaucy          : Ubuntu 13.10 (Saucy Salamander) (or later)
ubunturaring         : Ubuntu 13.04 (Raring Ringtail)
ubuntuquantal        : Ubuntu 12.10 (Quantal Quetzal)
ubuntuprecise        : Ubuntu 12.04 LTS (Precise Pangolin)
ubuntuoneiric        : Ubuntu 11.10 (Oneiric Ocelot)
ubuntunatty          : Ubuntu 11.04 (Natty Narwhal)
ubuntumaverick       : Ubuntu 10.10 (Maverick Meerkat)
ubuntulucid          : Ubuntu 10.04 LTS (Lucid Lynx)
ubuntukarmic         : Ubuntu 9.10 (Karmic Koala)
ubuntujaunty         : Ubuntu 9.04 (Jaunty Jackalope)
ubuntuintrepid       : Ubuntu 8.10 (Intrepid Ibex)
ubuntuhardy          : Ubuntu 8.04 LTS (Hardy Heron)
mbs1                 : Mandriva Business Server 1 (or later)
virtio26             : Generic 2.6.25 or later kernel with virtio
generic26            : Generic 2.6.x kernel
generic24            : Generic 2.4.x kernel 


Activer un système d'ordre de boot (pour faire du live cd ou PXE)

# virsh edit windows2012

Dans la section <os>, remplacer :

<type arch='x86_64' machine='pc-i440fx-2.1'>hvm</type>
<boot dev='hd'/>

Par :

<os>
  <type arch='x86_64' machine='pc-i440fx-2.1'>hvm</type>
  <boot dev='network'/>
  <boot dev='cdrom'/>
  <boot dev='hd'/>
  <bootmenu enable='yes'/>
</os>

Remarque: il suffit de changer l'ordre des sections pour varier l'ordre de boot.

L'iso à booter ce change dans la valeur <source> de la section <disk> (c'est la seul mention avec une extention en iso) Il est impératif d'éteindre completement la VM (avec un virsh shutdown <VM>) pour prendre en compte les changements au prochain démarrage.

Gérer le nombre de coeur de procésseurs et la quantité de RAM

Nombre de coeur de procésseurs

# virsh edit windows2012

Il faut mettre le nombre de coeurs dans la section <vcpu placement='static'>1</vcpu>

Quantité de RAM

2 modes : alloué et dynamique (aussi appelé ballooning).

Alloué

La quantité de RAM est résèrvé sur la RAM disponible de l'hote. Il faut modifier les 2 valeurs à ces sections (il faut mettre les même aux deux).

<memory unit='KiB'>1572864</memory>
<currentMemory unit='KiB'>1572864</currentMemory>

Dynamique/flotant

La RAM alloué est la valeur la plus petite précisé mais la VM peux réservé de la mémoire supplémentaire en fonction de ses besoins. Il faut modifier les deux valeurs des deux sections précédentes avec la mémoire maximum (le plafond de réservation) dans la section <memory> et la mémoire alloué (minimum réservé à la VM) dans la section <currentMemory>

<memory unit='KiB'>2097152</memory>
<currentMemory unit='KiB'>1000000</currentMemory>

Mettre le réseau de la VM en gigabyte

# virsh edit NOM_DE_LA_VM

Aller à la section <interface type='network'> du fichier xml de la vm (commande virsh edit ou vim /etc/libvirt/qemu/NOM_DE_LA_VM) et mettre "<model type='virtio'/>" à la place de ce qu'il y a.

Outil de gestion des disques des VM

Outils Qemu

Afficher informations disque

# qemu info VM.qcow2

Redimentionner disque qcow2 (ça sert à rien puisque le redimentionnement LVM ne fonctionne pas...)

# qemu-img resize VM.qcow2 +200G

Outils libvirt

Installer la librairie contenant les outils de gestions des disques qcow2

# apt install libguestfs-tools

Afficher les partitions d'un disque

# virt-list-partitions -lh /var/lib/libvirt/images/VM.qcow2

Ainsi que leur taux d'utilisation

# virt-df -h /var/lib/libvirt/images/VM.qcow2

Migration d'une VM sur un autre hyperviseur

Libvirt a besoin de deux éléments pour relancer une VM : son fichier xml et son disque qcow2 Le XML est stocké dans /etc/libvirt/qemu et le qcow2 est dans /var/lib/libvirt/images Il est toutefois recommandé d'utilisé cette commande pour le copier (je crois que c'est par ce que quand on fait un virsh edit les modifs ne se stock pas dans le XML en dur) :

# virsh dumpxml this-vm > /tmp/that-vm.xml

Copier les deux fichiers sur le nouvel hyperviseur (avec rsync ou scp). On constate après la copie que le qcow2 prend tout l'espace téhorique du disque au lieu de faire la taille des fichiers qu'il contient (mot clé : fichiers creux - http://uname.pingveno.net/blog/index.php/post/2015/06/10/Linux-%3A-d%C3%A9terminer-la-taille-r%C3%A9elle-d-un-fichier-creux).

---  Méthode que je déconseil car instable ---Pour reconstituer les espaces vides du disque il faut utiliser la commande suivante (on se trouve dans le /tmp du serveur sur lequel on migre la VM). Elle fait partie du paquet "libguestfs-tools" : 
# virt-sparsify windows72.qcow2 /var/lib/libvirt/images/windows72.qcow2

Je préfaire utiliser l'argument --sparse ou -S de rsync qui s'occupe de faire le transfère en prenant en compte cett propriété du qcow2. commande utilisée :

# rsync -avS --delete-after --stats --progress /var/lib/libvirt/images/mail-ycharbi.qcow2  root@192.168.1.28:'/var/lib/libvirt/images/'

Un qcow2 a donc été créé à l'emplacement indiqué sur le serveur qui va prendre la relève du précédent. Il ne reste plus qu'a importer le XML pour que la VM puisse être lancé (on se trouve dans le /tmp du serveur sur lequel on migre la VM) :

# virsh define windows7_2.xml 

Le fichier XML a été copié dans sont emplacement standard (/etc/libvirt/qemu) et la VM se trouve bien dans la liste des VM disponibles :

# virsh list --all

Il convient biensur de tester le bon fonctionnement de la VM après cette opération. On peut supprimer le fichier xml et qemu se trouvant dans /tmp.

Problèmes rencontrés

  • Erreur de démarrage lié à l'absence de l'ISO monté dans le lecteur CD de la VM. Il suffi de faire un virsh edit et de virer cet ISO.
  • Erreur lors de l'execution sur mon I7 Nehalem qui ne supporte pas les instructions aes :
error: Failed to start domain gnome-builder
error: unsupported configuration: guest and host CPU are not compatible: Host CP
U does not provide required features: aes

(ceci n'impacte en rien la migration puisque la VM sera de nouveau transféré sur le serveur après formatage et donc ce sera le même processeur qui executera la VM. Il n'y aura donc pas d'erreur. Cependant si on veux tester (après copie) que la VM se lance bien, on peut faire un virsh edit sur la section <cpu> et supprimer ce qu'elle contient.

  • Erreur lors de la création de la première nouvelle VM après avoir importé celle de l'ancien serveur. Après avoir importé les anciènes VM, virtlib importe également ce qu'ils appel un pool (c'est un concept inventé pour compliqué cette usine à gaz et causer des problèmes alors que ça sert à rien). Ca génère cette erreur :
Error: --disk /var/lib/libvirt/images/debian-gambas.qcow2,format=qcow2,size=40: Couldn't create default storage pool '/var/lib/libvirt/images': Could not define storage pool: operation failed: Storage source conflict with pool: 'images'

Pour régler cette merde il faut supprimer le pool. La création de la VM le recréra automatiquement. Cela n'impacte en rien le fonctionnement des VM importé (testé et approuvé) :

# virsh pool-list
# virsh pool-dumpxml <pool-name>
# virsh pool-destroy <pool-name>
# virsh pool-undefine <pool-name>