LibVirtKVM

Voici un petite page avec quelques tips sur LibVirt/KVM

LibVirt

LibVirt peut utiliser dnsmasq pour l'attribution des IP si les VMs sont configurées via le DHCP. Pou retourver toutes les infos de son résueau:
tail  -n 1000 /var/lib/libvirt/dnsmasq/*

Activer le port serial sur les VMs

Il y'a un peu de conf à faire sur l'hyperviseur, et aussi sur la VM, pour lui dire de bien écouter sur le bon terminal.

  1. Dans la conf de la machine, il faut rajouter une console de type serial:
        <serial type='unix'>
          <source mode='bind' path='/var/lib/libvirt/sockets/jeztest1-clone.serial'/>
          <target port='0'/>
        </serial>
        <console type='unix'>
          <source mode='bind' path='/var/lib/libvirt/sockets/jeztest1-clone.serial'/>
          <target type='serial' port='0'/>
        </console>
    
  2. Il faudra ensuite créer le dossier et lui mettre les bon droits:
    mkdir /var/lib/libvirt/sockets/
    chown libvirt-kvm  /var/lib/libvirt/sockets/
  3. Au niveau de la machine cliente, qui sera sous Debian, il faudra modifier la conf des tty et de grub:
    echo "
    # Configure TTY
    GRUB_TERMINAL=serial
    GRUB_SERIAL_COMMAND="serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1"
    GRUB_CMDLINE_LINUX="console=tty0 console=ttyS0,19200n8"
    " >> /etc/default/grub
    sed -i 's/1:2345:respawn:/sbin/getty 38400 tty0/1:2345:respawn:/sbin/getty 38400 ttyS0/ /etc/inittab
    update-grub2
  4. Une fois que c'est fait, on relance la VM, et depuis l'hypervieur, on va récupérer tout ça grâce à minicom:
    minicom -D unix#/var/lib/libvirt/sockets/jeztest1-clone.serial
    

Arguments de KVM dans la conf libvirt

On peut normalement rajouter des arguments, directement dans la conf de libvirt:
<domain type='kvm' xmlns:qemu='http://libvirt.org/schemas/domain/qemu/1.0'>
[...] # Et tout à la fin ...
  <qemu:commandline>
    <qemu:arg value='-serial'/>
    <qemu:arg value='unix:/var/lib/libvirt/sockets/jeztest1-clone.serial,server,nowait'/>
  </qemu:commandline>
</domain>

Networking avec Virtio et checksum UDP

Il se trouve que lorsque deux VMs se parlent a travers le réseau via le driver virtio, le checksum des trames IP n'est plus calculé. En effet, les paquets ne sortant pas de l'hyperviseur n'ont pas besoin de calculer leur checksum, vu que la communication est fiable. Seul soucis, c'est que certains programmes valident que le checksum soit bon, typiquement le client isc-dhcp. Ce qui provoque des erreurs de type dhcpd: 5 bad udp checksums in 5 packets, et qui empeche le client de chopper une IP. Il y'a plusieurs solutions a ce problème:

  • Forcer le calcul des packets UDP (DHCP) dans la table mangle en sortie du traffic du routeur. Une bonne solution, mais impossible a faire sur ma distrib OpenWRT.
  • Ne pas utiliser le driver virtio, mais bon, ca serait trop moche.
  • Monter en version le client DHCP. C'est la solution que j'ai choisie, sachant que j'ai le controle sur les OS de mon infra. Si j'ai besoin de monter une vieille distro, ça se fera via un driver ethernet non Virtio, et c'est pas grave vu que ça sera du temporaire.
  • Reactiver la gestion du calcul des checksum à l'OS plutot qu'a la carte réseau, mais bon on perd l'avantage de la vitesse de la virtualisation.
  • Désactiver la vérification des checksums coté client, mais bon, c'est pas terrible, car on le desactive pour tout ou pour rien. Le checksum peut etre utilisé par des connections venant d'internet, donc pas viable non plus.
  • Patcher le driver virtio pour qu'ils renvois un checksum égale à 0 au lieu de mettre de la merde dans l'entête.
  • Forcer les interfaces du routeur à ne pas faire de CheckSum Offloading: ethtool -K eth1 tx off

Voila, sinon, je me demande vraiment pourquoi le packet n'est pas patché sur une Debian Jessie, alors que le problème est connu depuis un bout bout de temps (au moins 2012) ...

Plus d'infos ici: http://docs.gz.ro/node/282

KVM

Alors, je vous le dit tout de suite, installez la version 1.7 des backports de Debian, sinon, vous resterez en version 1.2, ce qui est très vieux.

Pour voirs avec quels arguments sont lancés les VM:
# La commande de base
ps aux | grep kvm
# Exemple avec selection su le nom de la VM, et un joli affichage dans le terminal:
ps aux | grep nom_vm | sed 's/ -/\n-/g'
Un exemple de conf:
/usr/bin/kvm
-id 605
-chardev socket,id=qmp,path=/var/run/qemu-server/605.qmp,server,nowait
-mon chardev=qmp,mode=control
-vnc unix:/var/run/qemu-server/605.vnc,x509,password
-pidfile /var/run/qemu-server/605.pid
-daemonize
-name sehprdbdd1
-smp sockets=1,cores=4
-nodefaults
-boot menu=on
-vga cirrus
-cpu kvm64,+x2apic,+sep
-k fr
-m 8192
-serial unix:/var/run/qemu-server/605.serial,server,nowait
-device piix3-usb-uhci,id=uhci,bus=pci.0,addr=0x1.0x2
-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
-drive file=/VMs/images/605/vm-605-disk-1.qcow2,if=none,id=drive-virtio0,format=qcow2,aio=native,cache=none
-device virtio-blk-pci,drive=drive-virtio0,id=virtio0,bus=pci.0,addr=0xa,bootindex=100
-netdev type=tap,id=net0,ifname=tap605i0,script=/var/lib/qemu-server/pve-bridge,vhost=on
-device virtio-net-pci,mac=DE:AD:BE:EF:97:E9,netdev=net0,bus=pci.0,addr=0x12,id=net0,bootindex=300
Page last modified on April 24, 2016, at 09:37 PM EST