libvirt

Installation

Installation de libvirt via les dépôts :

# apt-get install libvirt-bin virtinst

Installation de libvirt par compilation des sources :

Télécharger les sources sur libvirt.org.

# apt-get install -y libxml2-dev libyajl-dev libgnutls-dev libdevmapper-dev libcurl4-gnutls-dev python-dev libnl-dev
# tar xvzf libvirt-*.tar.gz
# cd libvirt-*
# ./configure --prefix=/usr --localstatedir=/var --sysconfdir=/etc --with-storage-iscsi
# make
# make install

Ajout du daemon libvirt-bin au démarrage du serveur :

# wget http://uploads.lightcode.fr/articles/26-Introduction-a-libvirt/libvirt-bin.init \
    -O /etc/init.d/libvirt-bin
# chmod +x /etc/init.d/libvirt-bin
# update-rc.d libvirt-bin defaults

Ajouter un fichier /etc/default/libvirt-bin :

start_libvirtd="yes"
libvirtd_opts="-d"

Pour activer l’auto-complétion de la commande virsh :

# wget http://uploads.lightcode.fr/articles/26-Introduction-a-libvirt/virsh.completion \
    -O /etc/bash_completion.d/virsh && chmod +x /etc/bash_completion.d/virsh

Généralités

Administration à distance du serveur :

$ virsh --connect qemu+ssh://root@server/system

Gestion des domaines

Création d’une machine

Exemple de création de machine :

sudo virt-install \
    -n devstack-odl \
    --ram=6144 \
    --vcpus=2 \
    --import \
    --disk /var/lib/libvirt/images/devstack.qcow2 \
    --network default \
    --graphics vnc,port=5901

Commandes

Commande Action
start <domain> Démarre le domaine
destroy <domain> Arrête le domaine
vncdisplay <domain> Affiche le numéro de l’écran VNC
undefine <domain> Enlève un domaine de l’inventaire
dumpxml <domain> Affiche la configuration du domaine
create <file> Créer un domaine temporaire à partir de la configuration
define <file> Créer un domaine à partir de la configuration
domifaddr <domain> Lister les adresses IP d’un domaine (nécessite qemu-ga)

Gestion du stockage

Liste des différents types de pools et volumes supportés par libvirt : Storage Management.

Commandes

Commande Action
pool-refresh <pool> Rafraîchi la liste des volumes
domblklist <domain> --details Affiche les devices de type block

Répertoire

Description du pool :

<pool type="dir">
  <name>pool-local</name>
  <target>
    <path>/var/kvm/storage/pool-local</path>
  </target>
</pool>
# virsh pool-define pool-local.xml
# virsh pool-start pool-local
# virsh pool-autostart pool-local
# virsh vol-create-as pool-local vol-testdeb-01 12G --format qcow2

A ajouter dans le domaine :

<disk type="volume" device="disk">
  <driver name="qemu" type="qcow2" />
  <source pool="pool-local" volume="vol-testdeb-01" />
  <target dev="vda" bus="virtio" />
</disk>

NFS

Exemple de pool NFS :

<pool type="netfs">
  <name>pool-vm-nfs</name>
  <source>
    <host name="192.168.1.10" />
    <dir path="/volume1/sisko/pool-vm-nfs" />
    <format type="nfs" />
  </source>
  <target>
    <path>/var/kvm/storage/pool-vm-nfs</path>
  </target>
</pool>

iSCSI

Description du pool :

<pool type="iscsi">
  <name>pool-iscsi</name>
  <source>
    <host name="192.168.1.10" />
    <device path="iqn.2000-01.com.synology:diskstation.sisko" />
  </source>
  <target>
    <path>/dev/disk/by-path</path>
  </target>
</pool>
# virsh pool-define pool-iscsi.xml
# virsh pool-start pool-iscsi
# virsh pool-autostart pool-iscsi
# virsh vol-list pool-iscsi

Ajout dans le domaine :

<disk type="volume" device="disk">
  <driver name="qemu" type="raw" />
  <source pool="pool-iscsi" volume="unit:0:0:1" mode="host" />
  <target dev="vda" bus="virtio" />
</disk>

Gestion des réseaux

Il faut d’abord créer un fichier XML définissant le réseau. Voici un exemple utilisant Open vSwitch :

<network>
  <name>ovs-net</name>
  <forward mode="bridge" />
  <bridge name="sw0" />
  <virtualport type="openvswitch" />
  <portgroup name="router-trunk">
    <vlan trunk="yes">
      <tag id="421" />
      <tag id="422" />
    </vlan>
  </portgroup>
  <portgroup name="prod">
    <vlan>
      <tag id="421" />
    </vlan>
  </portgroup>
</network>
# virsh net-define network.xml
# virsh net-start ovs-net
# virsh net-autostart ovs-net

Configuration du domaine :

<interface type="network">
  <mac />
  <source network="ovs-net" portgroup="router-trunk" />
  <virtualport type="openvswitch" />
</interface>

Migration de VM

Exemple de migration :

# virsh migrate --live migr01 qemu+ssh://192.168.1.13/system tcp://192.168.1.13 --unsafe
  • --live : permet la migration pendant l’exécution de la VM
  • qemu+ssh://192.168.1.13/system est le système cible
  • tcp://192.168.1.13 : URI de la destination vu depuis le client ou la source

Note : sous Debian, l’outils nc installé par défaut ne permet pas de faire les migrations. Il faut pour cela installer netcat-openbsd :

# apt-get install netcat-openbsd

Gestion des snapshots

Commandes

Commande Action
snapshot-list <domain> --tree Liste les snapshots du domaine

Création d’un snapshot de disque externe

Créé un nouveau snapshot :

# virsh snapshot-create-as --domain vm01 vm01-snap-02 --disk-only \
    --diskspec vda,file=/var/kvm/storage/snapshots/vm01-snap-02.qcow2 --atomic

Les options :

  • --domain vm01 : spécifie le nom du domaine
  • vm01-snap-02 : nom du snapshot
  • --disk-only : garde l’état du disque seulement et non de toute la VM
  • --diskspec vda,file=/var/kvm/storage/snapshots/vm01-snap-02.qcow2 : cible du disque et le fichier dans lequel mettre le snapshot

Note : si l’on veut effectuer le backup de la VM, il faudra synchroniser l’avant-dernier snapshot, pas le courant ni le disque dur de base.

Synchroniser les modifications :

# virsh blockpull --domain vm01 --path /var/kvm/storage/snapshots/vm01-snap-02.qcow2 \
    --base /var/kvm/storage/pool-local/vm01-main.qcow2 --verbose --wait

Cette commande permet de synchroniser les modifications entre vm01-main.qcow2 et vm01-snap-02.qcow2 et de les ajouter au snapshot. Ici, les modifications sont contenue dans le disque vm01-snap-01.qcow2.

Suppression des snapshots :

# virsh snapshot-delete vm01 vm01-snap-01 --metadata
# rm /var/kvm/storage/snapshots/vm01-snap-01.qcow2

Restauration d’un snapshot de disque externe

Changer le backing file d’une image :

# qemu-img rebase -b git-main.qcow2 git-snapshot.qcow2

Contrôle :

# qemu-img info git-snapshot.qcow2

Envoyer les modifications vers le disque git-main.qcow2 :

# qemu-img commit git-snapshot.qcow2

Interface avec QEMU

QEMU Guest Agent

Pour utiliser QEMU Guest Agent, il faut installer le paquet qemu-guest-agent sur votre système.

Il faut également ajouter ce code à votre domaine :

<channel type='unix'>
   <source mode='bind'/>
   <target type='virtio' name='org.qemu.guest_agent.0'/>
</channel>

Afficher les informations sur les interfaces réseaux :

$ virsh qemu-agent-command <domain> --pretty '{"execute":"guest-network-get-interfaces"}'

Récupérer la liste des commandes disponibles :

$ virsh qemu-agent-command <domain> --pretty '{"execute":"guest-info"}'

Lire/écrire un fichier :

$ virsh qemu-agent-command <domain> '{"execute":"guest-file-open", "arguments":{"path":"/etc/hosts","mode":"r"}}'
$ virsh qemu-agent-command <domain> '{"execute":"guest-file-read", "arguments":{"handle": 1000}}'
$ virsh qemu-agent-command <domain> '{"execute":"guest-file-close", "arguments":{"handle":1000}}'

Pour écrire, il suffit d’utiliser un qemu-agent-command :

$ virsh qemu-agent-command <domain> '{"execute":"guest-file-write", "arguments":{"handle":1000,"buf-b64":"abcdefghijklmnopqrstuvwxyz"}}'

Liste des commandes : guest-set-vcpus, guest-get-vcpus, guest-network-get-interfaces, guest-suspend-hybrid, guest-suspend-ram, guest-suspend-disk, guest-fstrim, guest-fsfreeze-thaw, guest-fsfreeze-freeze, guest-fsfreeze-status, guest-file-flush, guest-file-seek, guest-file-write, guest-file-read, guest-file-close, guest-file-open, guest-shutdown, guest-info, guest-set-time, guest-get-time, guest-ping, guest-sync, guest-sync-delimite.

QEMU Monitor Protocol (QMP)

$ virsh qemu-monitor-command --hmp <domain> 'info kvm'

Sources

Compléments