Qemu/KVM

KVM - Qemu
Simuler une machine complète pour avoir son propre environnement d’exécution.
Les avantages sont nombreux, isolations des processus, plusieurs environnements différents, etc…

La virtualisation matérielle est possible au moyen de ce que l’on appelle des hyperviseurs.
Il existe plusieurs types d’hyperviseurs, classés en 2 niveaux.

  • Le niveau 1 est dit “natif”.
    • Natif car les instructions processeurs du système virtuelle sont directement transmis aux hardware. Il faut donc vérifier la compatibilité entre les systèmes virtualisés et les composants matérielles.
  • Le niveau 2 est dit “hosted”.
    • Hosted car la virtualisation s’effectue grâce à un logiciel installé sur un système d’exploitation. Donc la machine virtualisée n’interagit pas directement avec le Hardware.

KVM est un hyperviseur de type 1, il est intégré de manière native à beaucoup de distribution basées sur le noyau Linux. KVM pour Kernel-based Virtual Machine car il transforme le noyau linux sur lequel il est exécuté en hyperviseur, proxmox est basé dessus. Il en existe d’autres.

On utilise QEMU (QuickEmulator) pour interagir avec KVM.

  • **Qemu** est de type 1 et 2.
    • Il peut simuler un environnement pour une machine totalement différente de la votre, par exemple une py sur un PC. Dans ce cas la il transforme les exécutions de processeurs pour les rendre compatibles avec le hardware, donc la il est de type 2.
    • Mais quand il est utilise avec KVM dans ce cas la il fonctionne en type 1 avec des performances bien meilleures.

En clair Qemu sert à manager les machines virtuels, c’est un client.
Et la liaison entre Qemu et KVM est faite via l’API libvirt ( management du réseau, stockages, clavier, souris, etc )

libvirt est une bibliothèque permettant d’interagir avec différentes solutions de virtualisation (cet article s’intéressera uniquement à KVM/QEMU, mais Xen, VirtualBox et d’autres sont aussi possibles)
Virtual Machine Manager est un ensemble d’applications permettant de gérer les machines virtuelles

En mode graphique :

  • virt-viewer est une interface graphique permettant de se connecter sur une machine virtuelle
  • virt-manager est une interface graphique permettant de gérer les machines virtuelles

En ligne de commande :

  • virt-clone permet de dupliquer une machine existante
  • virt-convert permet de convertir l’image d’une machine
  • virt-image permet de créer un nouvelle machine à partir d’une image
  • virt-install permet de créer une nouvelle machine ou d’importer une machine déjà créé ultérieurement avec qemu ou qemu-kvm

QEMU est une solution d'émulation et de virtualisation (avec kqemu un pilote permettant d’optimiser l’émulation lorsque qu’elle concerne la même architecture).QEMU peut utiliser KVM lors de l’exécution d’une architecture cible identique à l’architecture hôte. Par exemple, lorsque vous exécutez qemu-system-x86 sur un processeur compatible x86, vous pouvez profiter de l’accélération KVM - ce qui vous donne un avantage pour votre hôte et votre système invité.

KVM (Kernel-based Virtual Machine) est une solution de virtualisation, pour les processeurs disposant des capacités nécessaires, et intégré au noyau linux.Il supporte les processeurs Intel et AMD récents (x86 et x86_64), PPC 440, PPC 970, S/390, ARM (Cortex A15, AArch64), et les processeurs MIPS32.

Vous ne pouvez pas utiliser KVM en même temps que VirtualBox. Il faudra en effet fermer KVM pour utiliser VirtualBox et vice versa. Ou désactiver le support de la virtualisation processeur dans VirtualBox

Debian Qemu/KVM

Vous pouvez utiliser KVM pour exécuter plusieurs systèmes d’exploitation tels que Windows, *BSD, distribution Linux en utilisant des machines virtuelles. Chaque machine virtuelle a son disque privé, sa carte graphique, une carte réseau et plus encore.

  • Le serveur hôte situé dans le centre de données distant et c’est un serveur sans affichage.
  • Toutes les commandes de ce tutoriel ont été tapées via une session ssh.
  • Vous avez besoin d’un client vnc pour installer le système d’exploitation invité.
  • Dans ce tutoriel, vous apprendrez comment installer le logiciel KVM sur le serveur Debian Linux 9.x et utiliser KVM pour configurer votre première VM invitée.

Installation

Installation, exécuter la commande suivante

sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils libguestfs-tools genisoimage virtinst libosinfo-bin

Ajout utilisateur au groupe libvirt

Si vous voulez que l’utilisateur normal/régulier puisse gérer les machines virtuelles. Ajouter l’utilisateur $USER à libvirt et libvirt-qemu en utilisant la commande usermod

sudo useradd -G libvirt $USER                # ou sudo adduser $USER libvirt
sudo useradd -G libvirt-qemu $USER           # ou sudo adduser $USER libvirt-qemu

Recharger l’adhésion à un groupe avec l’aide de la commande newgrp

newgrp libvirt
newgrp libvirt-qemu

Vérifiez votre appartenance à un groupe à l’aide de la commande id

id

Veuillez noter que vous devez utiliser la commande suivante pour vous connecter au serveur KVM

virsh --connect qemu:///system
virsh --connect qemu:///system command
virsh --connect qemu:///system list --all

kvm supporté par le CPU ?

Exécutez la commande egrep suivante pour vérifier que Intel VMX ou AMD SVM est supporté sur votre CPU

egrep --color 'vmx|svm' /proc/cpuinfo

vmx (Intel) ou svm (Amd) doit apparaître d’une autre couleur dans le résultat

Configurer la mise en réseau par pont

Créer un “bridge Interface” br0 comme connexion réseau dans la configuration des invités VM pour l’interface eth0

sudo nano /etc/network/interfaces.d/br0

Ajouter ce qui suit :

## make sure all config related to eth0 deleted ##
auto br0
iface br0 inet static
	address 192.168.2.23
	broadcast 192.168.2.255
	netmask 255.255.255.0
	gateway 192.168.2.254
	bridge_ports ens3
	bridge_stp off       # disable Spanning Tree Protocol
        bridge_waitport 0    # no delay before a port becomes available
        bridge_fd 0          # no forwarding delay

Ou comme cela (si votre hôte utilise le DHCP) :

auto br0
iface br0 inet dhcp
	bridge_ports ens3
	bridge_stp off
	bridge_fd off
	bridge_maxwait 0

Redémarrez le service réseau Linux:

sudo systemctl restart networking

Pour voir les paramètres de mise en réseau actuels pour KVM

sudo virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              inactive   no            yes

Vous devez configurer un domaine invité KVM sur un réseau ponté.
Créer un fichier nommé bridge.xml

sudo nano /root/bridged.xml

Ajouter la configuration suivante :

<network>
  <name>br0</name>
  <forward mode="bridge"/>
  <bridge name="br0"/>
</network>

Définir le réseau

sudo virsh net-define --file /root/bridged.xml
sudo virsh net-autostart br0
sudo virsh net-start br0

Archlinux Qemu/KVM + interface graphique “Virtual Machine Manager”

Contrairement à d’autres programmes de virtualisation tels que VirtualBox et VMware, QEMU ne fournit pas d’interface graphique pour gérer les machines virtuelles (autre que la fenêtre qui apparaît lors de l’exécution d’une machine virtuelle), ni un moyen de créer des machines virtuelles persistantes avec des paramètres sauvegardés. Tous les paramètres pour exécuter une machine virtuelle doivent être spécifiés sur la ligne de commande à chaque lancement, sauf si vous avez créé un script personnalisé pour démarrer votre (vos) machine(s) virtuelle(s). Cependant, il existe plusieurs interfaces graphiques pour QEMU : virt-manager , gnome-boxes, qemu-launcherAUR, qtemuAUR, aqemuAUR
Des frontaux supplémentaires avec support QEMU sont disponibles pour libvirt.

Support matériel

KVM exige que le processeur de l’hôte de la machine virtuelle soit compatible avec la virtualisation (nommé VT-x pour les processeurs Intel et AMD-V pour les processeurs AMD). Vous pouvez vérifier si votre processeur prend en charge la virtualisation matérielle à l’aide de la commande suivante :

LC_ALL=C lscpu | grep Virtualization
Virtualization:      VT-x

Si rien n’est affiché après l’exécution de la commande, alors votre processeur ne prend pas en charge la virtualisation matérielle et vous ne pourrez pas utiliser KVM.

Remarque : Vérifier l’activation de la prise en charge de la virtualisation dans le BIOS.

Support du noyau

Les noyaux Arch Linux fournissent les modules de noyau appropriés pour supporter KVM et VIRTIO.

Modules KVM

Vous pouvez vérifier si les modules nécessaires (kvm et l’un de kvm_amd, kvm_intel) sont disponibles dans votre noyau avec la commande suivante (en supposant que votre noyau est compilé avec CONFIG_IKCONFIG_PROC) :

zgrep CONFIG_KVM /proc/config.gz
CONFIG_KVM_GUEST=y
# CONFIG_KVM_DEBUG_FS is not set
CONFIG_KVM_MMIO=y
CONFIG_KVM_ASYNC_PF=y
CONFIG_KVM_VFIO=y
CONFIG_KVM_GENERIC_DIRTYLOG_READ_PROTECT=y
CONFIG_KVM_COMPAT=y
CONFIG_KVM=m
CONFIG_KVM_INTEL=m
CONFIG_KVM_AMD=m
CONFIG_KVM_AMD_SEV=y
CONFIG_KVM_MMU_AUDIT=y

Le module n’est disponible que s’il est réglé sur y ou m.

Dispositifs para-virtualisés

La para-virtualisation fournit un moyen de communication rapide et efficace permettant aux invités d’utiliser des appareils sur la machine hôte. KVM fournit des périphériques para-virtualisés aux machines virtuelles en utilisant l’API Virtio comme couche entre l’hyperviseur et l’invité.

Tous les périphériques virtio ont deux parties : le périphérique hôte et le pilote invité.

Utilisez la commande suivante pour vérifier si les modules nécessaires sont disponibles :

zgrep VIRTIO /proc/config.gz
CONFIG_BLK_MQ_VIRTIO=y
CONFIG_VIRTIO_VSOCKETS=m
CONFIG_VIRTIO_VSOCKETS_COMMON=m
CONFIG_NET_9P_VIRTIO=m
CONFIG_VIRTIO_BLK=m
# CONFIG_VIRTIO_BLK_SCSI is not set
CONFIG_SCSI_VIRTIO=m
CONFIG_VIRTIO_NET=m
CONFIG_CAIF_VIRTIO=m
CONFIG_VIRTIO_CONSOLE=m
CONFIG_HW_RANDOM_VIRTIO=m
CONFIG_DRM_VIRTIO_GPU=m
CONFIG_VIRTIO=m
CONFIG_VIRTIO_MENU=y
CONFIG_VIRTIO_PCI=m
CONFIG_VIRTIO_PCI_LEGACY=y
CONFIG_VIRTIO_BALLOON=m
CONFIG_VIRTIO_INPUT=m
CONFIG_VIRTIO_MMIO=m
CONFIG_VIRTIO_MMIO_CMDLINE_DEVICES=y
CONFIG_RPMSG_VIRTIO=m
CONFIG_CRYPTO_DEV_VIRTIO=m

Chargement des modules du noyau

Les modules kvm et kvm-intel/kvm-amd doivent être chargés automatiquement, sinon, voir la page traitant des modules du noyau.

lsmod | grep kvm
kvm_intel             180224  0
kvm                   708608  1 kvm_intel
irqbypass              16384  1 kvm

Astuce : Si modprobing kvm_intel ou kvm_amd échoue mais que modprobing kvm réussit, (et lscpu prétend que l’accélération matérielle est supportée), vérifiez vos paramètres BIOS.

Certains fournisseurs (en particulier les fournisseurs d’ordinateurs portables) désactivent ces extensions de processeur par défaut. Pour déterminer s’il n’y a pas de support matériel ou si les extensions sont désactivées dans le BIOS, la sortie de dmesg après avoir échoué à modprobe le dira.

Installation

KVM
Virtual Machine Manager

sudo pacman -S qemu virt-manager virt-viewer dnsmasq ebtables vde2 bridge-utils openbsd-netcat

Ajout utilisateur au groupe libvirt

sudo gpasswd -a $USER libvirt
Adding user yann to group libvirt

Port forwarding (permettre au VM de sortir sur Internet)

Les VM auront donc des adresses IP privées et l’on utilisera la translation d’adresse (NAT) pour permettre au VM de sortir sur Internet

sudo -s
echo 1 > /proc/sys/net/ipv4/ip_forward  # activation temporaire

Note : si systemd est installé le fichier /etc/sysctl.conf n’existe plus et est remplacé par un dossier sysctl.d où mettre les *.conf nécessaires. On doit y créer un fichier (ex: /etc/sysctl.d/99-sysctl.conf). Dans ce cas, pour que la commande “sysctl -p” fonctionne il faut indiquer le fichier, par ex sysctl -p /etc/sysctl.d/fichier.conf. Ou avoir créé un lien symbolique /etc/sysctl.conf vers /etc/sysctl.d/99-sysctl.conf

sudo nano /etc/sysctl.d/99-sysctl.conf  # activation au démarrage

       net.ipv4.ip_forward = 1

Pour le mode graphique il faut lancer le service libvirtd

sudo systemctl start libvirtd

Pour une activation au démarrage

sudo systemctl enable libvirtd

Première utilisation VMM

Démarrer l’application graphique Gestionnaire de machines virtuelles

kvm

Le bouton Nouveau permet de lancer l’assistant de création

kvm

kvm

kvm

kvm

Machine virtuelle /home/yannick/media/dplus/Vbox/DebianStretchKvm.img

kvm

kvm

kvm

kvm

Utilisation courante VMM

Dans les utilisations suivantes, si rien n’est activé automatiquement, il faut exécuter les commandes suivantes

sudo -s
# translation d'adresse (NAT) pour permettre au VM de sortir sur Internet
echo 1 > /proc/sys/net/ipv4/ip_forward  
# lancer le service libvirtd pour l'application graphique
systemctl start libvirtd

Démarrer l’application graphique Gestionnaire de machines virtuelles

kvm

Le démarrage de la machine virtuelle provoque une erreur (réseau non actif)

kvm

Cliquer sur Edition puis Détails de la connexion

kvm

Cliquer sur l’icône Démarrer le réseau pour l’activer

kvm

Pour modifier les paramètres de la machine virtuelle, cliquer sur Edition puis Détails de la machine virtuelle

kvm

Cliquer sur l’icône Démarrer la machine virtuelle de la fenêtre “Gestionnaire de machines virtuelles”

kvm

Puis cliquer sur Afficher et sélectionner Détails
Après une installation utilisant le CD et un fichier ISO, il faut le déconnecter
Sélectionner IDE CD-ROM puis clique sur Déconnecter

kvm

Cliquer sur l’icône Démarrer la machine virtuelle puis sur l’icône Afficher la console graphique

kvm

Vérification de l’installation par “virt-host-validate”

Vérifier que tout est bon :

virt-host-validate
  QEMU : Vérification for hardware virtualization                                  : PASS
  QEMU : Vérification if device /dev/kvm exists                                    : PASS
  QEMU : Vérification if device /dev/kvm is accessible                             : PASS
  QEMU : Vérification if device /dev/vhost-net exists                              : PASS
  QEMU : Vérification if device /dev/net/tun exists                                : PASS
  QEMU : Vérification for cgroup 'cpu' controller support                          : PASS
  QEMU : Vérification for cgroup 'cpuacct' controller support                      : PASS
  QEMU : Vérification for cgroup 'cpuset' controller support                       : PASS
  QEMU : Vérification for cgroup 'memory' controller support                       : PASS
  QEMU : Vérification for cgroup 'devices' controller support                      : PASS
  QEMU : Vérification for cgroup 'blkio' controller support                        : PASS
  QEMU : Vérification for device assignment IOMMU support                          : WARN (No ACPI DMAR table found, IOMMU either disabled in BIOS or not supported by this hardware platform)
   LXC : Vérification pour Linux >= 2.6.26                                         : PASS
   LXC : Vérification for namespace ipc                                            : PASS
   LXC : Vérification for namespace mnt                                            : PASS
   LXC : Vérification for namespace pid                                            : PASS
   LXC : Vérification for namespace uts                                            : PASS
   LXC : Vérification for namespace net                                            : PASS
   LXC : Vérification for namespace user                                           : PASS
   LXC : Vérification for cgroup 'cpu' controller support                          : PASS
   LXC : Vérification for cgroup 'cpuacct' controller support                      : PASS
   LXC : Vérification for cgroup 'cpuset' controller support                       : PASS
   LXC : Vérification for cgroup 'memory' controller support                       : PASS
   LXC : Vérification for cgroup 'devices' controller support                      : PASS
   LXC : Vérification for cgroup 'freezer' controller support                      : PASS
   LXC : Vérification for cgroup 'blkio' controller support                        : PASS
   LXC : Vérification if device /sys/fs/fuse/connections exists                    : PASS

Dans notre cas , une alerte IOMMU (En informatique, une unité de gestion de mémoire d’entrée-sortie (IOMMU) est une unité de gestion de mémoire (MMU) qui connecte un bus E/S à accès direct à la mémoire principale (compatible DMA). Comme une MMU traditionnelle, qui traduit les adresses virtuelles visibles par le CPU en adresses physiques, l’IOMMU met en correspondance les adresses virtuelles visibles par l’appareil (appelées aussi adresses d’appareil ou adresses E/S dans ce contexte) en adresses physiques.)
Pour activer le support IOMMU , éditer (en mode root) le fichier /etc/default/grub et ajouter intel_iommu=on à la ligne existante GRUB_CMDLINE_LINUX
GRUB_CMDLINE_LINUX="intel_iommu=on"
Mettre à jour grub
sudo grub-mkconfig -o /boot/grub/grub.cfg
puis redémarrer la machine

Partage de fichiers entre l’hôte et les invités dans qemu/kvm

image
9p, l’autre pays du partage

Hôte

Créer un dossier de partage sur l’hôte.

mkdir $HOME/qemu-share

Les droits en lecture/écriture pour le propriétaire et le groupe du dossier

chmod 775 -R $HOME/qemu-share

Dans le fichier /etc/libvirt/qemu.conf, chercher les lignes suivantes :

#user = "root"
#group = "root"

Et remplacer par :

user = "utilisateur"
group = "groupe"

utilisateur et groupe sont remplacés par ceux du dossier que l’on veut partager sur la machine hôte et supprimer le # en début de ligne.

Redémarrer le service libvirtd pour que ces modifications soient prises en compte:

systemctl restart libvirtd

Cela va permettre à la machine virtuelle d’écrire dans le dossier partagé avec l’identité de notre utilisateur plutôt qu’avec l’identité Libvirt Qemu paramétrée par défaut. Ainsi notre utilisateur aura accès aux fichiers créés par le serveur situé sur la VM et pourra les modifier sans souci.

Dans virt-manager, “Edition” -> “Détails de la machine virtuelle” et dans les informations de la machine (icône “Afficher les détails du matériel virtuel”) ,cliquer sur “Ajouter un matériel”, puis sur “Système de fichiers”.Modifier suivant le modèle ci-dessous.

qemu share

Pilote = default
Mode = Squash
Chemin source : il s’agit du dossier crée précédemment sur l’hôte /home/yannick/qemu-share
Chemin cible : un nom au choix, par exemple : hotshare

Invité

Démarrer la VM et ouvrir un terminal.
Créer le répertoire de montage du système de fichiers

mkdir $HOME/share

Montage manuel du système de fichiers.

sudo mount -t 9p -o trans=virtio,version=9p2000.L,rw hostshare $HOME/share

Montage automatique au démarrage ajout de la ligne suivante au fichier /etc/fstab

hostshare /home/utilisateur/share 9p rw,relatime,sync,dirsync,trans=virtio,version=9p2000.L	 0   2

Montage

sudo mount -a

Le partage ne peut pas être monté et édité sur plusieurs hôtes en même temps. Assurez-vous donc de le démonter avant de le monter sur un autre hôte invité.

Créer ,booter ,installer un os et importer

Créer une image via qemu

qemu-img create -f qcow2 /var/lib/libvirt/images/DOMAIN.img 20G
  • -f → format de KVM pour le fichier image, qcow2 est le format kvm par défaut, raw est compatible avec Virtualbox et VMware
  • 20G → Remplacer par la valeur souhaitée, ce sera la taille du disque dur virtuel

Booter sur une ISO et installer l’OS via KVM dans l’image précédemment créée

kvm -m 1024 -cdrom /CHEMIN_VERS_VOTRE_ISO -boot d /var/lib/libvirt/images/DOMAINE.img
  • -m 1024 → La quantité de ram allouée
  • -cdrom → spécifie le chemin vers votre ISO
  • -boot d → spécifie sur quelle domaine booter, un système émulé s’appelle domaine, remplacer DOMAINE par un titre parlant par exemple DebianVM

Booter simplement sur l’OS fraîchement installé directement via KVM

kvm -boot -d /var/lib/libvirt/images/DOMAINE.img

Attention en utilisant KVM directement et non avec libvirt, les machines virtuelles ne seront pas listés avec virtmanager ou la commande : virsh list

Import machine créée via “qemu” pour gestion avec “virt-manager” (libvirt)

Si vous avez déjà créé précédemment une machine virtuelle avec qemu vous pouvez importer cette machine virtuelle pour qu’elle soit gérée via virt-manager et par conséquent qu’elle utilise libvirt.

Par exemple, si vous avez une image qui se trouve dans /srv/vms/Fedora12.img, effectuez ces opérations:

sudo virt-install --import --disk path=/srv/vms/Fedora12.img --os-type linux --os-variant fedora11 --ram 512 --name Fedora12

Si vous désirez utiliser la gestion de l’accélération (c’est à dire, de passer par kvm et non pas qemu seulement):

sudo virt-install --import --accelerate --disk path=/srv/vms/Fedora12.img --os-type linux --os-variant fedora11 --ram 512 --name Fedora12
  • Les options –name, –ram sont obligatoires.
  • Les options –os-type et –os-variant ne sont pas obligatoires mais permettent tout de même une meilleure gestion pour le démarrage et mémoire au boot.

Pour les machines virtuelles Windows, c’est toujours aussi simple:

sudo virt-install --import --accelerate --disk path=/srv/vms/WinXP.img --os-type windows --os-variant winxp --ram 512 --name WindowXP

Aussitôt la génération de la configuration effectuée, la machine va démarrer. Elle apparait alors dans virt-manager.

Gérer la virtualisation KVM/Qemu avec “virsh” en ligne de commande

Sur l’ordinateur hôte (où kvm/qemu est installé)

Connexion à l’hyperviseur

virsh -c qemu:///system
Bienvenue dans virsh, le terminal de virtualisation interactif.

Taper :  « help » pour l'aide ou « help » avec la commande
         « quit » pour quitter

virsh # 

Liste des commandes sous “virsh”

Toutes les commandes suivantes se font à la suite du prompt virsh

Liste des machines actives

list
 ID    Nom                            État
----------------------------------------------------
 8     debian9                        en cours d'exécution

Liste des machines inactives

list --inactive

Liste de toutes les machines active ou non

list --all

Démarrer la machine virtuelle debian9

start debian9

Redémarrer la machine virtuelle debian9

reboot debian9

Arrêter la machine virtuelle debian9

shutdown debian9

Arrêter brutalement la machine virtuelle debian9

destroy debian9

Afficher les informations d’une machine virtuelle

dominfo debian9

qemu share

Afficher les informations de la machine (hôte) qui supporte la virtualisation, machine nœud

nodeinfo

qemu share

Sortie du mode interactif

quit

Sauvegarde configuration machine virtuelle

Sauvegarder la configuration de la machine virtuelle debian9, vous devez sortir du mode interactif avant de saisir

virsh -c qemu:///system dumpxml debian9 > /tmp/Newdebian9.xml

Modification/Création machine virtuelle

Vous pouvez ainsi facilement modifier le fichier XML et créer une nouvelle machine à partir de ces modifications
Plus d’info sur le format XML sur http://libvirt.org/format.html

pour créer une machine virtuelle Newdebian9 à partir d’un fichier XML

virsh -c qemu:///system create /tmp/Newdebian9.xml

Liste des machines virtuelles

Liste des machines (actives ou non)

sudo virsh list --all
 ID    Nom                            État
----------------------------------------------------
 -     debian9                        fermé

Vérifier la présence d’un réseau

sudo virsh net-list --all
 Nom                  État      Démarrage automatique Persistent
-----------------------------------------------------------------
 default              inactif    no                     yes

Activer le réseau

sudo virsh net-start default
#    Réseau default démarré

En cas d’erreur : How to fix “network ‘default’ is not active” error in libvirt

personnaliser sa configuration réseau

sudo virsh net-edit default

Démarrer la machine virtuelle

sudo virsh start debian9
#    Domaine debian9 démarré

Arrêter la machine virtuelle

sudo virsh shutdown debian9
#    Le domaine debian9 est en cours d'arrêt

Démarrage des machines virtuelles QEMU au démarrage

Si une machine virtuelle est configurée avec libvirt, elle peut être configurée avec virsh autostart ou via l’interface graphique du gestionnaire de virt (vmm, virt-manager) pour démarrer au démarrage de l’hôte en allant dans les Options de démarrage de la machine virtuelle et en sélectionnant “Démarrer la machine virtuelle au démarrage de l’hôte”.

Démarre automatiquement le réseau au démarrage de l’hôte (instruction en ligne de commande)

sudo virsh net-autostart default

Vérifier le port forwadding :

cat /proc/sys/net/ipv4/ip_forward

Si la valeur est a 0, dé-commenter dans /etc/sysctl.conf le paramètre net.ipv4.ip_forward pour l’activer au démarrage :

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1

Activation

sudo sysctl -w net.ipv4.ip_forward=1

Configurer le pare-feu

en remplaçant avec le nom de l’interface physique, par exemple eth0 ou enp3s0

iptables -A FORWARD -i interfacephysique -j ACCEPT
iptables -A FORWARD -o interfacephysique -j ACCEPT

Monter un disque virtuel VDI sur une partition linux avec Qemu et nbd

L’image VDI ne doit pas être utilisée (stopper la machine virtuelle qui l’utilise).

Nous allons utiliser QEMU pour monter le disque VDI.Il faut installer le binaire qemu-nbd, qui est contenu dans qemu-utils sous Debian , qemu-img sous Fedora.
nbd sous archlinux

sudo pacman -S nbd

Vérifier si le module nbd est chargé

lsmod |grep nbd 

Chargement module nbd

sudo modprobe nbd
lsmod |grep nbd # vérifier si module chargé
nbd                    45056  0

Montage de l’image VDI

qemu-nbd -c /dev/nbd0 disk.vdi
mount /dev/nbd0p1 /mnt         # contenu disk.vdi accessible dans /mnt.

disk.vdi : image VDI, /dev/ndb0 : disque vu par le système, /dev/nbd0p1 : première partition du disque.

Comment migrer vos machines Virtual Box vers le KVM-VirtManager

Les commandes

Convertir l’image disque d’une machine Virtual Box en un format de disque brut

VBoxManage clonehd disk.vdi disk.raw --format raw

Convertira l’image brute du disque au format compressé qcow2 (le format de disque brut consomme beaucoup d’espace disque).

qemu-img convert -f raw disk.raw -O qcow2 disk.qcow2

Migrer “Debian Buster”

KVM : virt-manager pour se connecter à une console distante avec qemu+ssh

Si vous exécutez KVM sur un serveur en console seule, vous avez toujours la possibilité d’utiliser le gestionnaire graphique virt-manager. Il suffit de préciser le mode de communication (ssh, tls, tcp, tcp, etc).

Dans cet article, je vais montrer comment utiliser virt-manager à partir d’un bureau client Ubuntu vers un serveur exécutant KVM et libvirtd, avec la connexion “tunneled” sur ssh et authentifié avec PKI.

L’affichage VNC à distance de ces VMs est envoyé par ce même tunnel ssh.

En utilisant la solution de tunneling ssh décrite dans cet article, le service libvirtd côté serveur n’a pas besoin d’activer l’écoute sur TCP dans “/etc/libvirt/libvirtd.conf”.

SSH prérequis

La première condition est que vous puissiez utiliser ssh pour vous connecter au serveur KVM distant en utilisant la clé privée pour l’authentification. Cet article montre comment configurer SSH pour l’authentification par clé publique (en).

Après avoir activé l’authentification par clé publique, vous devriez pouvoir effectuer un ssh dans l’hôte distant en utilisant la clé privée locale.

ssh -i <privateKeyFile> <user>@<KVMServer>

Paquets client virt-manager

Au minimum, vous avez besoin de l’interface graphique du gestionnaire de virt et de l’utilitaire qui vous demande la phrase de passe (passphrase) ssh.

# absolute minimum
sudo apt-get install virt-manager ssh-askpass-gnome --no-install-recommends

# une installation plus complète si vous effectuez un travail KVM local
sudo apt-get install virt-manager

Test client

La boîte de dialogue de l’interface graphique du gestionnaire de virt n’a pas la possibilité de spécifier un port ssh autre que par défaut ou la clé privée à utiliser lors de la connexion au serveur distant, mais cela se fait facilement en démarrant virt-manager avec le paramètre’-c’.

virt-manager -c 'qemu+ssh://myuser@192.168.1.139:2222/system?keyfile=id_rsa'

Dans l’exemple ci-dessus, nous nous connectons en tant que ‘myuser’ au port d’écoute ssh non par défaut de 2222, et utilisons la clé privée trouvée dans le répertoire courant (fichier’id_rsa’).

virt-manager devrait vous demander immédiatement la phrase de chiffrement protégeant la clé privée (ce n’est pas le mot de passe de l’utilisateur !), et une fois que vous l’aurez entré, vous verrez virt-manager comme si vous étiez assis sur l’hôte KVM localement.

If you want to open a remote console to a VM, then before powering on make sure you are using the “Display VNC” (not Spice!) listening to ‘localhost’ with the port automatically selected. This communication will be tunneled over SSH and does not require additional ports open on the server firewall. Si vous voulez ouvrir une console distante à une VM, alors avant de mettre sous tension, assurez-vous d’utiliser la fonction “Afficher VNC” (Display VNC) pour écouter’localhost’ avec le port automatiquement sélectionné. Cette communication sera tunnelisée par SSH et ne nécessite pas de ports supplémentaires ouverts sur le pare-feu du serveur.

NOTES

Spécification du port VNC avec virt-install

# Utiliser le port statique 5900
--graphics vnc,port=5900

# utiliser la numérotation automatique (5900 pour la 1ère VM, 5901 pour la 2ème, etc)
--graphics vnc,port=-1

Comment exécuter Virt-Manager, Libvirt avec un utilisateur normal sans privilèges root et sans mot de passe

Virt-manager et libvirt sont les principaux outils utilisés pour la virtualisation dans l’écosystème Linux. En tant qu’utilisateur final, j’utilise ces outils pour créer et exécuter des machines virtuelles. Mais chaque fois que j’essaie de faire fonctionner cet outil, le mot de passe sudo m’est demandé.
Solution pour exécuter ces outils sans mettre de mot de passe et changer aucune autorisation du côté de la virtualisation

Polkit

PolicyKit ou simplement Polkit est un composant utilisé pour contrôler les privilèges du système dans les systèmes d’exploitation Unix et Linux.
Nous allons utiliser Polkit pour nous authentifier et démarrer virt-manager sans mot de passe.

Créer un groupe pour la virtualisation

Pour exécuter des services et des logiciels de virtualisation, nous avons besoin d’un groupe ayant le droit d’accéder aux ressources système associées.

La plupart des systèmes d'exploitation génére le groupe sous le nom de libvirt au cours de l'installation
Sinon, créez le groupe avec la commande suivante.(nécessite des privilèges root)
sudo groupadd libvirt

Mettre l’utilisateur dans le groupe de virtualisation

Nous devons maintenant placer notre utilisateur normal ou actuel dans le groupe de virtualisation. Comme indiqué à l’étape précédente, le nom du groupe est libvirt
Dans cette commande, nous ajoutons le groupe secondaire nommé libvirt à l’utilisateur courant $USER

sudo usermod -a -G libvirt $USER # on peut spécifier le nom utilisateur au lieu de $USER

Vérifier

id $USER

Créer une règle Polkit

Nous allons créer une règle polkit zvec le groupe libvirt
Créer un fichier

sudo nano /etc/polkit-1/rules.d/80-libvirt.rules

Cette règle donnera aux utilisateurs des groupes libvirt accès aux fonctionnalités de virtualisation sans mot de passe.

polkit.addRule(function(action, subject) {
 if (action.id == "org.libvirt.unix.manage" && subject.local && subject.active && subject.isInGroup("libvirt")) {
 return polkit.Result.YES;
 }
});

Un “reboot” de la machine est nécessaire pour la prise en charge

Comment installer une image virtuelle sur un serveur Debian Linux 9 Headless (sans affichage)

La machine virtuelle basée sur le noyau (KVM) est un module de virtualisation pour le noyau Linux qui le transforme en hyperviseur.
Vous pouvez utiliser KVM pour exécuter plusieurs systèmes d’exploitation tels que Windows, * BSD et la distribution Linux à l’aide de machines virtuelles. Chaque machine virtuelle a son disque privé, sa carte graphique, une carte réseau, etc.

Procédure d’installation du serveur KVM sur un serveur Debian Linux 9.x

  1. Le serveur hôte est distant, c’est un serveur sans affichage.
  2. Toutes les commandes sont saisies dans une session ssh.
  3. Avoir un client vnc pour installer le système d’exploitation invité.
  4. Le but est d’installer le logiciel KVM sur un serveur sans affichage Debian Linux 9.x et à utiliser KVM pour configurer une machine virtuelle invitée.

Installation KVM

Saisir la commande suivante

sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils libguestfs-tools genisoimage virtinst libosinfo-bin

Autoriser l’utilisateur à gérer la machine virtuelle

utilisateur courant gére des machines virtuelles.

sudo adduser vmuser libvirt
sudo adduser vmuser libvirt-qemu

Recharger l’appartenance à un groupe à l’aide de la commande newgrp

newgrp libvirt
newgrp libvirt-qemu

Vérifier votre appartenance au groupe avec la commande id

id

Noter que vous devez utiliser la commande suivante pour vous connecter au serveur KVM

virsh --connect qemu:///system
virsh --connect qemu:///system command
virsh --connect qemu:///system list --all

Vérifier installation KVM sur Debian

Exécutez la commande egrep suivante pour vérifier que Intel VMX ou AMD SVM est pris en charge sur votre CPU

egrep --color 'vmx|svm' /proc/cpuinfo

Configurer la mise en réseau “pont” sur Debian

Création de l’interface pont br0 (bridge Interface) comme connexion réseau dans la configuration d’invités de machine virtuelle pour l’interface eth0

sudo nano /etc/network/interfaces.d/br0

Ajouter ce qui suit:

## make sure all config related to eth0 deleted ##
auto br0
iface br0 inet static
	address 192.168.2.23        ## set up/netmask/broadcast/gateway as per your setup
	broadcast 192.168.2.255
	netmask 255.255.255.0
	gateway 192.168.2.254
	bridge_ports eth0    # replace eth0 with your actual interface name
	bridge_stp off       # disable Spanning Tree Protocol
        bridge_waitport 0    # no delay before a port becomes available
        bridge_fd 0          # no forwarding delay

Redémarrer le service réseau sur Linux (si network-manager utilisé)

sudo systemctl restart network-manager

Sinon , reboot

sudo systemctl reboot

Pour voir les paramètres réseau actuels pour KVM

sudo virsh net-list --all
 Name                 State      Autostart     Persistent
----------------------------------------------------------
 default              inactive   no            yes

Vous devez configurer un domaine invité KVM sur un réseau ponté.
Créez un fichier nommé bridge.xml

sudo nano /root/bridged.xml

Et ajouter la configuration suivante

<network>
  <name>br0</name>
  <forward mode="bridge"/>
  <bridge name="br0"/>
</network>

Enregistrez et fermez et exécuter

sudo virsh net-define --file /root/bridged.xml
sudo virsh net-autostart br0
sudo virsh net-start br0

Création machine virtuelle à l’aide d’un programme d’installation d’image ISO

Créer une machine virtuelle CentOS 7.x.
Récupérer la dernière image ISO de CentOS 7.x

cd /var/lib/libvirt/boot/
sudo wget https://mirrors.kernel.org/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1708.iso

Créer une machine virtuelle CentOS 7.x avec 2 Go de RAM, 2 CPU, 1 nic et 40 Go d’espace disque

sudo virt-install \
--virt-type=kvm \
--name centos7 \
--ram 2048 \
--vcpus=2 \
--os-variant=rhel7 \
--virt-type=kvm \
--hvm \
--cdrom=/var/lib/libvirt/boot/CentOS-7-x86_64-DVD-1708.iso \
--network=bridge=br0,model=virtio \
--graphics vnc \
--disk path=/var/lib/libvirt/images/centos7.qcow2,size=40,bus=virtio,format=qcow2

Pour configurer la connexion vnc depuis un autre terminal sur ssh

sudo virsh dumpxml centos7 | grep vnc
<graphics type='vnc' port=' 5901 ' autoport='yes' listen='127.0.0.1'>

Vous pouvez également utiliser la commande suivante

sudo virsh vncdisplay centos7

Veuillez noter la valeur du port (5901). Vous devez utiliser un client SSH pour configurer le tunnel et un client VNC pour accéder au serveur vnc distant.
Tapez la commande de transfert de port SSH suivante à partir de votre client/bureau:

ssh vmuser@server1.cyberciti.biz -L 5901:127.0.0.1:5901

Une fois le tunnel ssh établi, vous pouvez pointer votre client VNC vers votre propre adresse 127.0.0.1 (localhost) et le port 5901 comme suit:


Client VNC pour terminer l’installation de CentOS 7.x

L’écran d’installation invité de CentOS Linux 7 devrait s’afficher comme suit:


Installation de CentOS 7.x sur une machine virtuelle basée sur KVM

Suivez maintenant les instructions à l’écran et installez CentOS 7. Une fois installé, continuez et cliquez sur le bouton de redémarrage. Le serveur distant a fermé la connexion de notre client VNC. Vous pouvez vous reconnecter via le client KVM pour configurer le reste du serveur, y compris la session ou le pare-feu SSH.

Utiliser virt-builder pour créer une machine virtuelle

La méthode ci-dessus (virt-install) fonctionne bien, mais si vous avez besoin de créer rapidement de nouvelles machines virtuelles, utliser virt-builder.

lister les machines virtuelles disponibles

virt-builder --list | more

Vous pouvez utiliser la commande grep pour filtrer uniquement les machines virtuelles basées sur x86_64

virt-builder --list | grep x86_64
opensuse-13.1            x86_64     openSUSE 13.1
opensuse-13.2            x86_64     openSUSE 13.2
opensuse-42.1            x86_64     openSUSE Leap 42.1
opensuse-tumbleweed      x86_64     openSUSE Tumbleweed
centos-6                 x86_64     CentOS 6.6
centos-7.0               x86_64     CentOS 7.0
centos-7.1               x86_64     CentOS 7.1
centos-7.2               x86_64     CentOS 7.2
centos-7.3               x86_64     CentOS 7.3
centos-7.4               x86_64     CentOS 7.4
cirros-0.3.1             x86_64     CirrOS 0.3.1
cirros-0.3.5             x86_64     CirrOS 0.3.5
debian-6                 x86_64     Debian 6 (Squeeze)
debian-7                 x86_64     Debian 7 (wheezy)
debian-8                 x86_64     Debian 8 (jessie)
debian-9                 x86_64     Debian 9 (stretch)
fedora-18                x86_64     Fedora® 18
fedora-19                x86_64     Fedora® 19
fedora-20                x86_64     Fedora® 20
fedora-21                x86_64     Fedora® 21 Server
fedora-22                x86_64     Fedora® 22 Server
fedora-23                x86_64     Fedora® 23 Server
fedora-24                x86_64     Fedora® 24 Server
fedora-25                x86_64     Fedora® 25 Server
fedora-26                x86_64     Fedora® 26 Server
fedora-27                x86_64     Fedora® 27 Server
freebsd-11.1             x86_64     FreeBSD 11.1
scientificlinux-6        x86_64     Scientific Linux 6.5
ubuntu-10.04             x86_64     Ubuntu 10.04 (Lucid)
ubuntu-12.04             x86_64     Ubuntu 12.04 (Precise)
ubuntu-14.04             x86_64     Ubuntu 14.04 (Trusty)
ubuntu-16.04             x86_64     Ubuntu 16.04 (Xenial)

Pour avoir des informations supplémentaires pour chaque système d’exploitation

virt-builder --notes ubuntu-16.04
virt-builder --notes debian-9
Debian 9 (stretch)
 
This is a minimal Debian install.
 
This image does not contain SSH host keys.  To regenerate them use:
 
    --firstboot-command "dpkg-reconfigure openssh-server"
 
This template was generated by a script in the libguestfs source tree:
    builder/templates/make-template.ml
Associated files used to prepare this template can be found in the
same directory.

Créer une machine virtuelle Debian 9.x

Créer une machine virtuelle Debian 9 avec 10 Go d’espace disque, 2 Go de RAM, 2 vCPU et un mot de passe aléatoire pour le compte root (commande virt-builder)

sudo virt-builder debian-9 \
--size=10G \
--format qcow2 -o /var/lib/libvirt/images/debian9-vm1.qcow2 \
--hostname debain9-vm1 \
--network \
--timezone Asia/Kolkata

Puis, importer une image avec la commande virt-install

sudo virt-install --import --name debian9-vm1 \
--ram 2048 \
--vcpu 2 \
--disk path=/var/lib/libvirt/images/debian9-vm1.qcow2,format=qcow2 \
--os-variant debian9 \
--network=bridge=br0,model=virtio \
--noautoconsole

ce qui donne…

Starting install...
Creating domain...  
Domain creation completed.

Vous pouvez vous connecter à votre VM en utilisant le mot de passe x0E4iZ8sHjA6ekb6 pour le compte root

sudo virsh list --all
virsh console debian9-vm1 

Vous devez désactiver le compte root pour la session SSH et créer des clés SSH pour votre machine virtuelle . Connectez-vous comme ci-dessus:

sudo -s
dpkg-reconfigure openssh-server
useradd -r -m -d /home/vmuser -s /bin/bash vmuser
passwd vmuser
systemctl enable ssh
### [ Disable root user login when using ssh ] ###
echo 'PermitRootLogin no' >> /etc/ssh/sshd_config
systemctl restart ssh
ip a s

Vérifiez que vous pouvez vous connecter en utilisant une adresse IP pour un utilisateur vmuser et utilisez ‘su -‘ pour devenir un utilisateur root:

ssh vmuser@192.168.2.132
su -

Commandes utiles

Trouver la liste des variantes de système d’exploitation acceptées

osinfo-query os | less
osinfo-query os | grep debian
osinfo-query os | grep freebsd

Liste un vms/domaine en cours d’exécution

sudo virsh list

Fermez un vms/domaine appelé debian9-vm1

sudo virsh shutdown debian9-vm1

Démarrer un vms/domaine appelé debian9-vm1

sudo virsh start debian9-vm1

Suspendre un vms/domaine appelé debian9-vm1

sudo virsh suspend debian9-vm1

Redémarrez (redémarrage sécurisé et en douceur) un vms/domaine appelé debian9-vm1

sudo virsh reboot debian9-vm1

Réinitialiser (réinitialisation matérielle / non sûre) un vms/domaine appelé debian9-vm1

sudo virsh reset debian9-vm1

Supprimer un vms/domaine appelé debian9-vm1

sudo virsh undefine debian9-vm1
sudo virsh destroy debian9-vm1

Pour voir une liste complète du type de commande virsh

virsh help | less
virsh help | grep reboot

Liens