Rendre KVM utilisable en utilisateur simple avec LVM et VDE

But de l'opération

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).

La partie VDE

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.

Version interactive

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.

Version automatique via /etc/network/interfaces

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.

La partie LVM

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:

udevinfo --export-db
liste tous les périphériques détectés;, avec sous "P" son chemin (option --path ci-dessous) et sous "N" son nom (option --name ci-dessous
udevinfo --attribute-walk [--path=...|--name=...]
liste les attributs permettant de repérer le périphérique dans les règles udev (SUBSYSTEM, KERNEL ...)
udevinfo --query=all [--path=...|--name=...]
permet pour le périphérique de lister les informations (P et N comme ci-dessus, S pour les symlinks générés, E pour l'environnement (voir ENV{DM_NAME} pour repérer un volume). Dans udev, pour les volumes logiques, ces informations (E) sont chargées par la ligne IMPORT{program}="/sbin/dmsetup export -j $major -m $minor dans /etc/udev/rules.d/65_dmsetup.rules.

Détails techniques sur LVM

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.

Lancement de KVM

Lancer la commande vdekvm à la place de kvm (c'est un wrapper). Les options relatives au réseau sont: -net nic,macaddr=00:16:3e:00:00:01,model=e1000 -net vde,sock=/tmp/vde.ctl. Il faut veiller, comme à l'ordinaire, à ce que chaque carte réseau connectée au switch ait une adresse MAC différente.

Julien De Bona - http://debona.dyndns.org - e-mail: julien(chez)bawet(point)org - Jabber: julien@debona.dyndns.org

Valid XHTML 1.0 Strict Valid CSS! Powered by Debian Powered by Linux Powered by Apache Created with Vim