Wdrażanie PCI-Passthrough z Linux-KVM na Debianie

10

Próbuję użyć PCI-Passthrough, aby podłączyć starą kartę wideo (Radeon 4770) do maszyny wirtualnej. Używam Linux-KVM do uruchamiania moich maszyn wirtualnych na hoście Debian Linux (Wheezy, 3.2.0-4-amd64).

Pytanie

Aby to wyjaśnić, nie jestem pewien, jaka jest właściwa „ścieżka” do implementacji PCI-Passthrough w Linux KVM. Na tym etapie Podejrzewam prawidłowe działanie jest dodać CONFIG_DMAR, CONFIG_DMAR_DEFAULT_ONi CONFIG_PCI_STUBdo „opcji magistrali (PCI itp)” odcinek źródła jądra i ponownej kompilacji.

Ale nie jestem pewien, czy jest to wyczerpująca lista niezbędnych dodatków przed ponowną kompilacją. Lub jeśli konieczna jest ponowna kompilacja jądra - może istnieje łatwiejsza metoda?

Z przewodników, o których wspomniałem, tylko linux-kvm.org wyraźnie wspomina o kompilacji. Linux-KVM jest już zainstalowany i działa jako hypervisor.

Badania

W tym momencie myślę, że mój problem dotyczy mojego jądra. Moim głównym zasobem jest przewodnik na linux-kvm.org ( http://www.linux-kvm.org/page/How_to_assign_devices_with_VT-d_in_KVM ). Znalazłem jednak inne zasoby, które wskazują nieco inne metody (pozornie) specyficzne dla dystrybucji:

Fedora-- https://docs.fedoraproject.org/en-US/Fedora/13/html/Virtualization_Guide/chap-Virtualization-PCI_passthrough.html

SUSE - „openSUSE: wirtualizacja za pomocą KVM” (łącze pominięte z powodu niskiej trafności i limitu 2 łączy)

Przewodnik Fedory działa aż do odwołania, setseboolktóre wydaje się być specyficzne dla RedHat. Przewodnik SUSE wskazuje, że przypisanie karty graficznej nie jest obsługiwane przez SUSE, jednak CONFIG_DMAR_DEFAULT_ONodwołuję się również do niego, ponieważ wskazałem, że powinienem znaleźć ciąg w / boot / config-`uname -r`. Witryna linux-kvm.org również zawiera odniesienia CONFIG_DMAR_DEFAULT_ON, więc wydaje się, że jest to powszechny i ​​konieczny komponent.

Uwaga: Nie znalazłem ograniczeń dla kart graficznych w przewodnikach dla Fedory lub Debiana. Przywoływany dokument SUSE jest datowany na lata 2006–2013.

Nie mogę znaleźć CONFIG_DMAR_DEFAULT_ONw / boot / config-`uname -r` w moim systemie. Dalsze badania sugerują, że CONFIG_DMAR, CONFIG_DMAR_DEFAULT_ONi CONFIG_PCI_STUBsą elementy konfiguracji Linux Kernel, które są istotne z instrukcją na linux-kvm.org . Dlatego uważam, że muszę ponownie skompilować jądro mojego hosta za pomocą tych 3 (przynajmniej) elementów konfiguracji jądra. Uruchamianie intel_iommu=onza pomocą parametru jądra na moim systemie operacyjnym hosta wydaje się niewystarczające.

GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"

Potwierdzenie obsługi VT-d / IOMMU / KVM

Moje badania wskazują, że PCI-Passthrough wymaga zarówno procesora, jak i płyty głównej dla VT-d.

VT-d

Potwierdziłem, że mój procesor, inny niż INTEL i7-3770 (na ark.intel.com/products/65719), obsługuje VT-d:

Technologia wirtualizacji Intel® dla Directed I / O (VT-d) ‡ Tak

Moja płyta główna Asrock Z77 Extreme4 obsługuje również VT-d (na stronie 62 instrukcji obsługi):

VT-d Służy do włączania lub wyłączania technologii Intel ® VT-d (Intel ® Virtualization Technology for Directed I / O). Domyślna wartość tej funkcji to [Wyłączone].

IOMMU

Sprawdziłem, czy mój system obsługuje IOMMU:

dmesg | grep -e DMAR -e IOMMU | grep -e "DRHD base" -e "enabled"
[    0.000000] Intel-IOMMU: enabled

KVM

KVM jest zainstalowany i działa, oprócz obsługi PCI-Passthrough:

lsmod | grep kvm
kvm_intel             121968  0 
kvm                   287749  1 kvm_intel

Upewniłem się, że VT-d jest włączony poprzez BIOS mojej płyty głównej. W związku z tym nie podejrzewam problemów sprzętowych / BIOS, które uniemożliwiałyby korzystanie z VT-d. Niezależnie od tego nie jestem w stanie skutecznie odłączyć mojej karty graficznej od mojego hosta i ponownie przypisać jej do maszyny wirtualnej .

Zamykanie myśli

Na koniec chciałbym wspomnieć, że próbowałem również przetestować:

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
echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/remove_id
kvm -m 512 -boot c -net none -hda debian-7.1.0-amd64-netinst.iso -device pci-assign,host=01:00.0

i wystąpił następujący błąd po próbie utworzenia docelowej maszyny wirtualnej:

Failed to assign device "(null)" : Device or resource busy
*** The driver 'pci-stub' is occupying your device 0000:01:00.0.
***
*** You can try the following commands to free it:
***
*** $ echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/new_id
*** $ echo "0000:01:00.0" > /sys/bus/pci/drivers/pci-stub/unbind
*** $ echo "0000:01:00.0" > /sys/bus/pci/drivers/pci-stub/bind
*** $ echo "8086 10b9" > /sys/bus/pci/drivers/pci-stub/remove_id
***
kvm: -device pci-assign,host=01:00.0: Device 'pci-assign' could not be initialized

Zgaduję, że dzieje się tak, ponieważ host nadal nie zrzeka się kontroli karty graficznej i prawdopodobnie jest to spowodowane tym, że jądro nie zostało skompilowane z odpowiednimi elementami konfiguracji.

To dla mnie nowe terytorium, więc proszę wybaczcie mój brak doświadczenia. Byłbym bardzo wdzięczny za wszelkie opinie, nawet jeśli jest to po prostu potwierdzenie, że jestem na dobrej drodze. Daj mi znać, jeśli dokonałem rażącego przeoczenia lub przesadzam. Mile widziana jest także konstruktywna krytyka mojego pytania. Daj mi znać, jeśli nie dostarczyłem wystarczających informacji, aby „pomóc mi pomóc” (lub jeśli podałem za dużo!). Z przyjemnością pomogę w wyjaśnieniu lub łatwiejszej odpowiedzi na moje pytanie.

Z góry dziękuję,

skorupiak
źródło
Co się dzieje, jeśli nie pozwalasz, aby karta wideo w ogóle podłączała się do hosta (np. Uruchamia się bez dołączania tej karty wideo do hosta. Albo nie zapewniając / nie wyłączając sterownika, ani nie wykorzystując parametru rozruchowego jądra, aby był pomijany podczas uruchamiania) ?
Hennes,

Odpowiedzi:

1

Artykuł wspomniany dla przekazywania PCI, wymagana jest konfiguracja jądra

make menuconfig
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 "*"

optional setting: 
set "Bus options (PCI etc.)" -> "Support for Interrupt Remapping" to "*"

Nie mogłem jednak znaleźć tych opcji w „Opcjach magistrali”, a zamiast tego w „Sterownikach urządzeń -> Obsługa sprzętu IOMMU”.

Po przeczytaniu wspomnianego artykułu nadal miałem problemy z uruchomieniem komputera-gościa i otrzymywałem błędy, których nie można zainicjować „Device 'pci-assign”. Udało mi się go uruchomić, wykonując:

 echo 1 > /sys/module/kvm/parameters/allow_unsafe_assigned_interrupts

Jeśli nadal masz problemy, zapoznaj się z następującym artykułem: http://spica-and-roid.blogspot.com.au/2012/07/howto-kvm-passthrough.html

supermetody
źródło