Когда виртуальная машина в Proxmox VE упирается в ограничения виртуального моста — например, нужен прямой доступ к 10-гигабитной сетевой карте или аппаратная обработка трафика на роутере внутри ВМ — стандартный virtio-интерфейс перестаёт быть решением. Признаком того, что пора задуматься о пробросе, обычно служит высокая загрузка CPU хоста при сетевой активности гостя или требование гостевой ОС видеть «родное» железо, например для работы SR-IOV или специфических драйверов.
Проброс сетевой карты (PCI passthrough) передаёт физическое устройство под полный контроль виртуальной машины через механизм IOMMU. Хост при этом теряет доступ к адаптеру — он становится виден только внутри гостя. Ниже разберём подготовку хоста, настройку vfio, добавление устройства в ВМ и типичные ошибки.
Проверка поддержки IOMMU и подготовка хоста
Первое действие — убедиться, что процессор и материнская плата поддерживают технологию виртуализации ввода-вывода: VT-d у Intel или AMD-Vi у AMD. В BIOS/UEFI соответствующая опция должна быть включена; её название и расположение зависят от производителя платы, поэтому при сомнениях сверьтесь с документацией именно вашей модели.
Далее нужно активировать IOMMU на уровне загрузчика. Для систем на GRUB откройте файл /etc/default/grub и добавьте в строку GRUB_CMDLINE_LINUX_DEFAULT параметр intel_iommu=on для Intel или amd_iommu=on для AMD. Если хост загружается через systemd-boot (типично для ZFS-установок), параметры ядра редактируются через /etc/kernel/cmdline.
# Для GRUB после правки файла:
update-grub
Для systemd-boot:
proxmox-boot-tool refresh
⚠️ Внимание: перед изменением параметров загрузки убедитесь, что у вас есть альтернативный доступ к серверу (IPMI, физическая консоль). Ошибка в параметрах ядра может сделать хост недоступным по сети до ручного вмешательства.
После перезагрузки проверьте результат командой dmesg | grep -e DMAR -e IOMMU — в выводе должны присутствовать строки об инициализации IOMMU. Пустой вывод означает, что параметр не применился или поддержка отключена в BIOS.
Определение сетевой карты и групп IOMMU
Найдите целевой адаптер командой lspci | grep -i ethernet. Вас интересует PCI-адрес вида 02:00.0 и идентификатор устройства, который покажет lspci -nn — например, [8086:10fb]. Эта пара «vendor:device» понадобится при привязке к vfio.
Критически важный момент — группы IOMMU. Устройства на одной шине или за общим коммутатором PCIe могут попадать в одну группу, и тогда пробрасывать придётся все устройства группы сразу. Проверить состав групп можно скриптом, который перебирает содержимое /sys/kernel/iommu_groups/, либо в веб-интерфейсе Proxmox при добавлении PCI-устройства — там виден список устройств и их групп.
- 🔍 lspci -nn — узнать PCI-адрес и ID устройства
- 🧩 Проверка групп IOMMU — убедиться, что карта изолирована
- 🚫 Не пробрасывайте сетевую карту, через которую хост сам выходит в сеть
- 📝 Запишите MAC-адрес до проброса — пригодится при настройке гостя
Привязка карты к драйверу vfio-pci
Чтобы хост «отпустил» устройство, его нужно отдать драйверу vfio-pci вместо штатного сетевого драйвера. Загрузите необходимые модули, добавив их в /etc/modules:
vfio
vfio_iommu_type1
vfio_pci
vfio_virqfd
Затем создайте файл /etc/modprobe.d/vfio.conf и укажите в нём привязку по ID устройства: options vfio-pci ids=8086:10fb (подставьте свои значения). Если на хосте несколько одинаковых карт с тем же ID, vfio перехватит их все — это нужно учитывать заранее.
Дополнительно полезно запретить загрузку «родного» драйвера через blacklist в отдельном файле в /etc/modprobe.d/, чтобы исключить гонку при старте. После всех правок обновите initramfs командой update-initramfs -u -k all и перезагрузите хост.
☑️ Подготовка карты к пробросу
Проверка результата: lspci -k напротив вашей карты должен показывать строку Kernel driver in use: vfio-pci. Если там остался прежний драйвер — привязка не сработала, и нужно смотреть логи загрузки.
Добавление PCI-устройства в виртуальную машину
В веб-интерфейсе Proxmox откройте нужную ВМ, перейдите в раздел Hardware и нажмите Add → PCI Device. В списке выберите сетевую карту по её PCI-адресу. Для сетевых адаптеров, в отличие от видеокарт, опции All Functions и ROM-Bar обычно не требуются, а PCI-Express имеет смысл включить только при машинах с машинным типом q35.
То же самое делается из консоли хоста:
qm set 100 --hostpci0 02:00.0
Здесь 100 — идентификатор ВМ, а 02:00.0 — адрес карты. После добавления устройства гостевую систему нужно полностью выключить и запустить заново (не перезагрузку изнутри гостя, а stop/start), чтобы проброс инициализировался корректно.
Настройка гостевой системы
Внутри гостя карта определяется как обычное физическое устройство. В Linux-госте проверьте её появление командой ip link или lspci; в Windows-госте адаптер появится в диспетчере устройств, и для него потребуется установить драйвер производителя чипа — Intel, Mellanox, Realtek и так далее.
Обратите внимание: MAC-адрес проброшенной карты — аппаратный, он не задаётся из Proxmox, в отличие от виртуальных интерфейсов virtio. Если в госте настроена привязка сетевых параметров к MAC, используйте именно заводской адрес адаптера.
Сравнение: virtio, SR-IOV и полный проброс
Проброс — не единственный способ ускорить сеть внутри ВМ. Выбор зависит от задачи, и сравнить подходы поможет таблица:
| Метод | Производительность | Расход CPU хоста | Гибкость |
|---|---|---|---|
| VirtIO (мост vmbr) | Средняя | Заметный | Максимальная: VLAN, firewall, live-миграция |
| PCI passthrough | Близкая к «железной» | Минимальный | Низкая: карта занята одной ВМ |
| SR-IOV (VF) | Высокая | Низкий | Средняя: несколько ВМ на одну карту |
| Мост + multiqueue | Средняя+ | Средний | Высокая, компромиссный вариант |
Live-миграция ВМ с проброшенным PCI-устройством в стандартной конфигурации Proxmox невозможна — это одно из главных ограничений метода, которое часто забывают учесть при планировании кластера.
Типичные ошибки и их решение
Чаще всего проброс не работает из-за того, что хост продолжает удерживать карту. Проверьте lspci -k: если драйвер не vfio-pci, вернитесь к конфигурации modprobe и пересоберите initramfs.
- ⚙️ ВМ не стартует с ошибкой IOMMU — проверьте, включён ли IOMMU в BIOS и в параметрах ядра
- 🔗 Устройство в общей группе — переставьте карту в другой слот PCIe или пробрасывайте всю группу
- 🌐 Пропала сеть на хосте — вы пробросили карту, через которую шёл management-трафик; верните конфигурацию через консоль
- 🪟 Windows не видит адаптер — установите драйвер производителя чипа внутри гостя
⚠️ Внимание: перед пробросом убедитесь, что управление хостом идёт через другой сетевой интерфейс. Если вы пробросите единственную карту, через которую настроен vmbr0, веб-интерфейс и SSH станут недоступны до физического доступа к серверу.
Что делать, если карта в одной группе IOMMU с другими устройствами
Варианты: переставить карту в другой PCIe-слот (слоты нередко завязаны на разные контроллеры), пробросить все устройства группы в ту же ВМ либо, на свой риск, использовать патч ACS override — последний снижает изоляцию и не рекомендуется для production-сред.
Если после всех шагов карта видна в госте, но линк не поднимается, проверьте самое простое: кабель, порт коммутатора и согласование скорости. Проброс устраняет программную прослойку, поэтому физические проблемы начинают проявляться напрямую, без «буфера» в виде виртуального моста.
FAQ: частые вопросы о пробросе сетевой карты
Можно ли пробросить сетевую карту в LXC-контейнер?
Полноценный PCI passthrough в LXC не применяется — контейнеры используют общее ядро хоста. Обычно в контейнер пробрасывают отдельный сетевой интерфейс через конфигурацию lxc.net или назначают интерфейс хоста напрямую, но это другой механизм с иными ограничениями.
Исчезнет ли карта из хоста после проброса?
Да. После привязки к vfio-pci интерфейс пропадает из вывода ip link на хосте и становится недоступен для мостов и маршрутизации Proxmox. Устройство вернётся хосту только после отмены привязки и перезагрузки.
Работает ли проброс с картами Realtek и дешёвыми адаптерами?
Технически — да, если IOMMU работает корректно. Однако поведение конкретных чипов отличается: у некоторых бюджетных карт встречаются проблемы с сбросом устройства (reset bug), из-за чего ВМ после перезапуска может не видеть адаптер до перезагрузки хоста.
Можно ли вернуть карту хосту без перезагрузки?
В общем случае надёжного способа нет: требуется отвязать устройство от vfio-pci и заново загрузить штатный драйвер, что на практике часто завершается нестабильным состоянием. Рекомендуемый путь — убрать устройство из конфигурации ВМ и перезагрузить хост.
Нужен ли проброс, если хватает virtio?
Нет. Если виртуальный интерфейс справляется с нагрузкой и не загружает CPU хоста, проброс не даст заметной выгоды, зато лишит вас live-миграции, firewall Proxmox и гибкости сетевой конфигурации. Passthrough оправдан при высоких скоростях, требованиях к аппаратным функциям карты или при построении роутера внутри ВМ.