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
Administration à distance du serveur :
$ virsh --connect qemu+ssh://root@server/system
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
| 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) |
Liste des différents types de pools et volumes supportés par libvirt : Storage Management.
| Commande | Action |
|---|---|
pool-refresh <pool> |
Rafraîchi la liste des volumes |
domblklist <domain> --details |
Affiche les devices de type block |
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>
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>
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>
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>
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 VMqemu+ssh://192.168.1.13/system est le système cibletcp://192.168.1.13 : URI de la destination vu depuis le client ou la sourceNote : 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
| Commande | Action |
|---|---|
snapshot-list <domain> --tree |
Liste les snapshots du domaine |
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 domainevm01-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 snapshotNote : 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
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
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.
$ virsh qemu-monitor-command --hmp <domain> 'info kvm'