У меня есть процессор AMD A4-5300 с материнской платой, которая поддерживает IOMMU, и я пытаюсь включить IOMMU на моем ядре Gentoo Hardened 4.3.3-r4 с намерением использовать графическую карту на виртуальной машине KVM. Согласноэто руководство здесь, я должен перекомпилировать свое ядро с несколькими предоставленными параметрами («Поддержка устройств перераспределения DMA», «Включить устройства перераспределения DMA» и «Драйвер PCI Stub»). Однако «Поддержка устройств перераспределения DMA» и «Включить устройства перераспределения DMA» отсутствуют в моей конфигурации ядра.
Затем я поискал в конфигурации "remap" и попытался включить несколько опций, среди которых были CONFIG_IRQ_REMAP, CONFIG_DMAR_TABLE, CONFIG_IOMMU_SUPPORT, CONFIG_SWIOTLB и CONFIG_PCI_IOV. Затем я перекомпилировал свое ядро с этими включенными опциями, запустил свою систему с помощью amd_iommu=fullflush iommu=force
командной строки ядра и, согласно вышеупомянутому руководству, проверил, запущен ли IOMMU в моей системе, посмотрев на "AMD-Vi" в сообщениях ядра:
dmesg | grep AMD-Vi
В моем журнале ядра ничего не отображается об AMD-Vi.
Кроме того, когда я пытаюсь запустить виртуальную машину на virt-manager с подключенным устройством PCI, я получаю сообщение следующего содержания:«Ошибка запуска домена: неподдерживаемая конфигурация: хост не поддерживает сквозную передачу устройств PCI хоста».
Почти все, что я нахожу, относится к Fedora, Ubuntu и Debian, где IOMMU, по-видимому, работает «из коробки». Я не думаю, что это связано с тем, что моя материнская плата и процессор не поддерживают его, потому что в моем BIOS есть опция для этого, и потому что я помню, что несколько лет назад я мог запустить виртуальную машину VirtualBox с IOMMU на Debian (хотя я не стал это проверять, потому что в тот момент я никогда не думал, что мне потребуются две графические карты для использования GPU на виртуальной машине через IOMMU).
Вот что я уже пробовал, но не сработало:
- Использование стандартного ядра вместо усиленного.
- ВключениеДрайверы устройств >> Поддержка оборудования IOMMU,Поддержка AMD IOMMU,Поддержка Intel IOMMU с использованием устройств перераспределения DMA,Поддержка переназначения прерыванийиПараметры шины (PCI и т.д.) >> PCI Stub.
- Используется новейшее ядро, на данный момент обновленное до 4.4.8-hardened-r1.
Это командная строка, которую я использую для запуска ядра, причем каждый параметр для удобства находится на отдельной строке:
root=/dev/ram0
crypt_root=/dev/disk/by-uuid/c1ce6456-4c6a-4a64-8027-5ec4fdc0f344
dolvm
real_root=/dev/mapper/cryptgentoo-raiz
rootfstype=jfs
real_init=/sbin/init
root_keydev=/dev/disk/by-partuuid/086194de-e476-4abb-82da-9744e6fb0257
root_key=luks-key.gpg
keymap=la
amd_iommu=on
iommu=on
Мне все еще не хватает опции конфигурации ядра?
Обновлять:По рассеянности я по ошибке выдал ps -ef | grep -i iommu
, и посмотрите, что я только что нашел...
rockshooter ~ # ps -ef | grep iommu
root 66 2 0 02:57 ? 00:00:00 [amd_iommu_v2]
Если я вижу поток ядра, я думаю, что есть шанс, что я смогу запустить IOMMU, просто мое ядро ничего об этом не говорит. Это просто дикая догадка... но я собираюсь пойти и попробовать использовать его.
решение1
Основные параметры IOMMU
Пытаться Device Drivers >> IOMMU Hardware Support
:
AMD IOMMU
Затем включите AMD IOMMU support
.
Перераспределение DMA
Давать возможностьSupport for Intel IOMMU using DMA Remapping Devices
Дополнительно: переназначение IRQ
Давать возможностьSupport for Interrupt Remapping
Необязательно: включить поддержку версии 2
AMD IOMMU Version 2 driver
PCI-опция
Bus options (PCI etc.) >> PCI Stub
Никогда не используйте grep
файл конфигурации, всегда используйте menuconfig
и /
ключ для поиска необходимых опций. В руководстве, на которое вы ссылаетесь, есть три проблемы:
- Он предназначен для пользователей Fedora/Redhat.
- Из-за пункта 1 версия ядра другая, поэтому параметры находятся в другом месте.
- Ядро Gentoo новее ядра, используемого в руководстве.
Обновлять
Моя материнская плата слишком старая для поддержки PCI Passthrough, но я хотел бы, чтобы вы увидели, что теперь все параметры включены правильно. Используйте именно те параметры, которые я вам указал:
Основные параметры IOMMU
AGP: Checking aperture...
[ 0.000000] AGP: No AGP bridge found
[ 0.000000] AGP: Node 0: aperture [bus addr 0xc4000000-0xc5ffffff] (32MB)
[ 0.000000] Aperture pointing to e820 RAM. Ignoring.
[ 0.000000] AGP: Your BIOS doesn't leave an aperture memory hole
[ 0.000000] AGP: Please enable the IOMMU option in the BIOS setup
[ 0.000000] AGP: This costs you 64MB of RAM
[ 0.000000] AGP: Mapping aperture over RAM [mem 0xc4000000-0xc7ffffff] (65536KB)
...
[ 0.959270] PCI-DMA: Disabling AGP.
[ 0.959337] PCI-DMA: aperture base @ c4000000 size 65536 KB
[ 0.959338] PCI-DMA: using GART IOMMU.
[ 0.959340] PCI-DMA: Reserving 64MB of IOMMU area in the AGP aperture
...
[ 1.375277] AMD IOMMUv2 driver by Joerg Roedel <[email protected]>
[ 1.375277] AMD IOMMUv2 functionality not available on this system
решение2
Наконец, после долгих причитаний, жалоб и размышлений, я, наконец, понял, что происходит.
Как выясняется из,IOMMU работал все это время, просто логи ядра этого не показывали.Но драйвер IOMMU был там, он работал, и по счастливой случайности я об этом узнал, когда по ошибке набрал ps -ef
вместо dmesg
этого:
rockshooter ~ # ps -ef | grep -i iommu
root 66 2 0 04:19 ? 00:00:00 [amd_iommu_v2]
Когда я увидел, что поток ядра работает, я подумал, может, мой IOMMU действительно работает? Поэтому я выполнил те же шаги по настройке, которые я делал ранее для Debian, и через час, о чудо, я был на своей виртуальной машине, подключенной к моей видеокарте, и играл в какие-то игры.
Пожалуйста, сохраните эту ветку для дальнейшего использования, потому что мне потребовалось около 3 недель, чтобы разобраться с этим. Я все равно дал другому автору вполне заслуженные +50 репутации за то, что он потрудился с настройкой и тестированием этой проблемы.