# PCIe Karte in Qemu-KVM durchreichen per passthroug

## SarahS93

Habe zwei nahe zu identische NVidia GT210 Grafikkarte in meinem System.

```
lspci

01:00.0 VGA compatible controller: NVIDIA Corporation GT218 [GeForce 210] (rev a2)

01:00.1 Audio device: NVIDIA Corporation High Definition Audio Controller (rev a1)

02:00.0 VGA compatible controller: NVIDIA Corporation GT218 [GeForce 210] (rev a2)

02:00.1 Audio device: NVIDIA Corporation High Definition Audio Controller (rev a1)
```

Die mit 01:00.1 benutze ich an meinem Desktopbildschirm. habe sie auch fest in meine xorg.conf eingetragen (xorg.conf: ...BusID           "PCI:1:0:0"...)

Diese beiden NVidia-Geräte will ich in einer VM haben.:

```
02:00.0 VGA compatible controller: NVIDIA Corporation GT218 [GeForce 210] (rev a2)

02:00.1 Audio device: NVIDIA Corporation High Definition Audio Controller (rev a1)
```

Habe mich dazu schon etwas eingelesen....

Meine Intel Core i7-2600 hat VT-d

Im Internet finde ich mir komisch erscheinende Aussagen das ein Mainboard diese Virtualisierungstechnick auch unterstützen muss?!

Dachte bisher immer das hängt einzig und allein von dem Prozessor ab. (Gigabyte P67-UD4 verwende ich)

```
[*] Virtualization --->

    --- Virtualization

    <*> Kernel-based Virtual Machine (KVM) support

    <M>   KVM for Intel processors support 
```

ist natürlich auch eingeschaltet

Grub gebe ich beim booten noch "iommu=pt iommu=1" mit.

Die Anzeige von:

dmesg | grep -e DMAR -e IOMMU

```
[    0.000000] Intel-IOMMU: enabled
```

verwundert mich etwas weil dort nichts zu DMAR angezeigt wird, ist das normal?

```
Bus options (PCI etc.)  --->

  <*> PCI Stub driver
```

habe ich auch aktiviert

```
# echo "10de:0a65" > /sys/bus/pci/drivers/pci-stub/new_id

bash: echo: Schreibfehler: Das Argument ist ungültig.

# echo "0000:02:00.0" > /sys/bus/pci/devices/0000:00:1b.0/driver/unbind

bash: echo: Schreibfehler: Kein passendes Gerät gefunden.

# echo "0000:02:00.0" > /sys/bus/pci/drivers/pci-stub/bind

bash: echo: Schreibfehler: Kein passendes Gerät gefunden.
```

funktioniert irgendwie nicht!?

Meine VM starte ich so:

```
qemu-system-x86_64 \

    -k de -enable-kvm -smp 8 -m 8192 -localtime -name __vm91test__ \

    -hda vm91_disk1.img \

    -vga vmware \

    -net nic,model=virtio,macaddr=00:00:00:00:00:91 \

    -net tap,ifname=qtap91,script=no,downscript=no \

    -usbdevice tablet \

    -vnc 192.168.0.1:91 \

    -daemonize \

   -boot d \

   -cdrom ../gentoo_20140508____install-amd64-minimal-20140508.iso \

    -device pci-assign,host=02:00.0 \

    -pidfile vm91_run.pid &
```

und erhalte dann diese Meldungen:

```
qemu-system-x86_64: -device pci-assign,host=02:00.0: No IOMMU found.  Unable to assign device "(null)"

qemu-system-x86_64: -device pci-assign,host=02:00.0: Device initialization failed.

qemu-system-x86_64: -device pci-assign,host=02:00.0: Device 'kvm-pci-assign' could not be initialized
```

Habt Ihr ein paar Ideen was ich versuchen könnte?

Eine weitere andere Frage die ich noch habe ... wie kriege ich die Auflösung in einer VM auf 2560x1600 hoch?

----------

## Jean-Paul

Ich nehme an du kennst dies Seiten

https://forums.gentoo.org/viewtopic-t-968156.html?sid=7d17f69a3c4c2ef0a68d86853a72344f

http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM

http://wiki.xenproject.org/wiki/VTdHowTo

Ob dein Mainboard explizit vt-d unterstützt weiß ich nicht. Es gibt aber im BIOS unter "Miscellaneous Settings" den Punkt "Virtualization Technology" der eingeschaltet sein sollte - manche OEM's schalten ihn aber ab. Ob dies ausreicht kann ich dir nicht sagen.

dmesg | grep -e DMAR -e IOMMU sieht bei mir so aus  *Quote:*   

> 
> 
> [    0.000000] ACPI: DMAR 0x00000000C5932BC8 0000B8 (v01 INTEL  HSW      00000001 INTL 00000001)
> 
> [    0.335646] dmar: IOMMU 0: reg_base_addr fed90000 ver 1:0 cap c0000020660462 ecap f0101a
> ...

 

Im Kernel habe ich dies aktiviert

zgrep "DMAR\|IOMMU" /proc/config.gz  *Quote:*   

> 
> 
> # CONFIG_GART_IOMMU is not set
> 
> CONFIG_CALGARY_IOMMU=y
> ...

 

----------

## SarahS93

Ja, die links sind mir bestens bekannt (-;

Bei http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM steht : 

```
echo "10de:0a65" > /sys/bus/pci/drivers/pci-stub/new_id

echo "0000:02:00.0" > /sys/bus/pci/devices/0000:00:1b.0/driver/unbind

echo "0000:02:00.0" > /sys/bus/pci/drivers/pci-stub/bind
```

Wenn ich das aber versuche, erhalte ich solche Fehlermeldungen :

```

# echo "10de:0a65" > /sys/bus/pci/drivers/pci-stub/new_id

bash: echo: Schreibfehler: Das Argument ist ungültig.

# echo "0000:02:00.0" > /sys/bus/pci/devices/0000:00:1b.0/driver/unbind

bash: echo: Schreibfehler: Kein passendes Gerät gefunden.

# echo "0000:02:00.0" > /sys/bus/pci/drivers/pci-stub/bind

bash: echo: Schreibfehler: Kein passendes Gerät gefunden.
```

Vielleicht liegt da ja schon mein Problem, nur weiss ich nicht wie ich es löse.

Bei dem Link ( http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM ) steht:

set "Bus options (PCI etc.)" -> "Support for DMA Remapping Devices" to "*"

set "Bus options (PCI etc.)" -> "Enable DMA Remapping Devices" to "*"

set "Bus options (PCI etc.)" -> "PCI Stub driver" to "*" 

Bei mir gibt es in der Kernelconfig nur:

set "Bus options (PCI etc.)" -> "PCI Stub driver" to "*" 

set "Bus options (PCI etc.)" -> "Support for DMA Remapping Devices" to "*"

set "Bus options (PCI etc.)" -> "Enable DMA Remapping Devices" to "*"

Ist bei mir in der Kernelconfig (Linux deruse 3.10.7-gentoo-r1) nicht da!?

```
Bus options (PCI etc.)  --->

  [*] PCI support

  [*]   Support mmconfig PCI config space access

  [*]   PCI Express support

  < >     PCI Express Hotplug driver

  [*]     Root Port Advanced Error Reporting support

  [ ]       PCI Express ECRC settings control

  < >       PCIe AER error injector support

  -*-     PCI Express ASPM control

  [ ]       Debug PCI Express ASPM

            Default ASPM policy (BIOS default)  --->

  [*] Message Signaled Interrupts (MSI and MSI-X)

  [ ] PCI Debugging

  [ ] Enable PCI resource re-allocation detection

  <*> PCI Stub driver

  [*] Interrupts on hypertransport devices

  [ ] PCI IOV support

  [*] PCI PRI support

  [*] PCI PASID support

  < > PCI IO-APIC hotplug support

  <*> PCCard (PCMCIA/CardBus) support  --->

  <*> Support for PCI Hotplug  --->

  [ ] RapidIO support
```

Virtualization Technology steht im BIOS auf enabled, hatte ich vergessen zu sagen.

----------

## Jean-Paul

DMAR findest du hier  *Quote:*   

>      Device Drivers  ---> 
> 
>  [*] IOMMU Hardware Support  ---> 
> 
>  --- IOMMU Hardware Support  
> ...

 

----------

## SarahS93

OK, habe ich eingeschaltet. Es hat sich aber nichts verändert dadurch.

echo "10de:0a65" > /sys/bus/pci/drivers/pci-stub/new_id

echo "0000:02:00.0" > /sys/bus/pci/devices/0000:00:1b.0/driver/unbind

echo "0000:02:00.0" > /sys/bus/pci/drivers/pci-stub/bind

Was hat das damit aufsich?

----------

## Jean-Paul

 *Quote:*   

> OK, habe ich eingeschaltet. Es hat sich aber nichts verändert dadurch.
> 
> echo "10de:0a65" > /sys/bus/pci/drivers/pci-stub/new_id
> 
> echo "0000:02:00.0" > /sys/bus/pci/devices/0000:00:1b.0/driver/unbind
> ...

 

Du hast nicht aufmerksam gelesen  :Smile: 

Dort steht  *Quote:*   

> echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/new_id
> 
>     echo 0000:01:00.0 > /sys/bus/pci/devices/0000:01:00.0/driver/unbind
> 
>     echo 0000:01:00.0 > /sys/bus/pci/drivers/pci-stub/bind 

 

Also echo "8086 10b9" ohne Doppelpunkt und echo 0000:01:00.0 ohne Quots ("").

Hast du kontrolliert, ob es diesen Pfad überhaupt gibt (/sys/bus/pci/devices/0000:01:00.0/driver/unbind).

----------

## SarahS93

OK, sehe die Fehler...

```
echo "10de 0a65" > /sys/bus/pci/drivers/pci-stub/new_id 

echo 0000:02:00.0 > /sys/bus/pci/devices/0000\:02\:00.0/driver/unbind

echo 0000:02:00.0 > /sys/bus/pci/drivers/pci-stub/bind
```

funktioniert jetzt schonmal... wow, kewl!

```
qemu-system-x86_64: -device pci-assign,host=02:00.0: No IOMMU found.  Unable to assign device "(null)"

qemu-system-x86_64: -device pci-assign,host=02:00.0: Device initialization failed.

qemu-system-x86_64: -device pci-assign,host=02:00.0: Device 'kvm-pci-assign' could not be initialized
```

Die Fehlermeldung beim starten bleibt aber immer noch ....

Habe den nvidia Treiber deinstalliert und entladen, bei lsmod tauchte er dann nicht mehr. Aber auch das hatte nichts gebracht.

So ein mist :-/ ....

...

"No IOMMU found.  Unable to assign device "(null)"" Heisst doch das da irgendwas noch nicht mit diesem IOMMU in Ordnung ist?

Habe nur leider kein anderes Mainboard zum Testen da...

----------

## firefly

 *SarahS93 wrote:*   

> 
> 
> ```
> qemu-system-x86_64: -device pci-assign,host=02:00.0: No IOMMU found.  Unable to assign device "(null)"
> 
> ...

 

Das bedeutet, dass vermutlich deine CPU/Mainboard IOMMU nicht unterstüzt oder deaktiviert ist.

----------

## SarahS93

Wie kann ich das denn genauer herrausfinden?

Laut Gigabyte kann das P67-UD4 Mainboard VT-d und die Intel i7-2600 CPU kann es laut Intel ebenfalls.

Gibt es eine LiveCD mit Qemu das IOMMU können muss damit ich zu 100% ausschliessen kann das es nicht an meinem Kernel oder Einstellungen bei mir liegt?

Danach zu Googeln ist mal echt schwer .. finde nur LiveCDs die man in Qemu starten kann   :Surprised: 

----------

## bbgermany

Hi,

ich bin mir ja nicht ganz sicher, wie Gigabyte das machen will mit VT-d. Aber der P67 Chipsatz von Intel kann es jedenfalls nicht: http://ark.intel.com/products/52810/Intel-BD82P67-PCH

Aber vielleicht hast du mal einen Link von Gigabyte, wo das beschrieben ist. Denn VT-x und VT-d sind zwei unterschiedliche Dinge.

MfG. Stefan

----------

## SarahS93

OK, das ist dann wohl eindeutig. Danke für den sehr nützlichen Link zu der Intel HP.

----------

## Child_of_Sun_24

https://bbs.archlinux.org/viewtopic.php?id=162768

Habe den restlichen Thread von dir nur kurz überflogen, aber versuch es mal mit Vfio statt PCI-Stub (Der obige Link beschreibt das recht gut, in dem Thread selber sind auch Lösungen und Patches für verschiedene Szenarios, auch für Intel Chipsätze/Grafikkarten).

Habe selber damit 2 Radeon HD7770 im CrossfireX verbund in einer VM, allerdings habe ich ein reines AMD System womit ich dir bei Intel nicht helfen kann.

Und die Iommu ist korrekt eingeschaltet bei dir, 

```
[    0.000000] Intel-IOMMU: enabled
```

 bedeutet das sie aktiv ist.

----------

