Ошибка vfio-pci: unable to map BAR при попытке запуска виртуальной машины с назначенным PCIe-аппаратом часто свидетельствует о некорректной настройке IOMMU на уровне ядра Linux или отсутствии изоляции групп устройств в BIOS. Если вы видите, что гостевая ОС не видит графический адаптер или устройство определяется как NVIDIA без драйверов, необходимо пересмотреть конфигурацию host и параметры запуска guest. Проброс видеокарты в Proxmox требует не только настройки гипервизора, но и правильной подготовки аппаратной части, иначе система будет работать с нестабильностью.
Подготовка аппаратного обеспечения и BIOS
Первым критическим этапом является проверка поддержки технологии IOMMU (Input-Output Memory Management Unit) вашим процессором и материнской платой. Для процессоров Intel эта функция называется VT-d, а для AMD — IOMMU или AMD-Vi. Без активации этих опций в BIOS/UEFI изоляция устройств невозможна, и виртуализация видеокарты не сработает.
Зайдите в настройки BIOS и убедитесь, что VT-d или IOMMU включены. Также крайне важно отключить CSM (Compatibility Support Module) и переключить загрузочный режим на UEFI, так как legacy-режим часто конфликтует с современными механизмами передачи ресурсов. Если у вас гибридная система с интегрированной графикой, убедитесь, что она не блокирует выделение дискретной карты.
⚠️ Внимание: Отключение CSM может сделать невозможной загрузку текущей ОС, если она установлена в режиме Legacy. Создайте резервную копию данных перед внесением изменений в BIOS.
Не забудьте также проверить, что ваш чипсет и материнская плата поддерживают PCIe Passthrough. Некоторые бюджетные модели могут иметь ограничения на количество активных линий PCIe или не поддерживать переадресацию прерываний. Убедитесь, что видеокарта установлена в слот, который не делит линии памяти с другими критичными устройствами.
Активация IOMMU в ядре Proxmox
После настройки BIOS необходимо настроить параметры загрузки ядра на хосте Proxmox. Откройте терминал и отредактируйте файл /etc/default/grub. В строку GRUB_CMDLINE_LINUX_DEFAULT нужно добавить специфические параметры в зависимости от производителя вашего процессора.
Для процессоров Intel добавьте параметр intel_iommu=on, а для AMD — amd_iommu=on. Также рекомендуется добавить pcie_acs_override=downstream,multifunction, если вы используете нестандартную конфигурацию чипсета или материнской платы, чтобы форсировать изоляцию устройств. Пример итоговой строки для Intel может выглядеть так: GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on pcie_acs_override=downstream".
После внесения изменений выполните команду update-grub для применения новых настроек загрузчика. Перезагрузите сервер, чтобы изменения вступили в силу. Если вы пропустите этот шаг, виртуальная машина просто не сможет захватить ресурсы GPU, так как гипервизор не будет обладать необходимой информацией о памяти.
Как проверить работу IOMMU после перезагрузки? Введите команду `dmesg | grep -i iommu`. Если вы видите сообщения о инициализации IOMMU групп, значит, конфигурация ядра успешна.-->
Проверка и идентификация групп IOMMU
Следующий шаг — определение групп IOMMU, к которым относится ваша видеокарта. Это критически важно, так как устройство должно находиться в отдельной группе от других периферийных устройств, иначе вы не сможете выделить его виртуальной машине без изоляции всего сегмента шины. Введите команду ls /sys/kernel/iommu_groups//devices/ в терминале.
Вывод команды покажет структуру групп. Вам нужно найти PCI-адрес вашей видеокарты (обычно можно узнать через lspci -nn). Если видеокарта находится в группе вместе с другими устройствами, например, с аудио-контроллером NVIDIA (HDA Controller), это может создать проблемы. В некоторых случаях необходимо заблокировать эти устройства на уровне хоста, чтобы они не конфликтовали.
Для блокировки нежелательных устройств на хосте используется скрипт vfio-pci. Вам нужно добавить ids=10de
ls /sys/kernel/iommu_groups//devices/ в терминале.lspci -nn). Если видеокарта находится в группе вместе с другими устройствами, например, с аудио-контроллером NVIDIA (HDA Controller), это может создать проблемы. В некоторых случаях необходимо заблокировать эти устройства на уровне хоста, чтобы они не конфликтовали.vfio-pci. Вам нужно добавить ids=10dexxxx,10de:yyyy в модуль конфигурации, где xxxx и yyyy — это ID видеокарты и аудио-контроллера. Это заставит ядро Proxmox не загружать стандартные драйверы для этих устройств, передавая их управление виртуальной машине.
☑️ Проверка групп IOMMU
Настройка виртуальной машины
Теперь, когда хост готов, можно приступать к настройке виртуальной машины. В веб-интерфейсе Proxmox выберите вашу VM и перейдите в раздел Hardware. Нажмите кнопку Add и выберите PCI Device. В открывшемся окне выберите вашу видеокарту из списка.
Обязательно отметьте галочку All Functions, если ваша видеокарта имеет несколько функций (например, графический процессор и звуковой чип), чтобы захватить все необходимые компоненты. Также включите опцию Primary GPU, если планируете использовать эту карту для вывода изображения, хотя в режиме Headless это может потребовать дополнительных настроек. Не забудьте выбрать режим VFIO для отображения карты.
В разделе Options убедитесь, что Machine установлен в i440fx или q35 (рекомендуется q35 для лучшей поддержки современных PCIe устройств). В разделе BIOS обязательно выберите OVMF (UEFI), так как пропуск этого этапа часто приводит к ошибкам инициализации GPU внутри гостевой ОС. Без UEFI карта может просто не инициализироваться.
Ключевые настройки BIOS и драйверов гостевой ОС
После запуска виртуальной машины с проброшенной картой, внутри гостевой ОС (например, Windows 10/11) устройство может определяться с ошибкой или как неизвестное устройство. Это нормально, так как драйверы VFIO на хосте перехватили управление, но внутри гостя нужно установить родные драйверы.
Установите драйверы прямо с сайта производителя NVIDIA или AMD. Если используется карта NVIDIA, для обхода проверки виртуализации (ERROR 43) может потребоваться применение патча nvlddmkm.sys или использование скриптов для скрытия признаков виртуализации. В Linux-гостях установка драйверов обычно проходит штатно.
| Элемент | Рекомендуемое значение | Назначение |
|---|---|---|
| Machine | i440fx / q35 | Тип эмулируемой материнской платы |
| BIOS | OVMF (UEFI) | Необходим для PCIe Passthrough |
| Видео | None / VirtIO | Отключение встроенной видеокарты VM |
| Bus/Slot | 0:0 | Рекомендуемое расположение устройства |
Если вы используете AMD карту, проверьте настройки ROM BAR. Иногда включение опции ROM BAR в настройках устройства в Proxmox помогает решить проблемы с инициализацией. Также обратите внимание, что для корректной работы звука через карту необходимо пробросить и аудио-контроллер, который обычно привязан к той же группе PCI.
⚠️ Внимание: После проброса видеокарты она перестанет работать на хосте Proxmox. Не перезагружайте сервер, если у вас нет доступа через консоль или удаленный терминал, так как вы можете потерять изображение.
Для корректной работы звука в Windows часто требуется пробросить не только видеокарту, но и связанный с ней PCI audio device. В настройках PCI Device выберите и аудио-контроллер, чтобы получить полноценный звук через HDMI/DisplayPort.
Устранение распространенных ошибок
Одной из самых частых проблем является ошибка ERROR 43 в диспетчере устройств Windows. Это означает, что драйвер NVIDIA обнаружил, что работает в виртуальной среде, и отказался работать. Для решения этой проблемы необходимо изменить MSR (Model Specific Register) в ядре Proxmox или использовать скрипты для маскировки.
Другая частая ошибка — черный экран при загрузке. Это может быть связано с тем, что GPU не получает достаточного питания или не инициализируется из-за отсутствия UEFI прошивки. Убедитесь, что в настройках VM выбран режим OVMF, а видеокарта подключена как Primary GPU.
Также проверьте, не блокируется ли устройство другими процессами. Команда lspci -k покажет, какой драйвер использует устройство на данный момент. Если драйвер vfio-pci не загружен, проверьте файл /etc/modules и убедитесь, что он содержится в списке.
⚠️ Внимание: Если вы используете встроенную графику для вывода изображения в консоль Proxmox, убедитесь, что дискретная карта не отключает встроенную при загрузке. Это может привести к потере доступа к интерфейсу.
Частые вопросы (FAQ)
Можно ли пробросить одну видеокарту для двух виртуальных машин?
Нет, одна физическая видеокарта не может быть одновременно захвачена двумя виртуальными машинами в режиме VFIO. Однако можно использовать технологию VGPU (например, через NVIDIA GRID), но это требует лицензирования и специфического оборудования.
Почему после проброса видеокарты пропадает звук?
Звук от видеокарт передается через отдельный аудио-контроллер (HDA), который является частью того же физического устройства. Вам необходимо пробросить и этот PCI audio device в ту же виртуальную машину.
Нужно ли выключать компьютер перед пробросом видеокарты?
Нет, проброс осуществляется на уровне гипервизора. Однако для смены настроек BIOS или обновлений ядра перезагрузка хоста Proxmox обязательна. Сама виртуальная машина может быть запущена "на лету" после настройки.
Работает ли проброс видеокарты на процессорах без IOMMU?
Без поддержки IOMMU (VT-d у Intel или AMD-Vi у AMD) полноценный проброс невозможен. Можно использовать эмуляцию через QEMU, но производительность в играх и рендеринге будет крайне низкой.
Какая версия Proxmox лучше всего подходит для GPU Passthrough?
Рекомендуется использовать последнюю стабильную версию Proxmox VE, так как она содержит актуальные ядра и исправления для работы с IOMMU и драйверами vfio. Версии старше 7.0 могут иметь проблемы с новыми картами.