Grafikkarte an virtuelle Maschine durchreichen

Lesedauer: 4 Minuten

In TrueNAS hat man inzwischen die Möglichkeit, eine Grafikkarte zu einer virtuellen Maschine durchzureichen. Nach einigen Versuchen, dies zu bewerkstelligen, erschien es auf den “ersten Blick” gar nicht so einfach, das richtige Setup zu finden, da TrueNAS selbst auch noch eine Grafikkarte für eigene Funktionen benötigt.

Somit hatte ich zu Beginn immer das Problem, das die externe Grafikkarte, welche ich gerne an eine VM durchreichen wollte, von TrueNAS belegt wurde und die interne Grafikkarte zur Verwendung in einer VM zur Verfügung stand – dies sollte genau anders herum sein.

Damit Du nun dieses Problem sehr schnell und einfach lösen kannst, folge einfach den kurzen Schritten unterhalb und schon kannst Du die externe Grafikkarte in deiner VM verwenden.

BIOS Einstellungen

Damit die externe Grafikkarte in TrueNAS durchgereicht werden kann, sind 2 BIOS-Einstellungen notwendig.

  1. Advanced -> CPU Config -> SVM Module -> enable
  2. Advanced -> AMD CBS -> IOMMU -> enable

Erkannte Grafikkarten des Systems identifizieren

Nachdem Du die BIOS-Einstellungen getätigt hast, kannst Du nach einem Neustart die installierten und erkannten Grafikkarten anzeigen lassen. Dies geschieht mit folgendem Befehl innerhalb der TrueNAS CLI:

midclt call device.get_gpus | jq

Als Ausgabe erhälst Du eine Liste, die in etwa so aussieht:

[
  {
    "addr": {
      "pci_slot": "0000:07:00.0",
      "domain": "0000",
      "bus": "07",
      "slot": "00"
    },
    "description": "NVIDIA Corporation GK106 [GeForce GTX 660]",
    "devices": [
      {
        "pci_id": "10DE:11C0",
        "pci_slot": "0000:07:00.0",
        "vm_pci_slot": "pci_0000_07_00_0"
      },
      {
        "pci_id": "10DE:0E0B",
        "pci_slot": "0000:07:00.1",
        "vm_pci_slot": "pci_0000_07_00_1"
      }
    ],
    "vendor": "NVIDIA",
    "uses_system_critical_devices": false,
    "available_to_host": false
  },
  {
    "addr": {
      "pci_slot": "0000:09:00.0",
      "domain": "0000",
      "bus": "09",
      "slot": "00"
    },
    "description": "Advanced Micro Devices, Inc. [AMD/ATI] Renoir",
    "devices": [
      {
        "pci_id": "1002:1636",
        "pci_slot": "0000:09:00.0",
        "vm_pci_slot": "pci_0000_09_00_0"
      },
      {
        "pci_id": "1002:1637",
        "pci_slot": "0000:09:00.1",
        "vm_pci_slot": "pci_0000_09_00_1"
      },
      {
        "pci_id": "1022:15DF",
        "pci_slot": "0000:09:00.2",
        "vm_pci_slot": "pci_0000_09_00_2"
      },
      {
        "pci_id": "1022:1639",
        "pci_slot": "0000:09:00.3",
        "vm_pci_slot": "pci_0000_09_00_3"
      },
      {
        "pci_id": "1022:1639",
        "pci_slot": "0000:09:00.4",
        "vm_pci_slot": "pci_0000_09_00_4"
      },
      {
        "pci_id": "1022:15E3",
        "pci_slot": "0000:09:00.6",
        "vm_pci_slot": "pci_0000_09_00_6"
      }
    ],
    "vendor": "AMD",
    "uses_system_critical_devices": false,
    "available_to_host": true
  }
]

An der Ausgabe kannst Du nun erkennen, das TrueNAS 2 Grafikkarten gefunden hat. Einmal eine NVIDIA und eine AMD. Unterhalb jeder Grafikkarte gibt es den Hinweis "available_to_host": true/false. Dies besagt, das die Grafikkarte für den Host (also TrueNAS selbst) zur Verfügung steht (true) oder nicht (false). Bei meinem System war dies kontinuierlich so, das die AMD Karte für den Host zur Verfügung stand. Dies wollte ich, wie oben bereits erwähnt, nicht. Also musste ich die Karten wechseln. Dies geht, sobald TrueNAS in die GUI gestartet hat leider nicht mehr über das Web-Interface (zumindest bei mir nicht).

Korrekte Grafikkarte durchrreichen

In der Ausgabe oberhalb habe ich 4 Zeilen (4, 13, 28 und 37) markiert – diese Zeilen beinhalten die sogenannten PCI-ID’s, die nun durch das oben aktivierte IOMMU vom BIOS kommen. Wichtig ist, die ID’s zu nutzen, die auf .0 enden! Diese werden genutzt, um TrueNAS mitzuteilen, welche ID der Grafikkarte isoliert werden soll – also die Karte, die an die VM durchgereicht werden soll. Bei mir ist dies die ID: 0000:07:00.0. Diese ID teilst Du nun dem folgenden Kommando mit:

midclt call system.advanced.update '{"isolated_gpu_pci_ids": ["0000:07:00.0"]}' | jq

Ausgabe des oberen Befehls:

{
  "id": 1,
  "consolemenu": true,
  "serialconsole": true,
  "serialport": "ttyS0",
  "serialspeed": "9600",
  "powerdaemon": false,
  "swapondrive": 2,
  "overprovision": null,
  "traceback": true,
  "advancedmode": false,
  "autotune": false,
  "debugkernel": false,
  "uploadcrash": true,
  "anonstats": true,
  "anonstats_token": "",
  "motd": "Welcome to TrueNAS",
  "boot_scrub": 7,
  "fqdn_syslog": false,
  "sed_user": "USER",
  "sysloglevel": "F_INFO",
  "syslogserver": "",
  "syslog_transport": "UDP",
  "kdump_enabled": false,
  "isolated_gpu_pci_ids": [
    "0000:07:00.0"
  ],
  "kernel_extra_options": "",
  "syslog_tls_certificate": null,
  "syslog_tls_certificate_authority": null,
  "consolemsg": false
}

Hier bestätigt TrueNAS in Zeile 26, das die GPU erfolgreich isoliert wurde. Führe hiernach bitte einen Neustart durch, damit der integrierte NVIDIA Treiber (oder andere) die Grafikkarte nicht einbindet.

Neustart und virtuelle Maschine einrichten

Nachdem Du nun das System neu gestartet hast, kannst Du dich in der Web-Oberfläche des TrueNAS anmelden, auf Virtualisierung gehen und dort zu der passenden virtuellen Maschine, die externe Grafikkarte auswählen. Dies richtest Du unter Geräte -> Hinzufügen ein. Hier ist abermals wichtig, die richtige ID zu wählen. Statt mit einem Doppelpunkt, sind die Geräte nun mit einem Unterstrich getrennt.

Richtiges PCI Gerät auswählen
Richtiges PCI Gerät auswählen

Virtuelle Maschine starten und testen

Wenn Du nun deine virtuelle Maschine startest, kann es sein, das der NVIDIA Treiber direkt zur Verfügung steht und die Grafikkarte schon erkannt wurde. Sollte der Befehl nvidia-smi nicht gefunden werden, so installierst Du zuerst den NVIDIA-Detector, der prüft, ob überhaupt eine Grafikkarte gefunden wurde.

sudo apt install nvidia-detect

Mit einem Aufruf von nvidia-detect bekommst Du als Ausgabe, welche Karte gefunden wurde und welcher Treiber am Besten geeignet ist.

user@server:~$ nvidia-detect
Detected NVIDIA GPUs:
00:06.0 VGA compatible controller [0300]: NVIDIA Corporation GK106 [GeForce GTX 660] [10de:11c0] (rev a1)

Checking card:  NVIDIA Corporation GK106 [GeForce GTX 660] (rev a1)
Your card is supported by all driver versions.
Your card is also supported by the Tesla 470 drivers series.
Your card is also supported by the Tesla 450 drivers series.
Your card is also supported by the Tesla 418 drivers series.
It is recommended to install the
    nvidia-driver
package.

Das System empfiehlt also, den nvidia-driver als Paket zu installieren, da er mit fast allen Karten kompatibel ist. Wir installieren direkt das NVIDIA-SMI Paket mit, da dies ein nützliches Tool zur Statusabfrage der Grafikkarte ist.

sudo apt install nvidia-driver && sudo apt install nvidia-smi

Nach der Installation des Treibers und SMI, kannst Du mit nvidia-smi Informationen zu deiner Grafikkarte anzeigen lassen. Auch teilt das Tool Dir mit, ob gerade GPU-Prozesse laufen oder nicht (Dies kann, wenn die GPU benutzt wird, aus einer anderen Shell ggf. besser abgefragt werden).

Ausgabe von nvidia-smi
Ausgabe von nvidia-smi
Wie hat Dir der Beitrag gefallen?
Bewertung: 5/5 - abgegebene Bewertungen: 3

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert