Москва: проверенные б/у ноутбуки с гарантией и проверкой перед оплатой
+7 906 722-94-45

Главная → Статьи → WSL2 и последовательные порты: Linux на ноутбуке без второй машины

WSL2 и последовательные порты: инженерный Linux на ноутбуке без второй машины

Как пробросить USB-UART, программатор и прибор в WSL2 через usbipd: подготовка Windows и дистрибутива, права на устройство, диагностика и ограничения real-time задач.

WSL2 удобна для инженерных задач: компиляторы, скрипты, утилиты для прошивки, ROS и Python-стек под Linux работают без второй машины и без перезагрузки. Но есть нюанс: WSL2 — это лёгкая виртуальная машина с собственным ядром, и USB-устройства хоста она по умолчанию не видит. Последовательный порт, программатор или прибор нужно пробрасывать отдельно.

Почему порт не виден

В WSL1 доступ к оборудованию был через слой трансляции Windows-системных вызовов, и часть устройств работала. В WSL2 полноценное ядро Linux работает в изолированной среде, поэтому /dev/ttyUSB0 не появится сам по себе: у виртуальной машины нет прямого доступа к USB-контроллеру ноутбука.

Варианты решения:

  1. Проброс USB-устройства через USB/IP (usbipd-win + клиент в дистрибутиве).
  2. Работа с портом на стороне Windows, а в Linux — через сеть (например, TCP-мост).
  3. Отказ от WSL2 для задач, где нужен жёсткий тайминг — здесь нужна отдельная установка Linux.

Подготовка Windows

  1. Убедитесь, что WSL2 установлена и работает (проверка версии — wsl --status или wsl -l -v).
  2. Установите usbipd-win — открытый проект, который поднимает USB/IP-сервер на Windows. Официальная установка — через менеджер пакетов или установщик с GitHub-релиза.
  3. Откройте PowerShell от администратора и посмотрите список устройств: usbipd list.

В списке видно BUSID, VID:PID и состояние. Устройство, занятое драйвером Windows, нужно сначала освободить (bind), а затем подключить к WSL (attach).

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

usbipd list
usbipd bind --busid 2-3
usbipd attach --wsl --busid 2-3

В дистрибутиве Linux после подключения появляется устройство. Для USB-UART это обычно /dev/ttyUSB0, для Arduino-совместимых плат — /dev/ttyACM0. Проверить можно командой dmesg | tail сразу после attach.

Если утилита usbip в дистрибутиве не установлена, её нужно поставить из репозитория (пакет usbip, иногда вместе с hwdata). Для некоторых дистрибутивов требуется загрузка модуля ядра vhci-hcd — он входит в состав ядра WSL.

Права доступа

По умолчанию последовательный порт доступен только членам группы dialout. Добавьте пользователя:

sudo usermod -aG dialout $USER

После этого нужно перезапустить сессию (или выполнить newgrp dialout). Проверка: groups должен содержать dialout, а ls -l /dev/ttyUSB0 показывать группу dialout.

Не работайте через sudo постоянно: это скрывает проблему с правами и мешает инструментам, которые запускаются от пользователя.

Диагностика типичных проблем

Симптом Вероятная причина Что делать
usbipd list не видит устройство устройство не подключено или скрыто переподключить, проверить диспетчер устройств
attach проходит, порта нет нет драйвера/модуля в дистрибутиве проверить dmesg, установить usbip
«Device busy» при bind устройство занято драйвером Windows закрыть программу, которая держит порт
Порт есть, но данные не идут скорость, чётность, потоковое управление сверить параметры с документацией
Порт пропадает через время питание USB, энергосбережение отключить экономию энергии для USB-концентратора
Ошибка доступа нет прав dialout добавить пользователя в группу

Ограничения, о которых стоит знать

  • Тайминг. WSL2 не предназначена для задач реального времени: задержки между Windows-хостом и виртуальной машиной нестабильны. Для прошивки, конфигурирования и обмена данными это неважно; для генерации импульсов и жёстких циклов — неприемлемо.
  • Одно устройство — один потребитель. Пока устройство подключено к WSL, программы Windows его не видят.
  • Перезапуск WSL разрывает attach; после перезапуска процедуру нужно повторить (автоматизация возможна, но требует настройки).
  • Не все устройства поддерживаются: составные устройства и устройства с нестандартными дескрипторами могут работать нестабильно.
  • Обновления Windows иногда меняют поведение драйверов; после крупного обновления проверьте проброс заново.

Альтернативы

Если проброс капризничает, есть простые обходные пути: работать с портом программами Windows (терминал, скрипт), а результаты передавать в Linux-часть через файлы; или поднять TCP-мост к последовательному порту и подключаться к нему из WSL как к сетевому устройству. Для регулярной работы с оборудованием, где важна надёжность, честнее выделить отдельную Linux-машину или использовать Linux как основную систему.

Сетевой путь вместо проброса USB

Не всегда нужно тащить USB в Linux. Если устройство умеет отдавать данные по сети (Ethernet-прибор, сетевой COM-сервер, встроенный веб-интерфейс), работа через сеть из WSL2 обычно стабильнее: виртуальная машина WSL2 имеет сетевой стек и видит локальную сеть ноутбука. Это же решение удобно для Modbus TCP и промышленных протоколов.

Для последовательных устройств существует промежуточный вариант: на стороне Windows поднимается мост «COM-порт → TCP», а в Linux вы подключаетесь к нему как к сетевому потоку. Такой мост добавляет задержку, но избавляет от проблем с правами и переподключением.

Сценарии, где WSL2 действительно удобна

  • Прошивка и конфигурирование плат и приборов из Linux-утилит.
  • Скрипты на Python с библиотеками, которых нет под Windows.
  • Сборка прошивок и работа с инструментами для embedded.
  • Учебные задачи и эксперименты без второй машины.

И сценарии, где она не подходит: генерация сигналов с жёстким таймингом, длительные испытания с требованием к стабильности времени, работа с оборудованием, требующим прямого доступа к шине.

Как проверить, что всё работает

Простая последовательность проверки: устройство видно в usbipd list; bind выполнен; attach прошёл без ошибки; в dmesg появилась запись о новом устройстве; файл устройства существует; права группы корректны; данные читаются и записываются.

Если что-то из этого не выполняется, начинайте с первого пункта, а не с последнего. Ошибки проброса почти всегда локализуются на ранних шагах.

Частые вопросы

Увидит ли WSL2 COM-порт автоматически?

Нет. Устройство нужно пробросить через usbipd, иначе оно останется доступным только Windows.

Нужны ли права администратора?

Для установки usbipd и выполнения bind — да. Для attach и работы с портом — нет.

Работает ли так Arduino и ESP32?

Обычно да: после attach появляется /dev/ttyACM0, и загрузка скетчей из Linux-инструментов работает.

Можно ли использовать WSL2 для Modbus RTU?

Для настройки и периодических опросов — да. Для жёстких циклов опроса с гарантированным временем — нет.

Что делать, если после перезагрузки порт исчез?

Повторить bind и attach. Автоматизация возможна через скрипт, запускаемый при старте.

Полезные материалы