GAMING στο LINUX - PCIE VGA Passthough - NO MORE REBOOTS

linux
gaming
#1

PCIE VGA passthough – οδηγός για τολμηρούς. Part 1

Τα τελευταία χρονιά (με τη βοήθεια της AMD βεβαίως βεβαίως) οι desktop επεξεργαστές των INTEL και AMD αύξησαν τον αριθμό των πυρήνων τους, έτσι ώστε πλέον να είναι ο τελικός μέσος χρήστης κάτοχος επεξεργαστή με 8 ή παραπάνω πυρήνες.

Η υπολογιστική ισχύς που έχουμε πλέον στα χέρια μας είναι εκπληκτικά μεγάλη, σε σημείο που να μένει και αναξιοποίητη.

Άσο μεγάλη και να είναι η συμβολή του wine project και του steam proton project στο να καταφέρουν να φέρουν παιχνίδια στο κόσμο του linux, αυτοί οι software based wrappers πάντα θα έχουν πρόβλημα ή καθόλου υποστήριξη από τους game developers.

Δεν θα ήταν λοιπόν καλό αν μπορούσαμε με κάποιο τρόπο να φτιάξουμε ένα virtual machine σε linux με Windows 10 και να του δώσουμε αποκλειστικά μια δεύτερη κάρτα γραφικών για χρήση, αφήνοντας την πρώτη για το linux?

Για παράδειγμα στο δικό μου setup:

AMD TREADRIPPER 1950x

GIGABYTE X399 gaming 7

32GB DDR4 3000

GIGABYTE VEGA 64 WATERCOOLED

ASUS GEFORCE GTX760 → VGA PASSTHROUGH

Το linux χρησιμοποιεί την VEGA 64 για το δικό του περιβάλλον εργασίας και την gtx 760 ως κάρτα γραφικών αποκλειστικά για το Windows 10 VM.

Αν έχετε λίγες γνώσεις από Linux, και hardware που να υποστηρίζει iommu groups, καθώς και μια δεύτερη κάρτα γραφικών, δοκιμάστε και θα δείτε bare metal επιδόσεις γραφικών σε VM.

Youtube —> σύντομα.

Ο παρακάτω οδηγός είναι για archlinux. Αν και δύσκολο στην εγκατάσταση το arch έχει μάλλον την καλύτερη τεκμηρίωση μέσω του wiki του. Επίσης Προτείνεται η fedora για διανομή μιας και η ομάδα fedora μετέχει ενεργά στo development.

Πριν ξεκινήσετε προτείνω να διαβάσετε αρχικά στο archwiki:

https://wiki.archlinux.org/index.php/Libvirt

https://wiki.archlinux.org/index.php/PCI_passthrough_via_OVMF

To guide θα χωριστεί σε μέρη.

Στο πρώτο μέρος θα αναφέρω στις απαιτήσεις του συστήματος και στην προετοιμασία αυτού.

  1. ελέγξτε αν η πλατφόρμα επεξεργαστή – μητρικής υποστηρίζει virtualization technology και iommu groups.

Τι είναι το IOMMU και τι τα IOMMU groups;

Γενικά το μοντέρνο hardware υποστηρίζει virtualization και IOMMU. Μέσα από το bioς της μητρικής ενεργοποιήστε AMD-Vi/Intel VT-d και τα iommu groups.

  1. Η κάρτα γραφικών που θέλετε να κάνετε passthrough στο VM θα πρέπει να υποστηρίζει UEFI boot. Γενικά οι κάρτες γραφικών από το 2012 και μετά υποστηρίζουν boot σε UEFI mode της μητρικής.

https://www.techpowerup.com/vgabios/

ΠΡΟΣΟΧΗ: Οι κάρτες AMD VEGA 56/64 πάσχουν από reset bug και για το λόγο αυτό δε συστήνονται να γίνονται passthrough.

  1. Αν έχεται συμβατό hardware, τοποθετήστε την δεύτερη κάρτα γραφικών σε μια PCIE υποδοχή και ξεκινήστε τον υπολογιστή ρυθμίζοντας το bios να κάνει boot από την κάρτα γραφικών που θέλεται να χρησιμοποιεί το linux (ακόμα και η IGPU των INTEL cpus είναι αρκετή για το linux γραφικό περιβάλλον. :slight_smile: Προσοχή σε περιπτώσεις που έχετε δύο κάρτες γραφικών να επαρκεί η ισχύς του τροφοδοτικού.

Θέστε σαν boot kernel parameter:

Intel CPUs (VT-d) βάλτε intel_iommu=on

AMD CPUs (AMD-Vi) βάλτε amd_iommu=on

https://wiki.archlinux.org/index.php/Kernel_parameters

Κάντε επανεκκίνηση τον υπολογιστή και μετά ελέγξτε αν όλα πήγαν καλά

$ dmesg | grep -e DMAR -e IOMMU

Παράδειγμα output:

[1.526392] AMD-Vi: IOMMU performance counters supported

[1.526446] AMD-Vi: IOMMU performance counters supported

[1.536722] AMD-Vi: Found IOMMU at 0000:00:00.2 cap 0x40

[1.536725] AMD-Vi: Found IOMMU at 0000:40:00.2 cap 0x40

[1.538977] perf/amd_iommu: Detected AMD IOMMU #0 (2 banks, 4 counters/bank).

[1.539011] perf/amd_iommu: Detected AMD IOMMU #1 (2 banks, 4 counters/bank).
[2.989889] AMD-Vi: AMD IOMMUv2 driver by Joerg Roedel jroedel@suse.de

Βλέπουμε παραπάνω ότι αναγνωρίζονται iommu groups.

Γενικά η κάρτα που θα γίνει passthrough πρέπει να είναι σε ξεχωριστό IOMMU από την κάρτα γραφικών του συστήματος. Αν δεν τα καταφέρετε τότε η πιο εύκολη λύση είναι να αλλάξετε PCIE slot στη μητρική στην κάρτα που θα γίνει passthrough.

Φτιάξτε ένα script:

$ vim iommu_groups

#!/bin/bash

shopt -s nullglob

for g in /sys/kernel/iommu_groups/*; do

echo "IOMMU Group ${g##*/}:"

for d in $g/devices/*; do

echo -e "\t$(lspci -nns ${d##*/})"

done;

done;

Κάντε το script εκτελέσιμο και τρέξτε το.

$ chmod +x iommu_groups

$ ./iommu_groups

Παράδειγμα στον δικό μου υπολογιστή:

.

.

.

IOMMU Group 11:

40:03.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) PCIe Dummy Host Bridge [1022:1452]

40:03.1 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) PCIe GPP Bridge [1022:1453]

43:00.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Device [1022:1470] (rev c1)

44:00.0 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Device [1022:1471]

45:00.0 VGA compatible controller [0300]: Advanced Micro Devices, Inc. [AMD/ATI] Vega 10 XL/XT [Radeon RX Vega 56/64] [1002:687f] (rev c1)

.

.

.

.

IOMMU Group 2:

00:03.0 Host bridge [0600]: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-1fh) PCIe Dummy Host Bridge [1022:1452]

00:03.1 PCI bridge [0604]: Advanced Micro Devices, Inc. [AMD] Family 17h (Models 00h-0fh) PCIe GPP Bridge [1022:1453]

07:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK104 [GeForce GTX 760] [10de:1187] (rev a1)
07:00.1 Audio device [0403]: NVIDIA Corporation GK104 HDMI Audio Controller [10de:0e0a] (rev a1)

Δηλαδή: Η κύρια κάρτα γραφικών ειναι στο IOMMU Group 11, ενώ η VGA GEFORCE 760 που θέλουμε να δώσουμε στο VM είναι στο IOMMU Group 2.

  1. Στο επόμενο βήμα πρέπει να πούμε στον kernel κατά το boot του συστήματος να μην δώσει στην κάρτα γραφικών driver αλλά να του αποδώσει ένα dummy driver ώστε να μπορεί να του αποδώσει driver μόνο το VM. Αυτό επιτυγχάνεται με τη χρήση kernel parameters και kernel modules κατά το boot του συστήματος.

Από την 4.1 έκδοση πυρήνα και μετά ο πυρήνας χρησιμοποιεί vfio-pci driver για dummy. Επειδή δεν είναι ενσωματωμένος στον πυρήνα τον φορτώνουμε ως module.

Χρειαζόμαστε τα device IDs της κάρτας γραφικών που θα κάνουμε passthrough.

Στο παραπάνω παράδειγμα:

07:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK104 [GeForce GTX 760] [10de:1187] (rev a1)

07:00.1 Audio device [0403]: NVIDIA Corporation GK104 HDMI Audio Controller [10de:0e0a] (rev a1)

Πρέπει να απομονώσουμε τόσο το κομμάτι γραφικών όσο και το κομμάτι του ήχου της κάρτας γραφικών. 10de:1187 και 10de:0e0a αντίστοιχα.

Για το archlinux:

$ sudo vim /etc/modprobe.d/vfio.conf

options vfio-pci ids=10de:1187,10de:0e0a

Τώρα πρέπει να φορτώσουμε το vfio module πριν ο πυρήνας αποδώσει τους δικούς κανονικούς drivers.

$ sudo vim/etc/mkinitcpio.conf προσθέστε στα modules τα vfio_pci,vfio,vfio_iommu_type1,vfio_virqfd

MODULES=(… vfio_pci vfio vfio_iommu_type1 vfio_virqfd …)

και στo ίδιο αρχείο στα hooks

HOOKS=(… modconf …)

Φτιάξτε το mkinitcpio:

$ sudo mkinitcpio -p linux

ΠΡΟΣΟΧΗ : Άν κάνετε αλλαγή στο /etc/modprobe.d/vfio.conf πάντα πρέπει να ανανεώνεται το mkinitcpio. Την έχω πατήσει άπειρες φορές.

Επανεκκίνηση και:

$ dmesg | grep -i vfio

[ 1.955395] VFIO - User Level meta-driver version: 0.3

[ 1.959880] vfio-pci 0000:07:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none

[ 1.974161] vfio_pci: add [10de:1187[ffff:ffff]] class 0x000000/00000000

[ 1.990875] vfio_pci: add [10de:0e0a[ffff:ffff]] class 0x000000/00000000

[ 7.804713] vfio-pci 0000:07:00.0: vgaarb: changed VGA decodes: olddecodes=io+mem,decodes=io+mem:owns=none

[32910.509878] vfio-pci 0000:07:00.0: enabling device (0000 -> 0003)

ή

$ lspci -nnk -d 10de:1187

07:00.0 VGA compatible controller [0300]: NVIDIA Corporation GK104 [GeForce GTX 760] [10de:1187] (rev a1)

Subsystem: ASUSTeK Computer Inc. GK104 [GeForce GTX 760] [1043:847a]

Kernel driver in use: vfio-pci

Kernel modules: nouveau

και

$ lspci -nnk -d 10de:0e0a

07:00.1 Audio device [0403]: NVIDIA Corporation GK104 HDMI Audio Controller [10de:0e0a] (rev a1)

Subsystem: ASUSTeK Computer Inc. GK104 HDMI Audio Controller [1043:847a]

Kernel driver in use: vfio-pci

Kernel modules: snd_hda_intel

Μόλις τελειώσατε το πιο δύσκολο κομμάτι.

Tο isolation της GeForce GTX 760 πέτυχε. Απλά και όμορφα.

Η ώρα για το Path of Exile σε VM με native performance (όσο δηλαδή επιτρέπει η 760 χαχα) πλησιάζει….

5 Likes
Δειξε αφοβα το Desktop σου