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_ON
i CONFIG_PCI_STUB
do „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:
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, setsebool
które wydaje się być specyficzne dla RedHat. Przewodnik SUSE wskazuje, że przypisanie karty graficznej nie jest obsługiwane przez SUSE, jednak CONFIG_DMAR_DEFAULT_ON
odwoł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_ON
w / boot / config-`uname -r` w moim systemie. Dalsze badania sugerują, że CONFIG_DMAR
, CONFIG_DMAR_DEFAULT_ON
i CONFIG_PCI_STUB
są 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=on
za 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ę,