Proxmox: проброс USB-устройства в виртуальную машину

Команда qm set 100 --usb0 host=1a86:7523 — это самый быстрый способ пробросить USB-устройство в виртуальную машину Proxmox, если известны vendor и product ID устройства. Однако прежде чем вводить команду, стоит разобраться, какой из двух режимов проброса подходит под вашу задачу: по идентификатору устройства или по физическому порту, — потому что от этого зависит стабильность работы после перезагрузок хоста.

В этой статье разберём оба способа проброса через веб-интерфейс и консоль, проброс целого USB-контроллера через PCI passthrough, а также типичные проблемы: устройство не видно в гостевой системе, отваливается после перезагрузки или конфликтует с хостом. Материал ориентирован на актуальные версии Proxmox VE (7.x и 8.x), но общие принципы применимы и к более ранним релизам.

Как работает проброс USB в Proxmox

Proxmox VE использует гипервизор KVM/QEMU, и проброс USB реализуется средствами самого QEMU. Хост передаёт виртуальной машине доступ к устройству, после чего гостевая система видит его так, будто оно подключено напрямую. Драйвер для устройства устанавливается уже внутри гостевой ОС — на хосте он не нужен и даже может мешать.

Существует два принципиально разных подхода:

  • 🔌 Проброс по Vendor/Product ID — устройство определяется по паре идентификаторов вида 1a86:7523. Удобно, но если воткнуть устройство в другой порт или обновить прошивку, идентификаторы могут измениться.
  • 📍 Проброс по порту — привязка к физическому USB-порту (host=2-1). Любое устройство, вставленное в этот порт, попадёт в ВМ. Полезно, когда устройства меняются, а порт фиксирован.
  • 🖥️ Проброс USB-контроллера целиком — через PCI passthrough передаётся весь контроллер. Гостевая система получает полный контроль над шиной, что решает проблемы с капризными устройствами вроде USB-донглов и сетевых адаптеров.

Выбор зависит от сценария. Для единичного устройства вроде Zigbee-стика обычно достаточно проброса по ID. Для домашней лаборатории, где в ВМ с Home Assistant постоянно перетыкают разные адаптеры, надёжнее привязка к порту или проброс контроллера.

Подготовка: определяем устройство на хосте

Перед настройкой нужно узнать, как хост видит устройство. Подключите USB-устройство к серверу и выполните в консоли хоста команду lsusb. Она выведет список всех USB-устройств с их идентификаторами.

lsusb

Bus 002 Device 003: ID 1a86:7523 QinHeng Electronics CH340 serial converter

Здесь 1a86 — Vendor ID, 7523 — Product ID. Если нужно определить, к какому физическому порту подключено устройство, используйте lsusb -t — команда покажет древовидную структуру шин и портов. Номер вида 2-1 означает шина 2, порт 1.

Дополнительную информацию можно получить командой dmesg | grep -i usb сразу после подключения устройства — в выводе будут сообщения ядра о том, как система определила новое оборудование.

Проброс USB через веб-интерфейс Proxmox

Самый простой способ — графический интерфейс. Виртуальную машину при этом желательно остановить: хотя hotplug для USB поддерживается, не все гостевые системы корректно подхватывают устройство на лету.

Порядок действий:

  • 🖱️ Откройте нужную ВМ и перейдите на вкладку Hardware.
  • ➕ Нажмите AddUSB Device.
  • 📋 Выберите режим Use USB Vendor/Device ID и найдите устройство в выпадающем списке, либо переключитесь на Use USB Port и укажите порт.
  • ⚙️ При необходимости включите опцию USB3 — она активирует контроллер xHCI (qemu-xhci), что важно для устройств USB 3.0 и некоторых USB 2.0 устройств, конфликтующих с эмуляцией EHCI.
  • ✅ Нажмите Add и запустите виртуальную машину.
⚠️ Внимание: опция USB3 меняет конфигурацию виртуального USB-контроллера. Если у вас уже проброшены другие USB-устройства без этой опции, после её включения им тоже может потребоваться перенастройка — иначе гостевая система увидит их на другом контроллере.
📊 Какой способ проброса USB в Proxmox вы используете чаще всего?
По Vendor/Product ID
По физическому порту
Проброс USB-контроллера через PCI
Ещё не пробовал, только настраиваю

Проброс USB через командную строку

Те же операции выполняются командой qm set. Это удобно для автоматизации и ситуаций, когда веб-интерфейс недоступен. Синтаксис для проброса по идентификатору устройства:

qm set 100 --usb0 host=1a86:7523

Здесь 100 — ID виртуальной машины, usb0 — номер USB-слота в конфигурации ВМ (можно использовать usb0, usb1 и так далее). Для проброса по порту синтаксис немного другой:

qm set 100 --usb0 host=2-1

Чтобы включить контроллер USB 3.0, добавьте параметр usb3=1:

qm set 100 --usb0 host=1a86:7523,usb3=1

Проверить итоговую конфигурацию можно командой qm config 100 — в выводе появится строка вида usb0: host=1a86:7523,usb3=1. Удаляется проброс командой qm set 100 --delete usb0.

☑️ Проверка после проброса USB

Выполнено: 0 / 5

Проброс USB-контроллера через PCI Passthrough

Когда обычный проброс не работает — устройство сбрасывается, требует точных таймингов шины или конфликтует с эмуляцией QEMU, — выходом становится передача гостю всего USB-контроллера. Это тот же механизм, что и проброс видеокарты, поэтому требования аналогичные.

Необходимо, чтобы на хосте были включены IOMMU (Intel VT-d или AMD-Vi) в BIOS/UEFI, а в загрузчике Proxmox — соответствующий параметр ядра. Для систем на GRUB параметр добавляется в /etc/default/grub в строку GRUB_CMDLINE_LINUX_DEFAULT: intel_iommu=on для Intel или amd_iommu=on для AMD. После правки выполняется update-grub и перезагрузка. Для систем с systemd-boot аналогичный параметр прописывается в конфигурации загрузочной записи — точный путь зависит от версии Proxmox, сверяйтесь с официальной документацией вашей версии.

⚠️ Внимание: контроллер, который вы пробрасываете, перестанет быть доступен хосту. Если на нём висят клавиатура, загрузочная флешка или другие нужные хосту устройства, после проброса они перестанут работать на уровне гипервизора. Перед настройкой проверьте командой lspci и lsusb -t, какие устройства подключены к выбранному контроллеру.

Далее находят PCI-адрес контроллера через lspci | grep -i usb и добавляют его в ВМ: в веб-интерфейсе через Hardware → Add → PCI Device либо командой qm set 100 --hostpci0 00:14.0 с подстановкой реального адреса вашего контроллера. Также важно, чтобы контроллер находился в отдельной IOMMU-группе — проверить это можно, просмотрев группы в /sys/kernel/iommu_groups/. Если в одной группе оказались лишние устройства, иногда помогает параметр pcie_acs_override, но его применение снижает изоляцию и требует понимания рисков.

Что такое IOMMU-группы простыми словами

IOMMU объединяет PCI-устройства в группы в зависимости от топологии шины и возможностей чипсета. Пробрасывать можно только группу целиком. Если нужный контроллер делит группу с другими устройствами, все они уйдут в ВМ вместе с ним. Разделение групп зависит от конкретной материнской платы и процессора — универсального способа гарантированно «развести» устройства по группам не существует.

Типичные проблемы и их решение

Даже корректно настроенный проброс иногда ведёт себя непредсказуемо. Ниже — ситуации, с которыми администраторы сталкиваются чаще всего.

ПроблемаВероятная причинаЧто проверить
Устройство не видно в гостевой ОСНе установлен драйвер в гостевой системеВывод lsusb в госте, диспетчер устройств Windows
ВМ не стартует с ошибкой USBУстройство занято хостом или отключеноlsusb на хосте, журнал задач в веб-интерфейсе
Проброс слетает после перезагрузкиИзменился номер порта или ID устройстваПривязка по порту вместо ID, либо наоборот
Устройство периодически отваливаетсяЭнергосбережение USB (autosuspend)Параметры ядра usbcore.autosuspend на хосте
USB 3.0 устройство работает как USB 2.0Не включён контроллер xHCIОпция usb3=1 в конфигурации ВМ

Отдельного упоминания заслуживает автоматическое отключение USB устройств ядром Linux из-за autosuspend: хост может «усыплять» проброшенное устройство, и гость теряет связь с ним. Возможное решение — задать на хосте параметр usbcore.autosuspend=-1 в строке ядра. Перед изменением загрузочных параметров убедитесь, что у вас есть альтернативный доступ к серверу (IPMI, физическая консоль), на случай ошибки в конфигурации загрузчика.

⚠️ Внимание: проброс USB-накопителя, с которого загружается сам Proxmox, в виртуальную машину приведёт к потере хостом доступа к собственной системе. Перед пробросом любого накопителя убедитесь, что это не загрузочный диск гипервизора.

Особенности для LXC-контейнеров

Механизм --usb0 работает только для виртуальных машин. В LXC-контейнерах проброс реализуется иначе: устройство передаётся как файл устройства через монтирование и правила cgroup. В конфигурации контейнера (/etc/pve/lxc/<ID>.conf) добавляются строки вида lxc.cgroup2.devices.allow и lxc.mount.entry с указанием пути к устройству, например /dev/ttyUSB0.

Точный синтаксис зависит от версии Proxmox и типа устройства, а для непривилегированных контейнеров дополнительно требуется настройка маппинга прав. Это более тонкая тема, и перед настройкой стоит свериться с официальной документацией Proxmox для вашей версии — ошибки в правах доступа к устройствам могут ослабить изоляцию контейнера от хоста.

Часто задаваемые вопросы

Можно ли пробросить один USB-девайс сразу в две виртуальные машины?

Нет. USB-устройство в каждый момент времени может быть подключено только к одной ВМ. Если устройство нужно в разных машинах по очереди, его можно переназначать командами qm set — удалять из одной конфигурации и добавлять в другую, либо использовать сетевые решения вроде USB over IP.

Работает ли hotplug — подключение USB к работающей ВМ?

Да, через веб-интерфейс и команду qm monitor устройство можно подключить на лету. Однако поддержка зависит от гостевой ОС: современные Linux и Windows обычно подхватывают устройство корректно, но для критичных сценариев надёжнее добавлять устройство при выключенной ВМ.

Устройство видно на хосте, но не появляется в списке при добавлении в ВМ. Что делать?

Обновите страницу веб-интерфейса и проверьте вывод lsusb на хосте. Если устройство там есть, а в списке нет, добавьте его вручную через CLI командой qm set <VMID> --usb0 host=<vid:pid> — это обходит возможные ограничения отображения в графическом интерфейсе.

Нужно ли устанавливать драйверы на сам хост Proxmox?

Нет, и это частая ошибка. Драйвер устанавливается только в гостевой системе. Более того, если хост захватил устройство своим драйвером (например, USB-to-Serial адаптер занят модулем ядра), это может мешать пробросу — в таком случае устройство иногда требуется отвязать от драйвера хоста.

Чем проброс по порту лучше проброса по ID устройства?

Привязка к порту переживает замену самого устройства: любой девайс, вставленный в указанный разъём, попадёт в ВМ. Это удобно, когда устройства периодически меняют. Обратная сторона — если переткнуть устройство в другой порт, проброс перестанет работать, пока конфигурацию не обновят.