Включение IOMMU в ядре для сквозной передачи видеокарты


16

Краткий вопрос:

Как включить intel_iommuнастройку в ядре Linux? Я запускаю хост Debian, используя загрузчик grub2. Документация, которую я видел, говорит «редактировать» /boot/grub/menu.lst, что, похоже, относится только к grub 1.x, поскольку у меня нет этого файла.

Насколько я понимаю (и последний вариант, который я могу придумать), изменение этого параметра загрузки может избавить от следующего сообщения об ошибке в /var/log/kern.log

vboxpci: No IOMMU domain (attach)

Длинный вопрос:

Предоставление гостевой ОС прямого доступа к видеокарте

Недавно я понял, что через устройство PCI-Express можно передавать гостевые ОС, работающие в Virtualbox. Круто, подумал я! У меня есть две видеокарты NVIDIA Quadro FX (с подключенным мостом SLI, который, я надеюсь, не вызывает горя), и я хотел бы выделить вторую гостевую видеокарту для гостевой ОС, чтобы я мог использовать функции OpenGL в Photoshop et al.

NVIDIA продает эту конфигурацию « SLI Multi-OS », которую я в основном хотел настроить целую вечность, но я не хочу тратить слишком много на программное обеспечение для виртуализации (экстремальная рабочая станция Parallels), когда я был с удовольствием пользуюсь VirtualBox уже много лет.

Хост-система

Я использую linux-3.5.0-19 из репозиториев Debian, на достаточно высокопроизводительном оборудовании для рабочих станций (суперкомпьютер Asus P6T7 WS mobo с чипсетом Intel ICH10R и процессором Xeon W3680) и хотел бы включить поддержку IOMMU в ядре желательно без компиляции.

BIOS

В настройках BIOS у меня включена поддержка VT-x и VT-d. Я не видел ничего, что конкретно упоминало бы IOMMU.

Подключение устройства PCI

Это было приятно удивительно просто! Официальная документация VirtualBox находится здесь . То, что я сделал, что я нашел менее двусмысленным, было открыть nvidia-settings, выбрать дополнительную видеокарту и записать идентификатор шины («PCI: 5: 0: 0» в моем случае). Затем из командной строки хоста:

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

(Когда я впервые запустил это, произошла ошибка, поскольку VirtualBox эмулировал набор микросхем PIIX; в нем говорилось, что сквозной канал PCI работает только с наборами микросхем ICH9. Поэтому я изменил набор микросхем на ICH9 в настройках системы VirtualBox VM и включил гостевую систему. чтобы установить необходимые новые драйверы. Перезагружаемся позже, и все работает нормально, поэтому я закрыл гостя и повторно выполнил команду.)

Выводов не было, и меня почти сразу же вернули в командную строку.

Использование хоста GPU от гостя

Прежде чем включить гостя, я сначала перезагрузил хост-машину, на случай, если что-то недокументированное должно было произойти в ядре, с помощью virtualbox-dkms. Поскольку я sudoвыполнил предыдущую команду без привилегий, я сомневаюсь, что какие-либо изменения были сделаны.

Когда я в следующий раз запустил гостя, Центр обновления Windows начал делать свое дело и автоматически обнаружил и установил правильные драйверы NVIDIA. Пока все выглядит хорошо. Прежде чем я смог использовать устройство, мне пришлось перезагрузить гостя ...

проблема

Теперь, когда драйверы видеокарты установлены на гостевой системе и подключено устройство PCI, я не могу попасть на рабочий стол Windows. Я попадаю на экран входа в Windows, затем после входа в систему экран зависает, просто говоря: «Добро пожаловать», рядом с ним стоит кружащийся, но не синий кружок.

В /var/log/kern.log, последние сообщения отпечатанные являются: -

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)

Есть идеи, как это исправить?

ОБНОВИТЬ:

Теперь у меня есть загрузка ядра intel_iommu=on, но все еще не работает полностью. После перезагрузки хоста, гость запускается, входит в систему, и все выглядит так, как было до запуска чего-либо из этого. Моя вторая видеокарта ничего не выводит.

В диспетчере устройств рядом с устройством Quadro FX стоит восклицательный знак, а в свойствах устройства указан код ошибки 12 с сообщением «Это устройство не может найти достаточно свободных ресурсов». Дальнейшее описание на technet.microsoft.com .

В журнале ядра хоста это выглядит многообещающе:

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

Если я запускаю гостевую ОС второй раз, не перезагружая хост, дисплей снова зависает на этапе «Добро пожаловать». Это определенно завершает этап входа в систему, так как я мог бы использовать ярлыки Windows для выключения машины без принудительного выключения ..

Теперь у меня нет идей ... Есть предложения, чтобы это заработало? Любую дополнительную информацию, которую я могу предоставить?

UPDATE2:

dmesg содержит еще несколько интересных ошибок, но я не знаю, что я могу с ними сделать:

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!

1
Параметр IOMMU должен быть активен по умолчанию в стабильной версии Debian, если оборудование поддерживает это. Так как это вызывало проблемы и массу ошибок в журнале, мне пришлось его деактивировать intel_iommu=soft. Вы можете попробовать пройти intel_iommu=on.
Марко

1
Круто, только что нашел файл и строку, где это можно изменить; Модуль KDE grub-config вставлен CONFIG_CMDLINE_LINUX=intel_iommu=onв /etc/default/grub. Теперь гость загружается, но не обнаруживает видеокарту ...
Алекс Лич

intel_iommu=softкажется, не является допустимым вариантом ядра, и когда я использовал его, он вернулся к intel_iommu=on.. С www.kernel.org , вы можете иметь iommu=soft, но я не могу найти документацию для этого .. Вы знаете, что это делает?
Алекс Лич

3
Ты прав, это так iommu=soft. Он деактивирует аппаратный IOMMU (который вызывает многочисленные ошибки DMA в моей системе) и использует вместо этого программный IOMMU. Вот ссылка на старую ветку
Marco

Благодарю. Я мог бы сделать это при следующей перезагрузке. Я думаю, что все мое оборудование поддерживает IOMMU, поэтому не уверен, что эмуляция программного обеспечения будет хорошей идеей. С другой стороны, не уверен, что у моего GPU есть модуль DMAR, и было бы неплохо использовать его intel_iommu=igfx_off...
Alex Leach

Ответы:


2

Я использовал VGA для работы с NVIDIA GTX 760, используя KVM в качестве гипервизора с vfio-vga; Я никогда не пробовал это с Virtualbox. Это было больно, но хорошо работает после получения правильной конфигурации. KVM так же удобен, как Virtualbox для быстрых виртуальных машин с вашего рабочего стола, и вы можете рассмотреть его в качестве другого варианта.

Этот поток содержит массу информации о множестве различных конфигураций и этапах устранения неполадок, и он был действительно полезен: https://bbs.archlinux.org/viewtopic.php?id=162768


1
CUDA работает?
Александр Дубинский

Этот блог теперь утверждает, что он устарел и рекомендует vfio.blogspot.com
Александр Дубинский

Что ж, настройка эффективного KVM + qemu с нуля может быть не такой быстрой.
Ситилдж

@AleksandrDubinsky, В настоящее время для работы CUDA необходимо использовать специальное ядро ​​Linux: superuser.com/a/1392031/109803
Gabriel Fair,

0

Если ваш драйвер Nvidia сообщает, что не может найти достаточно свободных ресурсов, попробуйте отключить эмулированный «Стандартный VGA-адаптер» в диспетчере устройств. Перезагрузите гостя, и вы можете обнаружить следующее:

1) Ваша виртуальная машина POST / boot происходит на эмулируемом адаптере VGA. 2) Эмулируемый адаптер VGA гаснет как раз перед тем, как он попадает на экран входа в систему 3) Драйвер Nvidia загружает и вызывает промежуточный графический процессор, и вы получаете экран входа в систему на карте Nvidia.

Если повезет, вы можете обнаружить, что с этого момента все работает хорошо. Это более или менее точно, что происходит на моей аналогичной установке с Xen. Пожалуйста, сообщите результаты. :)


0

Похоже, у вас есть две отдельные проблемы. Получение перезагрузки для работы с VGA pass может быть настоящим медведем. В Xen устройство VGA часто отображается как съемное устройство, и некоторым людям повезло, что они «извлекли» устройство перед перезагрузкой.

Ошибка кода 12, вероятно, может быть исправлена ​​простым отключением виртуального видеоустройства в диспетчере устройств Windows.


0

Попробуйте установить один из них в /etc/grub:

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

Я установил новую 64-битную систему AMD и обнаружил, что у Linux проблемы с настройками Nvidia и DMA, вызванные настройками iommu в BIOS, поэтому установка их в grub устранила это для меня.

Прочитайте это для более подробной информации .


-1

протестировано на HP dc7900, чтобы увидеть сообщение "IOMMU found":

деактивировать интегрированное видео

iommu=calgary intel_iommu=on intel_iommu=igfx_off
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.