Włączanie IOMMU w jądrze dla przejścia karty graficznej

16

Krótkie pytanie:

Jak mogę włączyć intel_iommuustawienie w jądrze Linuksa? Prowadzę host Debiana, używając bootloadera grub2. Dokumentacja, którą widziałem, mówi do edycji /boot/grub/menu.lst, która wydaje się być odpowiednia tylko dla grub 1.x, ponieważ nie mam tego pliku.

Rozumiem (i ostatnia opcja, o której myślę), że zmiana tej opcji rozruchu może pozbyć się następującego komunikatu o błędzie /var/log/kern.log

vboxpci: No IOMMU domain (attach)

Długie pytanie:

Zapewnienie systemowi-gościowi bezpośredniego dostępu do karty graficznej

Niedawno zdałem sobie sprawę, że możliwe jest przejście przez urządzenie PCI-express do systemu-gościa działającego w Virtualbox. Fajnie, pomyślałem! Mam dwie karty graficzne NVIDIA Quadro FX (z połączeniem mostka SLI, które, mam nadzieję, nie powoduje problemów) i chciałbym poświęcić drugą kartę graficzną systemowi-gościowi, aby móc korzystać z funkcji OpenGL w Photoshop i in.

NVIDIA sprzedaje tę konfigurację „ SLI Multi-OS ”, którą zasadniczo chciałem skonfigurować od wieków, ale nie chcę wydawać więcej na oprogramowanie do wirtualizacji (ekstremalna stacja robocza Parallels), kiedy byłem od lat korzystam z VirtualBox.

System hosta

Korzystam z linux-3.5.0-19 z repozytoriów Debiana na dość wysokiej klasy sprzęcie roboczym (Asus P6T7 WS Superkomputer mobo z chipsetem Intel ICH10R i procesorem Xeon W3680) i chciałbym włączyć obsługę IOMMU w jądrze , najlepiej bez konieczności samodzielnego kompilowania.

BIOS

W ustawieniach BIOS mam włączoną obsługę VT-x i VT-d. Nie widziałem jednak nic, co wspominałoby o IOMMU.

Podłączanie urządzenia PCI

To było przyjemnie zaskakująco proste! Oficjalna dokumentacja VirtualBox jest tutaj . To, co zrobiłem, co uważałem za mniej dwuznaczne, to otworzyć nvidia-settings, wybrać dodatkową kartę graficzną i zanotować identyfikator magistrali (w moim przypadku „PCI: 5: 0: 0”). Następnie z wiersza poleceń hosta: -

VBoxManage modifyvm "Windows Guest" --pciattach 05:00.0

(Kiedy po raz pierwszy to uruchomiłem, wystąpił błąd, ponieważ VirtualBox emulował mikroukład PIIX; powiedział, że tranzyt PCI działa tylko z mikroukładami ICH9. Więc zmieniłem Chipset na ICH9 w ustawieniach systemu wirtualnego VirtualBox i włączyłem gościa aby zainstalować niezbędne nowe sterowniki. Uruchom ponownie później i wszystko działało dobrze, więc zamknąłem gościa i ponownie uruchomiłem polecenie).

Nie było danych wyjściowych i prawie natychmiast wróciłem do wiersza poleceń.

Korzystanie z hosta GPU od gościa

Przed włączeniem gościa ponownie uruchomiłem maszynę hosta, na wypadek, gdyby coś nieudokumentowanego musiało się wydarzyć w jądrze przez virtualbox-dkms. Ponieważ uruchomiłem poprzednią komendę bez sudouprawnień, wątpię, aby jakiekolwiek zmiany zostały wprowadzone.

Kiedy następnym razem uruchomiłem gościa, Windows Update zaczął działać i automatycznie wykrył i zainstalował prawidłowe sterowniki NVIDIA. Jak dotąd wszystko wygląda dobrze. Zanim jednak mogłem korzystać z urządzenia, musiałem ponownie uruchomić gościa ...

Problem

Teraz, gdy sterowniki karty graficznej są zainstalowane na gościu i podłączonym urządzeniu PCI, nie mogę dostać się na pulpit systemu Windows. Przechodzę do ekranu logowania do systemu Windows, a następnie po zalogowaniu ekran zawiesza się, mówiąc tylko „Witaj”, a obok niego powinno kręcić się, ale nie ma niebieskiego koła.

W /var/log/kern.logostatnich drukowanych wiadomościach są: -

vboxpci: vboxPciOsDevInit: dev=500
vboxpci: detected device: 10de:05ff at 05:00.0, driver pci-stub
vboxpci: vboxPciOsDevInit: dev=500 pdev=ffff88061bea0000
pci-stub 0000:05:00.0: irq 76 for MSI/MSI-X
vboxpci: enabled MSI
500: linux vboxPciOsDevGetRegionInfo: reg=0
got mmio region: fa000000:16777216
500: linux vboxPciOsDevGetRegionInfo: reg=1
got mmio region: d0000000:268435456
500: linux vboxPciOsDevGetRegionInfo: reg=3
got mmio region: f8000000:33554432
500: linux vboxPciOsDevGetRegionInfo: reg=5
got pio region: 8c00:128
500: linux vboxPciOsDevGetRegionInfo: reg=6
got mmio region: fb980000:524288
got PCI IRQ: 76
device eth0 entered promiscuous mode
power state: 0
vboxpci: No IOMMU domain (attach)

Jakiś pomysł jak to naprawić?

AKTUALIZACJA:

Mam teraz jądro do rozruchu intel_iommu=on, ale rzeczy nadal nie działają w pełni .. Po ponownym uruchomieniu hosta gość uruchamia się, loguje się i wszystko wygląda tak, jak było przed uruchomieniem tego. Moja druga karta graficzna niczego nie wyświetla.

W Menedżerze urządzeń obok urządzenia Quadro FX znajduje się wykrzyknik, a we właściwościach urządzenia znajduje się kod błędu 12, z komunikatem „To urządzenie nie może znaleźć wystarczającej ilości wolnych zasobów”. Dalszy opis na technet.microsoft.com .

W dzienniku jądra hosta wygląda obiecująco: -

vboxpci: detected device: 10de:05ff at 05:00.0, driver pci-stub
vboxpci: vboxPciOsDevInit: dev=500 pdev=ffff88061baa0000
pci-stub 0000:05:00.0: irq 76 for MSI/MSI-X
vboxpci: enabled MSI
500: linux vboxPciOsDevGetRegionInfo: reg=0
got mmio region: fa000000:16777216
500: linux vboxPciOsDevGetRegionInfo: reg=1
got mmio region: d0000000:268435456
500: linux vboxPciOsDevGetRegionInfo: reg=3
got mmio region: f8000000:33554432
500: linux vboxPciOsDevGetRegionInfo: reg=5
got pio region: 8c00:128
500: linux vboxPciOsDevGetRegionInfo: reg=6
got mmio region: fb980000:524288
got PCI IRQ: 76
created IOMMU domain ffff88058377c9a0
device eth0 entered promiscuous mode
power state: 0
vboxpci: iommu_attach_device() success

Jeśli uruchomię system operacyjny gościa po raz drugi, bez ponownego uruchamiania hosta, ekran ponownie zawiesi się na etapie „Witamy”. Zdecydowanie kończy to jednak etap logowania, ponieważ mogłem użyć skrótów systemu Windows do zamknięcia komputera bez wymuszania zamknięcia.

Teraz mam trochę pomysłów ... Jakieś sugestie, żeby to zadziałało? Czy mogę podać więcej informacji?

AKTUALIZACJA 2:

dmesg zawiera kilka interesujących błędów, ale nie wiem, co mogę z nimi zrobić:

IOMMU 0 0xfbfff000: using Queued invalidation
IOMMU 1 0xfbffe000: using Queued invalidation
------------[ cut here ]------------
WARNING: at /build/buildd/linux-3.5.0/drivers/iommu/intel-iommu.c:4254 init_dmars+0x39b/0x74f()
Hardware name: System Product Name

Your BIOS is broken; DMA routed to ISOCH DMAR unit but no TLB space.

BIOS vendor: American Megatrends Inc.; Ver: 0811   ; Product Version: System Version
...
Your BIOS is broken; RMRR ends before it starts!
Alex Leach
źródło
1
Ustawienie IOMMU powinno być domyślnie aktywne w stabilnej wersji Debiana, jeśli sprzęt je obsługuje. Ponieważ powodowało to kłopoty i mnóstwo błędów w dzienniku, musiałem go dezaktywować intel_iommu=soft. Możesz spróbować przejść intel_iommu=on.
Marco,
1
Fajnie, właśnie znalazłem plik i wiersz, w którym to zmienić; Moduł grub-config KDE umieścić CONFIG_CMDLINE_LINUX=intel_iommu=onw do /etc/default/grub. Teraz gość uruchamia się, ale nie wykrywa karty graficznej ...
Alex Leach
intel_iommu=softnie wydaje się być prawidłową opcją jądra, a kiedy jej użyłem, powróciłem do intel_iommu=on... Z www.kernel.org możesz mieć iommu=soft, ale nie mogę znaleźć żadnej dokumentacji na ten temat. Czy wiesz co to robi?
Alex Leach
3
Masz rację iommu=soft. Dezaktywuje sprzętową IOMMU (która powoduje wiele błędów DMA w moim systemie) i zamiast tego używa oprogramowania IOMMU. Oto link do starego wątku: Sugestia użycia iommu = soft dla wszystkich pakietów jądra
Marco
Dzięki. Mogę dać temu szansę przy następnym uruchomieniu. Myślę, że cały mój sprzęt obsługuje IOMMU, więc nie jestem pewien, czy emulacja oprogramowania byłaby dobrym pomysłem. W powiązanej notatce nie jestem pewien, czy mój procesor GPU ma jednostkę DMAR i czy dobrym pomysłem byłoby użyć intel_iommu=igfx_off...
Alex Leach,

Odpowiedzi:

2

Dostałem transmisję VGA podczas pracy z NVIDIA GTX 760 przy użyciu KVM jako hiperwizora z vfio-vga; Nigdy nie próbowałem tego z Virtualbox. To był problem, ale działa dobrze po prawidłowej konfiguracji. KVM jest tak samo wygodny jak Virtualbox dla szybkich maszyn wirtualnych z komputera i możesz uznać to za inną opcję.

Ten wątek zawiera mnóstwo informacji na temat wielu różnych konfiguracji i kroków rozwiązywania problemów i był bardzo pomocny: https://bbs.archlinux.org/viewtopic.php?id=162768

Josh
źródło
1
Czy CUDA działa?
Aleksandr Dubinsky,
Ten blog teraz twierdzi, że jest przestarzały i poleca vfio.blogspot.com
Aleksandr Dubinsky
Cóż, skonfigurowanie wydajnego KVM + qemu od zimnego podłoża może nie być tak szybkie.
sitilge
@AleksandrDubinsky, Obecnie, aby CUDA działała, należy użyć konkretnego jądra Linuksa: superuser.com/a/1392031/109803
Gabriel Fair
0

Jeśli sterownik Nvidii twierdzi, że nie mógł znaleźć wystarczającej ilości wolnych zasobów, spróbuj wyłączyć emulowany „Standardowy adapter VGA” w Menedżerze urządzeń. Uruchom ponownie gościa, a może się zdarzyć, że:

1) VM POST / boot ma miejsce na emulowanym adapterze VGA. 2) Emulowany adapter VGA gaśnie tuż przed przejściem do ekranu logowania 3) Sterownik Nvidia ładuje się i wyświetla kartę graficzną przejścia, a ekran logowania jest wyświetlany na karcie Nvidia.

Przy odrobinie szczęścia może się okazać, że odtąd wszystko działa dobrze. To mniej więcej dokładnie dzieje się w mojej podobnej konfiguracji z Xen. Proszę, zgłoś wyniki. :)

użytkownik1842677
źródło
0

Wygląda na to, że masz dwa oddzielne problemy. Ponowne uruchomienie komputera w celu przejścia przez VGA może być prawdziwym niedźwiedziem. W Xen urządzenie VGA często pojawia się jako urządzenie wymienne, a niektórym ludziom lepiej było „wysunąć” urządzenie przed ponownym uruchomieniem.

Błąd kodu 12 można prawdopodobnie naprawić, po prostu wyłączając wirtualne urządzenie wideo w menedżerze urządzeń Windows.

StrongBad
źródło
0

Spróbuj ustawić jeden z nich w /etc/grub:

  • iommu=memmaper
  • iommu=soft
  • vga=normal
  • vesa=0

Mam nowy 64-bitowy system AMD i stwierdziłem, że Linux ma problemy z ustawieniami Nvidii i DMA spowodowanymi ustawieniami iommu w BIOS-ie, więc ustawienie ich w grub naprawiło to dla mnie.

Przeczytaj to, aby uzyskać więcej szczegółów .

Steve LinuxBlue
źródło
-1

przetestowano na HP dc7900, aby zobaczyć komunikat „Znaleziono IOMMU”:

dezaktywuj zintegrowane wideo

iommu=calgary intel_iommu=on intel_iommu=igfx_off
backtolinux
źródło