WSL2 удобна для инженерных задач: компиляторы, скрипты, утилиты для прошивки, ROS и Python-стек под Linux работают без второй машины и без перезагрузки. Но есть нюанс: WSL2 — это лёгкая виртуальная машина с собственным ядром, и USB-устройства хоста она по умолчанию не видит. Последовательный порт, программатор или прибор нужно пробрасывать отдельно.
Почему порт не виден
В WSL1 доступ к оборудованию был через слой трансляции Windows-системных вызовов, и часть устройств работала. В WSL2 полноценное ядро Linux работает в изолированной среде, поэтому /dev/ttyUSB0 не появится сам по себе: у виртуальной машины нет прямого доступа к USB-контроллеру ноутбука.
Варианты решения:
- Проброс USB-устройства через USB/IP (usbipd-win + клиент в дистрибутиве).
- Работа с портом на стороне Windows, а в Linux — через сеть (например, TCP-мост).
- Отказ от WSL2 для задач, где нужен жёсткий тайминг — здесь нужна отдельная установка Linux.
Подготовка Windows
- Убедитесь, что WSL2 установлена и работает (проверка версии —
wsl --statusилиwsl -l -v). - Установите usbipd-win — открытый проект, который поднимает USB/IP-сервер на Windows. Официальная установка — через менеджер пакетов или установщик с GitHub-релиза.
- Откройте 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. Автоматизация возможна через скрипт, запускаемый при старте.