Найти в Дзене
Умный дом с проводами

Подсистема Windows для Linux: подключение USB-устройств

Оглавление

Иной раз возникает задача быстро запустить какую-нибудь утилиту Linux, а под рукой лишь компьютер с Windows. Захламлять контроллер Wirenboard лишними пакетами и зависимостями не хочется, а ставить Linux второй системой или отдельной виртуальной машиной - слишком накладно.

На выручку приходит подсистема Windows для Linux, известная как WSL. Она позволяет устанавливать и запускать различные дистрибутивы Linux, не покидая сеанс привычной большинству пользователей операционной системы от Microsoft.

Данная статья является вспомогательной по отношению к основной - Wirenboard по SSH: защита соединения с помощью Рутокен ЭЦП, где возможности WSL используются для генерации SSH-ключа на активном ключевом носителе.

Предполагается, что все нижеследующие действия выполняются в среде Windows 11 (в «десятке» тоже должно работать, но проверить не на чем).

Установка подсистемы Windows для Linux

Чтобы принципы работы с консолью не отличались от Wirenboard, в качестве гостевой подсистемы Windows установим родной контроллеру дистрибутив Debian.

Откроем PowerShell или Терминал Windows и выполним команду

wsl --install Debian

Начнётся скачивание и установка дистрибутива, после чего появится надпись «Распространение успешно установлено». Проверить список установленных дистрибутивов можно командой

wsl --list

При этом, единственный дистрибутив будет выведен с отметкой «по умолчанию», что позволяет запускать его короткой командой

wsl

При первом запуске Debian предложит задать имя пользователя и пароль, после чего предоставит доступ к командной строке Linux. Обратите внимание, по умолчанию текущим расположением считается корневой каталог пользователя Windows - любые файлы, создаваемые в процессе исполнения команд Linux, окажутся именно там. Можно перебраться в директорию ниже, выполнив в WSL команду "cd Downloads" - попадём в папку Windows "Загрузки".

Результат выполнения вышеперечисленных команд
Результат выполнения вышеперечисленных команд

Если в системе установлено несколько дистрибутивов, для запуска следует использовать ключ "-d" с указанием названия:

wsl -d Debian

Если установленный дистрибутив Linux больше никогда не понадобится или там что-то сломалось и нужно начать всё с чистого листа, то удалить его можно простой командой

wsl --unregister Debian

Работа с USB-устройствами

Изначально поддержка USB-устройств недоступна в WSL, поэтому нужно установить в Windows специальный проект с открытым исходным кодом, USBIPD-WIN, перейдя на страницу с его релизами и выбрав файл .msi для своей платформы.

Проект позволяет транслировать локально подключенные USB-устройства на другие машины, включая Hyper-V и WSL2.

В нашем случае не требуется настройка файервола для внешних подключений, все операции выполняются в пределах компьютера. Узнать больше о возможностях проекта можно по ссылке (англоязычный текст).

Список подключенных устройств

Откроем рядом окно PowerShell в режиме администратора и введём команду. Будут перечислены все устройства, подключенные к Windows:

usbipd list

Здесь нас интересует идентификатор BUSID, состоящий из двух цифровых значений, разделённых дефисом. По нему мы обращаемся к USB-устройству, производя дальнейшие манипуляции.

Например, в моём случае два одновременно подключенных Рутокен ЭЦП отображаются как "Устройство чтения смарт-карт Microsoft Usbccid (WUDF)" с идентификаторами BUSID "1-7" и "1-9" соответственно. Понять, что есть что, на первый взгляд совершенно невозможно. Остаётся извлечь один из токенов и проверить, какой идентификатор остался.

Значение колонки State, отображаемое как "Not shared", соответствует изначальному состоянию устройства.

Список USB-устройств, подключенных в Windows
Список USB-устройств, подключенных в Windows

Подготовка к подключению устройства в WSL

Чтобы подготовить устройство к подключению в WSL, потребуется перевести его в режим совместного использования. Откроем общий доступ к устройству с BUSID "1-7":

usbipd bind --busid 1-7

Повторно запросив список устройств, мы обнаружим, что в графе State значение поменялось на Shared.

Устройство 1-7 переведено в режим совместного использования
Устройство 1-7 переведено в режим совместного использования

Подключение устройства в WSL

Выполняя следующую команду, мы подключаем устройство к WSL. Перед этим откроем командную строку WSL в отдельном окне, чтобы упрощённая виртуальная машина WSL2 была активна.

Важное замечание: не пытайтесь прокинуть в WSL токен, который используете для входа в Windows, если на вашем компьютере прописано поведение выхода из системы при его извлечении - на время проведения работ эту опцию нужно предусмотрительно отключить, иначе сеанс Windows резко завершится при выполнении следующей команды.

usbipd attach --wsl --busid 1-7

Примечание: пока USB-устройство остаётся подключенным к WSL, Windows не может его использовать.

Статус USB-устройства, успешно подключенного к WSL
Статус USB-устройства, успешно подключенного к WSL

Работа с устройством в WSL

Сразу после установки дистрибутив не содержит утилит для работы с USB. Чтобы их добавить, в режиме WSL выполним команду

sudo apt-get install usbutils

После чего появится возможность смотреть список подключенных устройств путём выполнения команды

lsusb

Всё готово к работе

Отображение подключенного устройства в WSL
Отображение подключенного устройства в WSL

Отключение устройства от WSL

После завершения работы с устройством выполнить команду в PowerShell:

usbipd detach --busid 1-7

Чтобы после всех манипуляций закрыть общий доступ к токену и вернуть всё как было, потребуется выполнить следующую команду с правами администратора:

usbipd unbind --busid 1-7