Comment jouer sur Linux avec 95% de performance native ?

Mis à jour le lundi 26 mars 2018 par johackim

Voici une solution pour pouvoir jouer aux jeux vidéos depuis un environnement Linux avec 95% de performance native.

Une vidéo de démonstration par blu3bird84

Terminologies

Avant toute chose, il y a quelques terminologies à connaitre :

  • KVM (Kernel-based Virtual Machine) est le module du noyau Linux qui interagit avec les fonctionnalités de virtualisation du processeur. C'est un hyperviseur de type I pour Linux.
  • QEMU est le logiciel de virtualisation basé sur KVM qui émule les processeurs virtuels et les périphériques et qui lance et éteint les machines virtuelles.
  • virt-manager est l'interface graphique qui permet de créer, configurer, et faire tourner les machines virtuelles.
  • libvirt est la bibliothèque qui permet à virt-manager d'interagir avec les capacités de virtualisation fournies par QEMU.
  • virtio est une interface de programmation qui gère toutes les communications entre l'hyperviseur et le noyau.
  • OVMF (Open Virtual Machine Firmware) est un projet pour permettre le support de l‘UEFI aux machines virtuelles.
  • vfio Virtual Function I/O
  • IOMMU Unité de gestion de mémoire d'entrée-sortie

Prérequis

  • Avoir deux Carte-graphiques ou 1 Apu et une Carte-graphique
  • Votre carte mère doit supporter la technologie IOMMU
  • Votre CPU doit supporter la virtualisation matérielle
  • Votre carte graphique doit supporter l’UEFI
  • Avoir 2 Entrées vidéo sur l'écran (1 pour le linux (host) et 1 pour la Machine virtuelle (Guest)

Installation

L'installation que je propose ici est spécifiquement prévue pour Arch Linux ou une distribution basé dessus comme Antergos. Cette procédure aura pour but d'installer un environnement Qemu/KVM + VFIO/IOMMU GPU Passthrough afin de pouvoir jouer aux jeux depuis Linux sur une machine virtuelle Windows.

Activer IOMMU

# /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on"
grub-mkconfig -o /boot/grub/grub.cfg
dmesg|grep -e DMAR -e IOMMU # Vérifier l'activation de IOMMU

Installer libvirt, qemu, virt-manager et OVMF

pacman -S dnsmasq ebtables dmidecode # libvirt dependencies
pacman -S qemu ovmf virt-manager
pacman -S libvirt
usermod -aG libvirt username
systemctl enable libvirtd

Configurer qemu

mv /etc/libvirt/qemu.conf /etc/libvirt/qemu.conf.orig
cat <<EOT >> /etc/libvirt/qemu.conf
user = "root"
group = "root"
clear_emulator_capabilities = 0
cgroup_device_acl = [
"/dev/null", "/dev/full", "/dev/zero",
"/dev/random", "/dev/urandom",
"/dev/ptmx", "/dev/kvm", "/dev/kqemu",
"/dev/rtc","/dev/hpet", "/dev/vfio/vfio",
"/dev/vfio/1"
]
nvram = [
"/usr/share/ovmf/x64/OVMF_CODE.fd:/usr/share/ovmf/x64/OVMF_VARS.fd"
]
EOT

Installer vfio

lspci -nn|grep -iP "NVIDIA|Radeon" # $VFIOID
echo options vfio-pci ids=$VFIOID > /etc/modprobe.d/vfio.conf
MODULES="vfio vfio_iommu_type1 vfio_pci vfio_virqfd" # /etc/mkinitcpio.conf
mkinitcpio -p linux
lspci -k | grep -i vfio-pci # Check vfio

Installer virtio

pacaur -S virtio-win
echo -e 'virtio\virtio_blk\virtio_pci\virtio_net' | sudo tee /etc/modules-load.d/virtio.conf
lsmod | grep virtio # Check virtio modules

Configuration de la machine virtuelle

Une fois que l'environnement est prêt, il faut créer et configurer notre machine virtuelle avec virt-manager. Plutôt que de mettre une centaine de screenshots voici une vidéo (en anglais) qui donne étape par étape la configuration de notre machine virtuelle.

Configuration d'une machine virtuelle Windows avec virt-manager

Configuration réseau

Pour configurer une connexion réseau sur votre machine virtuelle :

  1. Edit -> Connection Details -> Virtual Networks -> Add Network
  2. Create "br0" virtual network with "Forwarding to physical network" option and Physical device wlp59s0
  3. virsh edit <VM_name> and add :
<interface type='network'>
<mac address='53:54:00:b8:65:3d'/>
<source network='br0'/>
</interface>

Ma configuration

Si vous avez suivie toutes les étapes, vous devriez avoir votre machine virtuelle prête à l'emploi pour jouer à vos jeux préférés.

De mon côté, j'ai un Laptop, ce qui implique une configuration particulière. Pour le moment, je peux seulement lancer ma VM avec un serveur VNC, je n’ai pas réussi à rendre fonctionnelle ma sortie HDMI sur un écran :(.

Voilà à quoi ressemble ma configuration :

sudo /usr/sbin/qemu-system-x86_64 \
-cpu host,kvm=off \
-enable-kvm \
-m 4096 \
-smp cores=4,threads=2 \
-device vfio-pci,host=01:00.0 \
-drive if=pflash,format=raw,readonly,file=/usr/share/ovmf/x64/OVMF_CODE.fd \
-drive if=pflash,format=raw,file=/usr/share/ovmf/x64/OVMF_VARS.fd \
-drive file=/var/lib/libvirt/images/win10.qcow2,format=qcow2,if=none,id=disk0,cache=writeback \
-device virtio-blk-pci,scsi=off,bus=pci.0,addr=0x8,drive=disk0,id=virtio-disk0,bootindex=1 \
-netdev type=tap,script=no,downscript=no,id=net0,ifname=tap2 \
-device virtio-net-pci,netdev=net0,disable-legacy=on,iommu_platform=true,romfile= \
-boot menu=on

Références :