logo Debian Debian Debian-France Debian-Facile Debian-fr.org Forum-Debian.fr Debian ? Communautés logo inclusivité

Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).


L'icône rouge permet de télécharger chaque page du wiki visitée au format PDF et la grise au format ODT → ODT PDF Export

Ceci est une ancienne révision du document !


KVM & VGA Passthough

  • Objet : Virtualisation de Windows via KVM avec utilisation d'une carte graphique dédiée
  • Niveau requis :
  • Commentaires : Pour jouer…

Avertissement

Tuto pour qemu 2.8 et ovmf 0~20170911.5dfba97c-1. Chez moi, mettre à jour ces paquets casse la virtualisation. Mais peut-être que sur une nouvelle installation, il n'y a pas de problème.

Pré-Installation

Identification de la CG

lspci
…
01:00.0 VGA compatible controller: NVIDIA Corporation GP106 [GeForce GTX 1060 6GB] (rev a1)
01:00.1 Audio device: NVIDIA Corporation GP106 High Definition Audio Controller (rev a1)
…

On retient 01:00.0 et 01:00.1.

Récupération des pilotes VFIO

wget 'https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/latest-virtio/virtio-win.iso'

Ces pilotes seront nécessaires à l'installateur Windows pour trouver le disque dur et la carte réseau, je crois.

Création des disques

(Facultatif) Configuration de pulseaudio

Cette config permet au pulseaudio de l'utilisateur d'accepter les connections sur l'interface loopback. On demandera à KVM (lancé en root) de s'y connecter, ce qui évitera les ennuis de sorties audio simultanées.

Ajout de load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 dans le fichier default.pa

~/.config/pulse/default.pa
.nofail
 
 
.fail
 
load-module module-device-restore
load-module module-stream-restore
load-module module-card-restore
 
load-module module-augment-properties
 
load-module module-switch-on-port-available
load-module module-switch-on-connect
 
 
.ifexists module-udev-detect.so
load-module module-udev-detect
.else
load-module module-detect
.endif
 
.ifexists module-jackdbus-detect.so
.nofail
load-module module-jackdbus-detect channels=2
.fail
.endif
 
.ifexists module-bluetooth-policy.so
load-module module-bluetooth-policy
.endif
 
.ifexists module-bluetooth-discover.so
load-module module-bluetooth-discover
.endif
 
.ifexists module-esound-protocol-unix.so
load-module module-esound-protocol-unix
.endif
load-module module-native-protocol-unix
 
load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1
 
 
 
.ifexists module-gconf.so
.nofail
load-module module-gconf
.fail
.endif
 
load-module module-default-device-restore
 
load-module module-rescue-streams
 
load-module module-always-sink
 
load-module module-intended-roles
 
load-module module-suspend-on-idle
 
.ifexists module-console-kit.so
load-module module-console-kit
.endif
.ifexists module-systemd-login.so
load-module module-systemd-login
.endif
 
load-module module-position-event-sounds
 
load-module module-role-cork
 
load-module module-filter-heuristics
load-module module-filter-apply

Installation

Kernel Line

GRUB_CMDLINE_LINUX_DEFAULT="quiet spalsh intel_iommu=on modprobe.blacklist=nouveau hugepagesz=1G hugepages=8"
  • intel_iommu=on

J'sais plus.

  • modprobe.blacklist=nouveau

Pour être sûr que le device de la carte graphique n'est pas acquis par le module nouveau.

  • hugepagesz=1G hugepages=8

Pour que la mémoire de la VM soit gérée via le mécanisme de hugepages, ici, 8×1Go.

Script de lancement

start_kvm.sh
#!/bin/bash
 
vmname="windows7vm"
 
# Cette fonction sert à définir le module vfio-pci, le module utilisé pour la virualisation pci, comme driver de la CG
vfiobind()
{
  dev="$1"
  vendor=$(cat /sys/bus/pci/devices/$dev/vendor)
  device=$(cat /sys/bus/pci/devices/$dev/device)
  if [ -e /sys/bus/pci/devices/$dev/driver ]
  then
    echo $dev > /sys/bus/pci/devices/$dev/driver/unbind
  fi
  echo $vendor $device > /sys/bus/pci/drivers/vfio-pci/new_id
}
 
# On charge le module et on l'attribue à la carte graphique et à la carte son HDMI associée
modprobe vfio-pci
vfiobind 0000:01:00.0
vfiobind 0000:01:00.1
 
# Juste pour être sûr…
if ps -A | grep -q $vmname; then
  echo "$vmname is already running." &
  exit 1
fi
 
# Les options de sorties, on garde un -vga std, histoire de passer facilement les contrôles à la VM
# Cependant, cette carte doit être désactivée dans le gestionnaire de périphériques de Windows
OPT_OUTPUT="-vga std -device vfio-pci,host=01:00.0,multifunction=on -device vfio-pci,host=01:00.1"
 
# Copie des variables de l'UEFI
cp /usr/share/OVMF/OVMF_VARS.fd /tmp/my_vars.fd
 
# Utilisation de alsa ou de pulseaudio, suivant config de l'ordi…
#export QEMU_AUDIO_DRV=alsa QEMU_AUDIO_TIMER_PERIOD=0
export QEMU_AUDIO_DRV=pa QEMU_PA_SAMPLES=4096 QEMU_PA_SERVER=127.0.0.1
 
qemu-system-x86_64 \
  -name $vmname,process=$vmname \
  -machine type=q35,accel=kvm \
  -cpu host,kvm=off \
  -smp 3,sockets=1,cores=3,threads=1 \
  -enable-kvm \
  -m 8G \
  -mem-path /dev/hugepages/kvm \
  -mem-prealloc \
  -balloon none \
  -rtc clock=host,base=localtime \
  -serial none \
  -parallel none \
  $OPT_OUTPUT \
  -drive if=pflash,format=raw,readonly,file=/usr/share/OVMF/OVMF_CODE.fd \
  -drive if=pflash,format=raw,file=/tmp/my_vars.fd \
  -device virtio-scsi-pci,id=scsi \
  -drive id=disk0,if=virtio,cache=none,format=qcow2,file=/srv/vms/win7-systeme.img \
  -drive id=disk1,if=virtio,cache=none,format=qcow2,file=/srv/vms/win7-jeux.img \
  -netdev type=tap,id=net0,ifname=tap0,vhost=on \
  -device virtio-net-pci,netdev=net0,mac=00:16:3e:00:01:01 \
  -drive file=/srv/data/images_cd/virtio-win.iso,id=virtiocd,format=raw,if=none \
  -device ide-cd,bus=ide.1,drive=virtiocd \
  -soundhw ac97
 
exit 0

Utilisation

./start_kvm.sh

Sources

utilisateurs/captnfab/tutos/virtualisation-vga-passthrough.1516550030.txt.gz · Dernière modification: 21/01/2018 16:53 par captnfab

Pied de page des forums

Propulsé par FluxBB