Libvirt
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 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>