Je désire lancer des machines virtuelles avec KVM avec les contraintes suivantes:
L'intérêt réside, en utilisation desktop, de pouvoir lancer des machines virtuelles sans se prendre la tête, et en utilisation serveur de mieux isoler les machines virtuelles (que l'utilisateur peut par exemple faire ouvrir un fichier quelconque en tant que disque dur).
Les deux derniers points empêchent le premier: il faudrait lancer kvm en root ou utiliser sudo pour bridger l'interface tap de la machine virtuelle avec le réseau physique, et les volumes LVM sont par défaut attribués à l'utilisateur root et au groupe disk. Et donner à un utilisateur l'appartenance au groupe disk est un peu large à mon goût.
Le tout se passe sous Debian 5.0 Lenny AMD64. KVM et LVM sont déjà installés et configurés (voir mon aide-mémoire LVM).
VDE (http://www.virtualsquare.org/) permet de créer des switches virtuels. Sur ce switch, on peut connecter des processus non privilégiés et des interfaces réseaux tap. VDE est fourni par le paquet vde2.
Pour démarrer un switch virtuel et le bridger (opération à faire en root; déconfigurer préalablement l'interface réseau physique (ici: eth0)):
# Créer et activer une interface tap
vde_tunctl -t tap0
ifconfig tap0 up
ifconfig eth0 up
# Créer le bridge
brctl addbr br0
# Ajouter les interfaces au bridge
brctl addif br0 eth0
brctl addif br0 tap0
# Démarrer le switch et le connecter à tap0
vde_switch -d -s /tmp/vde.ctl -t tap0 -M /tmp/vde.mgmt -m 666
Cette dernière commande lance à l'arrière-plan (-d) un switch nommé /tmp/vde.ctl et gérable par une socket UNIX /tmp/vde.mgmt. Il a les permissions 666 pour que tout le monde puisse s'y connecter. On peut aussi créer pour les tests un switch à l'avant-plan en laissant tomber les options -d et -M (et la gestion se fait sur les entrées et sorties standards au lieu de la socket UNIX).
Pour contrôler le switch, on peut s'y connecter avec la commande unixterm (dans ce cas: unixterm /tmp/vde.mgmt).
vde_tunctl, lui, est une copie de la commande tunctl du package uml-utilities.
Voici un exemple de définition du bridge dans /etc/network/interfaces:
auto br0
iface br0 inet static
address 192.168.128.6
netmask 255.255.255.0
gateway 192.168.128.1
bridge_ports eth0 tap0
dns-nameservers 192.168.128.1
pre-up vde_tunctl -t tap0
pre-up ifconfig tap0 up
pre-up vde_switch -d -s /tmp/vde.ctl -t tap0 -M /tmp/vde.mgmt -m 666
post-down echo shutdown|unixterm /tmp/vde.mgmt
post-down ifconfig tap0 down
post-down vde_tunctl -d tap0
Il faut également retirer la définition de l'interface eth0 de ce fichier.
NB: dans ce qui suit, lv désigne le nom du volume logique et vg le nom du groupe de volumes.
Le problème à résoudre est de donner les permissions désirées aux volumes logiques. Le temps du /dev statique étant révolu, ça passe par la configuration d'udev. Les règles pour le LVM sont situées dans /etc/udev/rules.d/65_dmsetup.rules. On peut par exemple y ajouter ce qui suit après la ligne IMPORT{program="/sbin/dmsetup export -j $major -m $minor":
#Tous les volumes logiques appartiennent à julien:
KERNEL=="dm-*", OWNER="julien"
# Le LV spécifié appartient au groupe julien:
ENV{DM_NAME}=="nom_vg-nom_lv", GROUP="julien"
# Avoir un lien symbolique /dev/nom_lg-nom_lv par commodité
SYMLINK+="$env{DM_NAME}'
Les informations pour repérer les critères disponibles pour idendifier les volumes dans udev sont disponibles comme suit:
Les périphériques de type /dev/mapper/vg-lv et /dev/vg/lv ne sont pas gérés par udev, mais probablement par LVM lui-même. On n'arrivera donc pas à utiliser ces périphériques en simple utilisateur à moins de trouver la configuration équivalente dans LVM. Udev gère des périphériques /dev/dm-*, d'où la création de symlinks plus commodes que les liens à rallonge /dev/disk/by-id/dm-name-vg-lv.
Julien De Bona - http://debona.dyndns.org - e-mail: julien(chez)bawet(point)org - Jabber: julien@debona.dyndns.org