Qemu

De Wiki doc

Révision datée du 1 février 2018 à 18:05 par Ycharbi (discussion | contributions) (Ajouts de l'arborescence de travail; du chemin des scripts ainsi que la suppression de 4 prompts root)

Prérequis

Installation

Qemu est disponible dans les dépôts Debian

apt install qemu-system-x86-64

Création de l’arborescence de travail (c'est un choix personnel, l’intérêt de cette solution est justement qu'elle n'impose rien)

mkdir -p /etc/qemu/{iso,disques,machines}

Script réseau

Pour que la machine virtuelle puise se connecter sur Open vSwitch, des scripts sont a créer.

INFORMATION

Ce script met dynamiquement les interfaces réseaux dans le VLAN indiqué dans la variable ifname de la commande de démarrage d'une machine virtuelle. Il suffit de mettre l'id du VLAN après un trait de soulignement pour que le script puisse le gérer. Dans l'exemple, ma machine sera dans le VLAN 180.

ASTUCE

Les scripts peuvent être dans l'arborescence que vous voulez puisque vous spécifiez leur chemin dans la commande de démarrage de la machine virtuelle.

Script de démarrage de l’interface

vim /etc/qemu/qemu-ifup
#!/bin/sh
#Séparation du nom de l'interface de l'id du VLAN utilisé
#nomIface=`echo $1 | cut -f 1 -d '_'`
idVlan=`echo $1 | cut -f 2 -d '_'`

OVSCOMMUT=br0
OVSTAG=$idVlan
echo "Execution de /etc/qemu/qemu-ifup"
echo "Allumage de $1 pour l'ajout au pont OVS..."
ip link set $1 up promisc on
echo "Ajout de $1 à ${OVSCOMMUT}..."
ovs-vsctl --may-exist add-br ${OVSCOMMUT}
ovs-vsctl --if-exists del-port ${OVSCOMMUT} $1
ovs-vsctl --may-exist add-port ${OVSCOMMUT} $1
ovs-vsctl --if-exists set port $1 tag=${OVSTAG}
sleep 2

Variables:

  • OVSCOMMUT : interface de votre commutateur virtuel
  • OVSTAG : numéro du Vlan

Script de d'arrêt de l’interface

vim /etc/qemu/qemu-ifdown
#!/bin/sh
OVSCOMMUT=br0
echo "Execution de /etc/qemu/qemu-ifdown"
echo "Arrêt de $1 pour la suppression au pont OVS..."
ip link set $1 down
echo "Suppression de $1 à ${OVSCOMMUT}..."
ovs-vsctl --if-exists del-port ${OVSCOMMUT} $1
echo "Suppression de $1..."
ip link delete dev $1

Variable:

  • OVSCOMMUT : interface de votre commutateur virtuel

Modifier les droits

Ajouter les droits d’exécutions aux scripts

chmod +x /etc/qemu/qemu-if*

Création d'une machine virtuelle

Création d'un disque virtuel

qemu-img create -f qcow2 hdd.qcow2 10G

Paramètres:

  • -f qcow2 : type du disque vituel
  • hdd.qcow2 : nom de l'image disque
  • 10G : taille attribué au disque

Démarrage de la machine virtuelle

Démarrage classique

qemu-system-x86_64 -m 1024 -name host1 -vnc :6 --enable-kvm -cpu host -smp cores=2,threads=1,sockets=1 -net nic,macaddr=52:54:00:12:34:56 -net tap,ifname=host1_180,script=/etc/qemu/qemu-ifup,downscript=/etc/qemu/qemu-ifdown -boot c --cdrom /etc/qemu/iso/debian-live-8.7.1-amd64-lxde-bureau.iso -hda /etc/qemu/disques/hdd.qcow2

Paramètres:

  • -m 1024 : mémoire attribué a la machine virtuelle (en octets)
  • -name : nom de la machine virtuelle
  • -vnc :6 : Utilisation de VNC sur le port 5906
  • --enable-kvm : Permet la prise en charge des instructions de virtualisation du processeur
  • -cpu host : Émule un processeur KVM avec théoriquement les mêmes fonctionnalités que l'hôte (ne fonctionne qu'avec le paramètre --enable-kvm). Voir le paramètre -cpu help pour la liste des possibilités
  • -smp cores=2,threads=1,sockets=1 : Émule un multiprocesseur symétrique à mémoire partagée (on peut mettre plusieurs cœurs et plusieurs processeurs sur une machine)
  • -net nic,macaddr=52:54:00:12:34:57 : l'adresse MAC de la machine virtuelle (voir)
  • -net tap,ifname=host1-eth0,script=/etc/qemu/qemu-ifup,downscript=/etc/qemu/qemu-ifdown : nom de l'interface réseau sur la machine maître (limité à 15 caractères) suivie des scripts précédemment créés
  • -boot c : Démarre sur le disque dur. Le disque étant vierge, il démarre le cdrom pour l'installation et redémarrera sur le disque dur la prochaine fois (valeurs possible : c|d|n - disque principal|cdrom|réseau)
  • --cdrom /srv/iso/debian-live-8.7.1-amd64-lxde-bureau.iso : lien vers l'ISO du CD-ROM
  • -hda /root/hdd.qcow2 : lien vers le disque virtuel précédant créé

Démarrage sur squashfs

qemu-system-x86_64 -m 1024 -name pxe-doc -vnc :3 --enable-kvm -cpu host -smp cores=1,threads=1,sockets=1 -net nic,macaddr=52:54:00:12:34:53 -net tap,ifname=pxe-doc_182,script=/etc/qemu/qemu-ifup,downscript=/etc/qemu/qemu-ifdown -boot c -append 'root=/dev/sda net.ifnames=0' -kernel /var/lib/lxc/lxc-pxe/rootfs/srv/tftp/noyaux/stretch/vmlinuz-4.13.0-custom -initrd /var/lib/lxc/lxc-pxe/rootfs/srv/tftp/noyaux/stretch/initrd.img-4.13.0-custom -hda /var/lib/lxc/lxc-pxe/rootfs/srv/tftp/images/stretch-pxe.squashfs

Les 3 éléments importants sont:

  • -append: définit les paramètres du noyau. Le pré-requis indispensable est la valeur root=/dev/sda qui va indiquer au noyau d'utiliser ce périphérique comme / (il est émulé. Il n'existe pas réellement).
  • -kernel: Indique le chemin du noyau
  • -initrd: Indique le chemin de l'image initrd

Arrêt de la machine virtuelle

L’arrêt s'effectue via la fonction dédiée à chaque système émulé. Pour forcer l’extinction, effectuer un CTRL+C.

Modes d'affichage

Qemu supporte divers modes d'affichage. En l'absence de précisions, il utilisera le gestionnaire de fenêtre de l'interface graphique si présente, sinon, il se terminera en erreur. Il est également possible d'exécuter une machine virtuelle sans affichage ou via le réseau.

Affichage classique

Comme précisé, l'affichage classique s'effectuera en l'absence de paramètre d'affichage. Dans ce mode, une fenêtre Xorg s'ouvrira et le fait de la fermer, terminera le processus de la machine virtuelle (extinction électrique).

qemu-system-x86_64 -m 512 --boot n --enable-kvm

Aucun affichage

Je ne vois pas trop dans quel cas cela peut être utile mais bon, si vous voulez lancer une machine sans support graphique il faudra utiliser l'option -nographic. Je précise que lors de mon test, le seul moyen de fermer la machine a été de tuer son processus (un <ctrl><c> n'ayant pas fonctionné)...

qemu-system-x86_64 -m 512 --boot n --enable-kvm -nographic

Affichage réseau

Via VNC

C'est l'affichage que j'ai utilisé pour mon exemple dans le démarrage d'une machine virtuelle. Il est possible de sécuriser l'accès à cet affichage via mot de passe et TLS.

qemu-system-x86_64 -m 512 --boot n --enable-kvm -vnc :0

Le :0 est en fait le numéro de port en omettant le début qui est standard à VNC. Lire 5900. Si cela avais été :6, le port aurai été 5906.

Pour la partie cliente, on peut utiliser Vinagre ou gvncviewer

gvncviewer 127.0.0.1:0

Accès par mot de passe

J'ai testé mais n'ai été convaincu par cette possibilité. D'apprès la documentation, l'ajout du paramètre password aurai pour effet de demandé un mot de passe (limité à 8 caractères maximums) à l'exécution de la machine (ce qui n'arrive pas). Donc j'en déduis que ça ne fonctionne pas et de toute façon la sécurité est jugé merdique par les dévelopeurs eux même donc aucun intéret. Si vous voulez de la sécurité, utilisez SPICE ou passé par de la tunnellisation (SSH ou VPN) qui elle est sécurisé.

Pour la partie cliente, on peut utiliser Vinagre ou spice-client-gtk (qui s'utilise via la commande spicy).

Accès via TLS

Usant de VNC uniquement dans mon réseau local ou via un VPN, je n'ai pas besoin de cette fonctionnalité et je ne l'ai pas testé. Si le cœur vous en dit, vous trouverez les explications ici.

Via SPICE

SPICE est le protocole d'affichage historique de KVM. Il a été développé par la société Qumranet (qui a également créé KVM) et libéré par Red Hat qui a racheté l'entreprise le 4 septembre 2008.

Accès sans mot de passe

Partie serveur

qemu-system-x86_64 -m 512 --boot n --enable-kvm -spice port=5905,addr=0.0.0.0,disable-ticketing

Avec addr=0.0.0.0, on autorise les connexions de n'importe quelle adresse cliente.

Partie cliente

spicy -h 127.0.0.1 -p 5905

Accès par mot de passe

Partie serveur

qemu-system-x86_64 -m 512 --boot n --enable-kvm -spice port=5905,addr=0.0.0.0,password=secret123

Partie cliente

spicy -h 127.0.0.1 -p 5905 -w secret123

Accès via TLS

Non testé mais peut être intéressante.

Source de la section

Sources