Mardi 17 décembre 2019

KVM/QEMU (virtualisation linux) sur un serveur debian buster

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

Installer KVM/QEMU sur le serveur

On utilise ssh pour se connecter au serveur
Installation, exécuter la commande suivante

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

Vérifier si le service libvirtd est lancé et activé (enabled)

sudo systemctl status libvirtd
● libvirtd.service - Virtualization daemon
   Loaded: loaded (/lib/systemd/system/libvirtd.service; enabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-12-12 11:28:02 CET; 2 days ago
     Docs: man:libvirtd(8)
           https://libvirt.org
 Main PID: 759 (libvirtd)
    Tasks: 17 (limit: 32768)
   Memory: 34.7M
   CGroup: /system.slice/libvirtd.service
           └─759 /usr/sbin/libvirtd

déc. 12 11:28:00 xoyize.xyz systemd[1]: Starting Virtualization daemon...
déc. 12 11:28:02 xoyize.xyz systemd[1]: Started Virtualization daemon.

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 adduser $USER libvirt
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
122(libvirt),64055(libvirt-qemu)

Veuillez noter que vous devez utiliser une des commandes suivantes pour vous connecter au serveur KVM

virsh --connect qemu:///system
Welcome to virsh, the virtualization interactive terminal.

Type:  'help' for help with commands
       'quit' to quit

virsh # 
virsh --connect qemu:///system list --all  # avec la commande list par exemple

Réseau

Réseau par défaut

Il n’est pas actif

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

Editer et modifier la configuration par défaut

sudo virsh net-edit default
<network>
  <name>default</name>
  <uuid>f43811c0-8691-4df3-97b2-d79550f58e0e</uuid>
  <forward mode='nat'/>
  <bridge name='virbr0' stp='on' delay='0'/>
  <mac address='52:54:00:67:3d:80'/>
  <ip address='192.168.2.200' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.2.201' end='192.168.2.210'/>
    </dhcp>
  </ip>
</network>

Avant la création d’une machine virtuelle, le réseau doit être actif

sudo virsh net-start default    # virsh net-autostart default

Configurer le réseau pour un lancement au démarrage du serveur

sudo virsh net-autostart default    # Network default marked as autostarted

Vérifications

sudo virsh net-list --all
 Name      State    Autostart   Persistent
--------------------------------------------
 default   active   yes         yes
ip a
[...]
5: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:67:3d:80 brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.200/24 brd 192.168.2.255 scope global virbr0
       valid_lft forever preferred_lft forever
6: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:67:3d:80 brd ff:ff:ff:ff:ff:ff

Arrêt du réseau

sudo virsh net-destroy default  # Network default destroyed

Pas de lancement au démarrage

sudo virsh net-autostart default --disable   # Network default unmarked as autostarted

Réseau par “pont” FACULTATIF

Etablir des ponts entre les connexions réseaux (bridge network)

Le programme utilisé s’appelle brctl et fait parti de bridge-utils.
Ce programme nous permet de configurer et d’utiliser l’interface pont(bridge). L’interface pour le pont apparaît comme une nouvelle interface dans ip link, un peu comme eth0 ou eth1. Elle n’existe pas physiquement sur votre ordinateur, mais c’est une interface virtuelle qui prends juste les paquets depuis une interface physique et de manière transparente les route vers l’autre.

Machines virtuelles /srv/data/virtuel/

On va créer un répertoire pour stocker les ISO (iso) , les images virtuelles (vm) et lui donner des droits

sudo mkdir -p /srv/data/virtuel/{iso,vm} sudo chown $USER. -R /srv/data/virtuel

Pour avoir la liste des OS sous KVM

sudo osinfo-query os |grep debian
Short ID Name Version ID
debian6 Debian Squeeze 6 http://debian.org/debian/6
debian7 Debian Wheezy 7 http://debian.org/debian/7
debian8 Debian Jessie 8 http://debian.org/debian/8
debian9 Debian Stretch 9 http://debian.org/debian/9
debiantesting Debian Testing testing http://debian.org/debian/testing

Virtualiser OpenMediaVault

Télécharger l’image iso openmediavault_4.1.22-amd64.iso dans le dossier /srv/data/virtuel/iso/
Créer une machine virtuelle KVM

sudo virt-install --name omv01 \
--os-type linux \
--os-variant debian9 \
--ram=2048 \
--disk /srv/data/virtuel/vm/omv01.img,device=disk,bus=virtio,size=10,format=qcow2 \
--graphics vnc,listen=0.0.0.0 \
--noautoconsole \
--hvm \
--cdrom /srv/data/virtuel/iso/openmediavault_4.1.22-amd64.iso \
--boot cdrom,hd
Starting install...
Allocating 'omv01.img'                                                                    |  10 GB  00:00:00     
Domain installation still in progress. You can reconnect to 
the console to complete the installation process.

Liste des machines virtuelles

sudo virsh list --all
 Id   Name    State
-----------------------
 1    omv01   running

La machine installée est en cours d’exécution…

Afficher maintenant le port VNC de la machine virtuelle omv01

sudo virsh vncdisplay omv01
# :0
sudo virsh dumpxml omv01 |grep vnc
# <graphics type='vnc' port='5900' autoport='yes' listen='127.0.0.1'>

Le port VNC :0 soit 5900

Maintenant, afficher l’adresse IP de votre serveur KVM/QEMU

ip a
[...]
2: enp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 70:85:c2:53:cb:80 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.45/24 brd 192.168.0.255 scope global enp3s0
       valid_lft forever preferred_lft forever
[...]

L’adresse IP du serveur debian buster est 192.168.0.45

Poste client ← → Serveur de virtualisation

Accès aux machines virtuelles via le client VNC

Maintenant, vous devriez pouvoir vous connecter au serveur VNC de la machine virtuelle depuis n’importe quel client VNC.

Il suffit de se connecter à l’adresse VNC 192.168.0.45:0

Poste client archlinux
On va utiliser le client VNC TigerVnc , installation sous archlinux : sudo pacman -S tigervnc

  1. Dans un terminal, saisir la commande de transfert de port SSH

    ssh -L 5900:127.0.0.1:5900 admbust@xoyize.xyz -p 55035 -i /home/yannick/.ssh/vbox-srvbust-ed25519

  2. Lancer le Client “TigerVNC Viewer”

  3. Vous êtes connecté au serveur VNC

Créer un bash pour ouvrir la fenêtre VNC

# Transfert de port 
ssh -L 5900:127.0.0.1:5900 admbust@xoyize.xyz -p 55035 -i /home/yannick/.ssh/vbox-srvbust-ed25519
# Client VNC
vncviewer localhost::5900

Passer au paragraphe → Application OpenMediaVault

Accès aux machines virtuelles via Virtual Manager + ssh

Installer Virtual Manager

sudo pacman -S virt-manager

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

Notre configuration

virt-manager -c 'qemu+ssh://admbust@xoyize.xyz:55035/system?keyfile=/home/yannick/.ssh/vbox-srvbust-ed25519'

qemu-ssh-xoyize

ATTENTION: virt-manager et virt-viewer posent des problèmes à l’ouverture de la console qui sont liés à la clé SSH

Accès aux machines virtuelles via virt-viewer

utilitaire virt-viewer
Vous pouvez également utiliser l’utilitaire virt-viewer pour installer le système d’exploitation dans les machines invitées. virt-viewer est disponible dans la plupart des dépôts par défaut de la distribution Linux (sudo pacman -S virt-viewer).
Après avoir installé virt-viewer, exécutez la commande suivante pour établir l’accès VNC à la VM.

sudo virt-viewer --connect=qemu+ssh://admbust@xoyize.xyz:55035/system?keyfile=/home/yannick/.ssh/vbox-srvbust-ed25519 --name omv01


Si aucune machine virtuelle n’est active


Si plusieurs machines , sélection et Connecter

Application OpenMediaVault

Installation via ssh vnc

Procéder à l’installation OpenMediaVault (identique à Debian)
Machine : openmediavault
Domaine : local
Mot de passe root “azerty”
Patienter…
Gestion des paquets : France, ftp.fr.debian.org


A la fin de l’installation la machine est éteinte

sudo virsh list --all
 Id   Name    State
------------------------
 -    omv01   shut off

Editer la configuration de la machine virtuelle

On peut modifier les paramètres de la configuration
L’adresse IP 192.168.0.45 est importante pour une connexion client → serveur

sudo virsh edit omv01
[...]
    <input type='tablet' bus='usb'>
      <address type='usb' bus='0' port='1'/>
    </input>
    <input type='mouse' bus='ps2'/>
    <input type='keyboard' bus='ps2'/>
    <graphics type='vnc' port='-1' autoport='yes' listen='192.168.0.45'>
      <listen type='address' address='192.168.0.45'/>
    </graphics>
    <video>
      <model type='qxl' ram='65536' vram='65536' vgamem='16384' heads='1' primary='yes'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x01' function='0x0'/>
    </video>
    <memballoon model='virtio'>
      <address type='pci' domain='0x0000' bus='0x05' slot='0x00' function='0x0'/>
    </memballoon>
    <rng model='virtio'>
      <backend model='random'>/dev/urandom</backend>
      <address type='pci' domain='0x0000' bus='0x06' slot='0x00' function='0x0'/>
    </rng>
  </devices>
</domain>

Démarrer la VM omv01

sudo virsh start omv01  # Domain omv01 started

Mise à jour application

On se connecte via VNC/SSH , voir paragraphe Accès aux machines virtuelles via le client VNC

Login : root
Mdp : azerty

Mise à jour

apt update && apt upgrade

En fin de mise à jour

ip a

exit  # pour revenir à login

Touche F8 du clavier → “Quitter la visionneuse”

Créer un proxy nginx (serveur xoyize.xyz)

Sur le serveur xoyize.xyz (IP 192.168.0.45)
Créer un fichier /etc/nginx/conf.d/omv.xoyize.xyz.conf

# NAS virtuel OpenMediaVault
# /etc/nginx/conf.d/omv.xoyize.xyz.conf
	##
	# Virtual Host omv.xoyize.xyz (OpenMediaVault)
	##

	server {
	    listen 80;
	    listen [::]:80;
	
	    ## redirect http to https ##
	    server_name omv.xoyize.xyz;
	    return  301 https://$server_name$request_uri;
	}
	
	server {
	    listen 443 ssl http2;
	    listen [::]:443 ssl http2;
	    server_name omv.xoyize.xyz;
	
	    charset utf-8;
	    client_max_body_size 50M;
	
	    include ssl_dh_headers_ocsp;
	
	    location / {
	        proxy_set_header Host $http_host;
	        proxy_set_header X-Real-IP $remote_addr;
	        proxy_pass http://192.168.2.202;
	        proxy_http_version 1.1;
	        proxy_set_header Upgrade $http_upgrade;
	        proxy_set_header Connection "upgrade";
	        proxy_next_upstream error timeout http_502 http_503 http_504;
	    }
	    
	    access_log /var/log/nginx/omvjs-access.log;
	    error_log /var/log/nginx/omvjs-error.log;
	}

Vérifier et recharger nginx

sudo nginx -t
sudo systemctl reload nginx

Configurer OpenMediaVault

</iframe>

Sur un poste client
Si le poste client est sur le même réseau (192.168.0.0) , on peut accéler l’accès en modifiant le “hosts” du client

sudo nano /etc/hosts
192.168.0.45    srvxo xoyize.xyz omv.xoyize.xyz

Connexion https://omv.xoyize.xyz

Panneau de connexion

Utilisateur : admin
Mot de passe : openmediavault