Когда команда usbip attach завершается ошибкой вроде «no such device» или клиент не видит экспортированное устройство, первое, что стоит проверить, — загружены ли модули ядра подсистемы USB/IP: usbip-core, usbip-host на сервере и vhci-hcd на клиенте. Без этих модулей весь стек проброса USB по сети неработоспособен, даже если пользовательские утилиты usbip установлены корректно.
Подсистема USB/IP входит в состав ядра Linux и позволяет передавать USB-устройства по TCP/IP-сети: физическое устройство остаётся подключённым к серверу, а клиент работает с ним так, будто оно воткнуто в локальный порт. В этой статье разберём, какие модули отвечают за каждую сторону соединения, как проверить их состояние, загрузить вручную и настроить автозагрузку.
Из чего состоит подсистема USB/IP в ядре
Архитектура USB/IP разделена на две стороны — сервер (host, где физически подключено устройство) и клиент (где устройство используется). Каждой стороне соответствует свой набор модулей ядра, которые работают поверх общего сетевого транспорта.
Основные компоненты:
- 🔧 usbip-core — общий модуль, реализующий протокол USB/IP, обработку сетевых пакетов и базовые структуры данных. Нужен на обеих сторонах.
- 🖥️ usbip-host — серверный модуль, который перехватывает управление физическим USB-устройством и экспортирует его в сеть.
- 💻 vhci-hcd — клиентский модуль, виртуальный USB Host Controller Driver. Создаёт в системе виртуальный контроллер, к которому «подключаются» удалённые устройства.
- 📦 usbip-vudc — модуль для USB Device Controllers (используется реже, для эмуляции устройств на стороне gadget).
Пользовательские утилиты (usbip, демон usbipd) — это лишь надстройка. Вся реальная работа по инкапсуляции URB-запросов в TCP-пакеты и обратно выполняется именно перечисленными модулями ядра.
Проверка наличия и состояния модулей
Прежде чем что-то загружать, проверьте, присутствуют ли модули в вашем ядре и не загружены ли они уже. Для этого достаточно двух команд:
lsmod | grep -E "usbip|vhci"
modinfo usbip-core
Если lsmod ничего не вернул — модули не загружены. Если modinfo выдаёт ошибку «module not found», значит, в вашем ядре поддержка USB/IP либо выключена при сборке, либо вынесена в отдельный пакет, который нужно установить. В ряде дистрибутивов (например, в некоторых сборках для Debian и Ubuntu) модули поставляются вместе с пакетом linux-tools или usbip — точное имя пакета зависит от версии дистрибутива, сверьтесь с его репозиторием.
Дополнительно можно проверить конфигурацию текущего ядра:
grep USBIP /boot/config-$(uname -r)
Значения CONFIG_USBIP_CORE=m, CONFIG_USBIP_VHCI_HCD=m и CONFIG_USBIP_HOST=m означают, что модули собраны и доступны для загрузки. Значение =y — поддержка встроена в ядро статически, загружать ничего не нужно. Отсутствие строк или is not set — поддержка не собрана, и потребуется пересборка ядра или установка другого пакета ядра.
⚠️ Внимание: на минимальных и кастомных сборках ядра (встраиваемые системы, некоторые ARM-дистрибутивы, ядра для VPS) модулей USB/IP может не быть вовсе. Перед настройкой всего стека убедитесь, что modinfo находит модули — иначе дальнейшие шаги бессмысленны.
Загрузка модулей на сервере и клиенте
На стороне сервера, к которому физически подключено устройство, необходимо загрузить два модуля. Зависимость usbip-core подтянется автоматически:
modprobe usbip-core
modprobe usbip-host
На клиенте вместо usbip-host загружается виртуальный контроллер:
modprobe vhci-hcd
После загрузки vhci-hcd в системе появляется виртуальный USB-контроллер. Убедиться в этом можно через lsusb -t или просмотром /sys/devices/platform/vhci_hcd — там отображаются виртуальные порты и их состояние. Количество портов может различаться в зависимости от версии ядра.
Если modprobe возвращает ошибку FATAL: Module not found, вернитесь к проверке конфигурации ядра из предыдущего раздела. Ошибка вида Operation not permitted обычно означает, что команда запущена без прав root — используйте sudo.
Автоматическая загрузка модулей при старте системы
Ручная загрузка через modprobe действует только до перезагрузки. Чтобы модули поднимались автоматически, их добавляют в конфигурацию systemd-modules-load — этот механизм поддерживается большинством современных дистрибутивов.
На сервере создайте файл:
echo -e "usbip-core\nusbip-host" | sudo tee /etc/modules-load.d/usbip.conf
На клиенте аналогично, но с другим содержимым:
echo "vhci-hcd" | sudo tee /etc/modules-load.d/vhci.conf
Проверить, что механизм отработает, можно без перезагрузки — командой systemctl restart systemd-modules-load.service и последующим просмотром lsmod. В дистрибутивах без systemd используется файл /etc/modules, куда имена модулей добавляются построчно.
☑️ Настройка автозагрузки USB/IP
Привязка устройства на сервере и подключение на клиенте
После загрузки модулей на сервере запускается демон usbipd -D, затем устройство привязывается к подсистеме. Сначала найдите его busid:
usbip list -l
Вывод покажет локальные устройства с идентификаторами вида 1-1.2. Привязка выполняется командой:
usbip bind -b 1-1.2
Здесь есть важный нюанс: после bind устройство отключается от локального драйвера сервера и становится недоступным на самом сервере — оно полностью отдаётся подсистеме USB/IP. Если вы привяжете, например, клавиатуру или диск, с которого загружена система, последствия будут неприятными. Привязывайте только те устройства, которые действительно предназначены для проброса.
На клиенте подключение выполняется в два шага: сначала просмотр экспортированных устройств, затем attach:
usbip list -r 192.168.1.10
usbip attach -r 192.168.1.10 -b 1-1.2
После успешного attach устройство появляется в выводе lsusb на клиенте и работает как локальное. Отключение — через usbip detach -p <порт>, номер порта смотрите в выводе usbip port.
⚠️ Внимание: USB/IP по умолчанию передаёт данные по сети без шифрования, а аутентификация минимальна. Не пробрасывайте устройства через недоверенные сети и интернет без VPN-туннеля — особенно токены, ключи и накопители с чувствительными данными.
Почему usbip attach пишет «attach failed» хотя устройство видно в list
Чаще всего причина в том, что на клиенте не загружен vhci-hcd или на сервере устройство уже занято другим клиентом — одно устройство может быть подключено только к одному клиенту одновременно. Также проверьте, что порт 3240/tcp не блокируется файрволом: именно его использует протокол USB/IP по умолчанию.
Типичные ошибки и их диагностика
Большинство проблем с USB/IP сводится к нескольким повторяющимся сценариям. Сводная таблица поможет быстро сориентироваться:
| Симптом | Вероятная причина | Что проверить |
|---|---|---|
| modprobe: module not found | Модули не собраны в ядре | Конфиг ядра, пакет linux-tools/usbip |
| usbip list -r: connection refused | Не запущен usbipd или закрыт порт | Демон на сервере, файрвол, порт 3240 |
| attach failed | Не загружен vhci-hcd или устройство занято | lsmod на клиенте, другие клиенты |
| Устройство пропало с сервера | Нормальное поведение после bind | usbip unbind для возврата |
| Устройство отваливается по таймауту | Нестабильная сеть, большие задержки | Качество канала, dmesg на клиенте |
Главный инструмент диагностики — журнал ядра. Команда dmesg | tail -30 на обеих сторонах сразу после ошибки покажет, на каком этапе произошёл сбой: регистрация контроллера, приём URB или сетевой обмен. Сообщения модулей USB/IP содержат префиксы usbip, vhci_hcd или stub, по ним удобно фильтровать вывод.
Отдельного упоминания заслуживает чувствительность к сети. Протокол предполагает низкие задержки: устройства с жёсткими таймингами (веб-камеры, аудиоинтерфейсы, некоторые программаторы) через Wi-Fi или WAN могут работать нестабильно или не работать вовсе. Это ограничение самого подхода, а не ошибка конфигурации.
USB/IP в виртуализации и альтернативные сценарии
Одно из самых частых применений подсистемы — проброс устройств в виртуальные машины и контейнеры, где гипервизор не предоставляет прямой USB-пасsthrough. Схема та же: хост выступает сервером, гостевая система — клиентом с vhci-hcd. Это работает и тогда, когда сервер и клиент — одна и та же физическая машина (указывается адрес loopback или внутренней виртуальной сети).
На стороне Windows существуют отдельные реализации клиента USB/IP, однако их совместимость зависит от конкретного проекта и версии — перед использованием проверяйте актуальное состояние соответствующего репозитория. Ядерные модули, описанные в этой статье, относятся именно к Linux-стороне.
Часто задаваемые вопросы
Нужно ли пересобирать ядро, если модулей USB/IP нет?
Не всегда. Сначала проверьте, не поставляются ли модули отдельным пакетом вашего дистрибутива (часто это пакеты вида linux-tools или usbip). Пересборка требуется только если опции CONFIG_USBIP_* выключены в конфигурации самого ядра.
Можно ли пробросить одно устройство сразу двум клиентам?
Нет. После attach устройство эксклюзивно принадлежит одному клиенту. Второму клиенту оно станет доступно только после detach со стороны первого.
Почему после usbip bind устройство исчезло на сервере?
Это штатное поведение: модуль usbip-host отбирает устройство у локального драйвера, чтобы экспортировать его в сеть. Вернуть устройство можно командой usbip unbind -b <busid>.
Работает ли USB/IP через Wi-Fi или интернет?
Технически — да, протокол работает поверх обычного TCP. Однако из-за задержек и потерь пакетов устройства с жёсткими таймингами могут функционировать нестабильно, а передача без VPN небезопасна: данные не шифруются самим протоколом.
Как узнать, какие удалённые устройства сейчас подключены к клиенту?
Командой usbip port — она показывает занятые порты виртуального контроллера vhci-hcd, адрес сервера и busid каждого подключённого устройства.