Debian et machine virtuelle KVM
Tags : bridge, Debian, kvm, virtualisation
Ayant dernièrement acheté une nouvelle configuration (Intel Core2Quad Q6600 sur ASRock 4CoreDual-SATA2) j'ai, bien entendu, décidé d'enfin jouer un peu avec la virtualisation et Xen 3.1. Malheureusement le kernel Xen basé sur un 2.6.18 n'intègre pas de support pour le contrôleur IDE de la carte mère (VIA vt8237s). On remarquera que le support existe dans des nouveau kernel mais ainsi qu'un hack pour le 2.6.18. Ubuntu dispose également d'un 2.6.22 "xenifié" sous forme de paquet .deb.
Ceci étant, plutôt que de le lancer dans d'immondes bidouilles j'ai tourné mon regard vers KVM, le support de virtualisation intégré au kernel. El là, suprise ! C'est convi, rapide et simple.
Installation des outils userspace :
% apt-get install kvm qemu
Chargement du module pour le support VT Intel :
% modprobe kvm-intel
Création d'une image disque de 5 giga en CoW (Copy on Write) pour économiser de la place (les 5Go ne sont pas réellement utilisés mais uniquement l'espace effectivement occupé par les données de l'image disque):
% qemu-img create disk.cow 5G
Lancement de kvm avec utilisation de l'image ISO d'installation de Debian 4.0 (avec 512Mo de mémoire pour le système) :
% kvm -hda disk.cow -cdrom /path/debian-40r1-i386-businesscard.iso -boot d -m 512
Installation classique minimale Debian... et enfin utilisation du système via :
% kvm -hda disk.cow -m 512
La configuration par défaut est entièrement automatique. Le système hébergé reçoit une adresse IP via DHCP et le routage est automatique. Ainsi la distribution Debian peut directement être mise à jour. C'est le système de routage userspace de KVM/QEMU. Ceci n'est pas très satisfaisant à mon goût.
Ne disposant que d'une seule interface ethernet matérielle dans le système hôte (nommée eth1 en raison d'un problème udev dont je parlerai pas ailleurs) l'idée de base est de créer un bridge ethernet reliant eth1 et une interface TUN/TAP.
Phase 1, on installe le paquet uml-utilities contenant l'utilitaire tunctl :
% apt-get install uml-utilities
On descend ensuite le réseau façon Debian :
% /etc/init.d/network stop
Puis on change /etc/network/interfaces comme ceci :
auto lo eth1 tap10 br0 iface lo inet loopback iface tap10 inet manual pre-up tunctl -b -u denis -t tap10 pre-up ifconfig tap10 up post-down tunctl -d tap10 iface br0 inet static bridge_ports eth1 tap10 bridge_maxwait 0 address 192.168.0.1 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.10 iface eth1 inet manual
Dans l'ordre, on configure le loopback puis eth1. On créé ensuite tap10 (tap0 est utilisé par ailleurs avec OpenVPN) et on bridge eth1 et tap10 en donnant une adresse au bridge. eth1 et tap10 sont donc maintenant physiquement connecté au même hub virtuel. tap10 est "le bout de câble" connecté à notre eth0 dans le système Debian tournant dans la KVM. On démarre celui-ci avec :
% kvm -hda disk.cow -m 512 -net nic -net tap,ifname=tap10
Dans le /etc/network/interfaces du système on trouve :
iface eth0 inet static address 192.168.0.200 netmask 255.255.255.0 network 192.168.0.0 broadcast 192.168.0.255 gateway 192.168.0.10
Et voilà, le tour est joué. Le système KVM est accessible depuis le système hôte via 192.168.0.200 comme s'il était sur le réseau (en fait, il l'est via le bridge).