Проброс usb порта windows

Время на прочтение7 мин

Количество просмотров50K

Когда человек много лет рыл бункер и запасал там продукты, он должен испытывать глубокое моральное удовлетворение, если бункер понадобился. Он будет довольный заявлять: «А я говори-и-и-ил!» То же касается и того, кто делал запасы продуктов в кладовой, когда все закупались в магазинах только на сегодня. А вот с нашим комплексом для удалённой работы Redd как-то и не хочется злорадствовать. Он проектировался для удалёнки в мирное время. И использовался задолго до первых новостей из Китая.

Давно я про него ничего не писал. Другие проекты отвлекают, да и интерес, судя по рейтингу последней из опубликованных статей, уже упал. Сил на подготовку статьи отнимают много, и это имеет смысл делать только если оно нужно достаточному числу читателей.

Но так как сейчас удалёнка у всех на устах, возникло желание поделиться одной наработкой, которая может кому-то помочь. Это не наша разработка, я проводил исследования в рамках работы над сервисом удаленной работы с отладочными платами All-Hardware. Вот их результаты сейчас и опишу. Проект USB/IP известен многим. Но он давно свёрнут авторами. Самые свежие драйверы были под WIN7. Сегодня я опишу, где скачать вариант для WIN10, и покажу, как я его проверял. Кроме того, разработчики современного аналога уверяют, что у них сделан не только Windows-клиент, но и Windows-сервер (правда, в этом режиме я тестирование не вёл: задача того не требовала). Но кому-то это тоже может оказаться полезным.

Введение

Сначала краткий рассказ, что такое USB/IP. Это комплекс программ, которые позволяют пробросить USB-устройство через сеть. Само устройство подключено к серверу. Клиент располагается на другой машине. При этом на клиентской машине имеется приложение, совершенно не рассчитанное на работу с сетью. Оно хочет настоящее USB-устройство. И оно получает информацию, что это устройство подключено. На это устройство встаёт штатный драйвер. В общем, клиент считает, что он работает с локальным USB-устройством.

Кто-то так пробрасывает ключи защиты. Мы же проверяли возможность удалённого доступа к JTAG-адаптеру.

Проект USB/IP активно развивался до 2013 года. Затем Windows-ветка остановилась. В целом, был выпущен даже двоичный подписанный драйвер. Но он был под Windows 7. Linux-ветка же продолжила развитие, и этот сервис оказался встроенным в саму операционную систему. По крайней мере, в сборку Debian он точно встроен. Причём для Linux имеется и клиент, и сервер, а для Windows исходно был сделан только клиент. Сервер под Windows сделан не был.

Существует очень хорошая статья на Хабре, которую можно использовать и как справочник по работе с данным сервисом, и как отзыв о работе с ним.

Вариант под актуальную версию Windows

Но как бы ни была хороша Windows 7, а она уже мертва. В рамках работ над All-Hardware мы рассматривали разные варианты решения одной из проблем, и надо было просто проверить ряд альтернатив по принципу «подойдёт — не подойдёт». Тратить много человеко-часов на проверку было невозможно. А переделка драйвера под Windows 10 могла затянуть в себя. Поэтому был проведён поиск в сети, который вывел на проект usbip-win. На момент его обнаружения свежий вариант был датирован 23 февраля 2020 года, то есть проект живой. Он может быть собран и под WIN7, и под WIN10. К тому же, в отличие от оригинального проекта, может быть собран не только Windows-клиент, но и Windows-сервер.

Я проверил, проект прекрасно собирается и устанавливается, поэтому дальнейшая работа велась с ним. В файле readme есть ссылка на готовый двоичный код для тех, кто не хочет самостоятельно производить сборку.

Грустная часть проверки: серверная часть

Сначала я расскажу, как проводилась проверка в рамках нашего проекта. Там всё кончилось не очень хорошо. Проверяли адаптер ST-LINK, установленный в корпус комплекса Redd, благо я уже отмечал, что в комплексе используется ОС Linux сборки Debian, а эта сборка содержит встроенный сервис USB/IP.

Согласно статье, устанавливаем сервис:

sudo apt-get update 
sudo apt-get upgrade 
sudo apt-get install usbip

Дальше в статье подробно рассказано, как автоматизировать процесс загрузки сервиса. Как я разбираюсь в Линуксе, я уже многократно писал. Плохо разбираюсь. У меня нет привычки с умным лицом цитировать чужие тексты, слабо понимая суть. Поэтому я ещё раз напомню ссылку на замечательную статью, где всё рассказано, а сам покажу, что делал я при каждом старте ОС (благо всё было нужно только для проверки):

sudo modprobe usbip-core
sudo modprobe usbip-host
sudo usbipd -D

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

Теперь смотрим, как зовут устройство:

user@redd:~$ sudo usbip list -l
- busid 1-3 (046d:082d)
   Logitech, Inc. : HD Pro Webcam C920 (046d:082d)

 - busid 1-4 (1366:0101)
   SEGGER : J-Link PLUS (1366:0101)

 - busid 1-5.1 (067b:2303)
   Prolific Technology, Inc. : PL2303 Serial Port (067b:2303)

 - busid 1-5.4.1.1 (0483:5740)
   STMicroelectronics : STM32F407 (0483:5740)

 - busid 1-5.4.1.3 (0483:3748)
   STMicroelectronics : ST-LINK/V2 (0483:3748)
<...>

Получается, что нам нужно устройство и busid, равным 1-5.4.1.3.

Даём команду:

sudo usbip bind --busid=1-5.4.1.3

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

Грустная часть проверки: клиентская часть

В Windows устанавливаем драйвер (делаем это только один раз, дальше он будет всегда установлен). Для этого запускаем от имени администратора файл usbip.exe с аргументом install:

usbip.exe install

Теперь смотрим, доступно ли нам устройство:

usbip.exe list --remote=192.168.10.123

Убеждаемся, что оно присутствует в списке. Ну, и подключаем его:

usbip.exe attach --remote=192.168.10.123 --busid=1-5.4.1.3

В менеджере устройств появляется новое USB-устройство, Keil его прекрасно видит…

Но на этом всё приятное кончается. Небольшая программа заливается во флэшку около минуты. Попытки шагать по строкам идут от 5 до 20 секунд на каждую строку. Это неприемлемо. Во время паузы в обе стороны идёт трафик примерно 50 килобит в секунду. Долго и вдумчиво идёт.

Честно говоря, ограничение по времени привело к тому, что я только предполагаю, почему всё было так плохо. Подозреваю, что там по сети бегает JTAG-трафик. А он бегает небольшими пакетами в обе стороны, отсюда и проблемы. Так было завершено исследование с результатом: «Для проекта не подходит».

Более весёлая часть: подготовка

Ещё тогда мне запало в голову, что я краем глаза видел, что в JTAG-адаптере CMSIS DAP по USB ходит не чистый JTAG-трафик, а команды. Сам JTAG-трафик формируется уже внутри адаптера. Давно хотел проверить это, да всё руки не доходили. Массовый перевод на удалёнку заставил это сделать (возникла задачка). Что такое CMSIS DAP? Это JTAG-адаптер, рекомендованный самой компанией ARM для контроллеров Cortex-M. Исходные коды для разных контроллеров выложены на GitHub, можно спаять адаптер на базе любого из них. Я сейчас дам ссылку на клон проекта, адаптированный под макетную плату «Голубая пилюля»: https://github.com/x893/CMSIS-DAP, но поисковые системы могут вывести и на официальный аккаунт ARM.

Чтобы не тратить на сервер целую PC, для проверки, я сделал этакий комплекс Yelloww (чисто по цвету пластика, из которого сделан корпус):

Роль сервера выполняет Raspberry Pi с установленной ОС Raspbian (это тот же Debian, а значит, там имеется требуемый сервер). Одна из «голубых пилюль» выступает в роли адаптера CMSIS DAP, вторая — в роли отлаживаемого устройства.

Точно так же ставим и настраиваем сервис. Разве что здесь список устройств, допустимых к экспорту, намного скромнее:

pi@raspberrypi:~ $ sudo usbip list -l
 - busid 1-1.1 (0424:ec00)
   Standard Microsystems Corp. : SMSC9512/9514 Fast Ethernet Adapter (0424:ec00)

 - busid 1-1.4 (c251:f001)
   Keil Software, Inc. : unknown product (c251:f001)

Понятно, что здесь экспортируем и импортируем устройство busid=1-1.4.

И вот тут конкретно с CMSIS DAP у меня периодически возникает небольшая проблемка. В менеджере устройств я вижу такую неприятность:

Напомню, что статья пишется по принципу «Лучше неплохая, но сегодня, чем идеальная, но завтра». Проблемы удалённой работы возникают прямо сейчас. Надеюсь, в обозримом будущем они уже будут не актуальны. А пока актуальны — показываю, как я обхожу данную проблему вручную. Сначала я отключаю устройство:

Затем сразу же включаю:

И оно начинает работать без проблем. В Keil меняем отладчик на CMSIS DAP:

И вот он:

При работе по локальной сети всё просто летает. Но понятно, что локальная сеть никому не интересна. Я попробовал пробросить порт устройства у себя дома, а затем удалённо зайти на машину на работе и потрассировать «прошивку» оттуда. Связь у моего домашнего провайдера весьма и весьма тормозная, особенно — от меня наружу. Прошивается контроллер примерно втрое медленнее, чем при прямом подключении к USB. Трассировка… Ну около секунды на строку, точно не больше. В общем, терпимо. С хорошими провайдерами, надеюсь, будет лучше.

Заключение

Проект usbip-win является современной заменой для проекта USB/IP. Он живёт и развивается. При этом он предоставляет для ОС Windows не только функцию клиента, но и функцию сервера. Совместимость с Linux-версией сохранена.

Устойчивость работы удалённого USB-устройства неожиданно поразила. Я был уверен, что возникнут таймауты. Возможно, где-то они и возникнут, но для JTAG-адаптеров не было замечено ни одного сбоя. К сожалению, не все USB-устройства могут быть проброшены через сеть по причине низкого быстродействия получившейся системы. Но в случае с JTAG-адаптерами можно рассмотреть альтернативные вещи. В частности, CMSIS-DAP вместо ST-LINK.

Оба рассмотренных проекта (usbip-win и CMSIS-DAP) могут быть скачаны с GitHub в виде исходных кодов.

Если это поможет кому-то организовать удалённый доступ к оборудованию, я буду рад. Использование Raspberry Pi позволит бросить оборудование в произвольных местах.

Невозможность пробросить подключенное USB устройство с хоста Hyper-V в виртуальную машину является одним из существенных недостатков гипервизора Microsoft. Для решения этой проблемы можно использовать open-source проект usbipd-win (https://github.com/dorssel/usbipd-win). Утилита usbipd-win позволяет пробросить по сети любое USB устройство или ключ (в том числе HASP) с хоста Windows в любую виртуальную машину Hyper-V, удаленный компьютер с Linux, Windows или в WSL2.

Утилита usbipd-win реализует протокол USB over IP для перенаправления USB устройств по сети.

Вы можете установить серверную часть usbipd-win на компьютере Windows с помощью менджера пакетов WinGet:

winget install --id=dorssel.usbipd-win -e

Также можно скачать и установить MSI пакет вручную. Например, usbipd-win_2.4.1.msi (https://github.com/dorssel/usbipd-win/releases).

Установить dorssel.usbipd-win в Windows 10

После установки в Windows появится служба usbipd (USBIP Device Host).

Откройте командную строку и выведите список доступных USB устройств:

usbipd list

Чтобы предоставить общий доступ к USB устройству, выполните команду:

usbipd bind --busid <busid>

Например:

usbipd bind --busid=7-1

Теперь вы можете получить доступ к этому USB устройству по сети с другого Linux или Windows хоста. Для подключения используется порт TCP 3240 (проверьте, что он открыт в Windows Defender Firewall).

Если вы хотите пробросить USB устройства с Windows хоста на Linux, нужно установить пакеты: ():

$ sudo apt install usbip hwdata usbutils (для Ubuntu и Debian)
$ sudo yum install kmod-usbip usbip-utils hwdata (для RPM дистрибутивов CentOS/RHEL/Oracle Linux)

Теперь вы можете вывести список USB устройств, опубликованных на удаленном компьютере:

$ usbip list --remote=192.168.0.10

Чтобы подключить (пробросить) определенное устройство USB устройство по сети на ваш хост, выполните:

$ sudo usbip attach -remote=192.168.0.10 --busid=7-1

Если вам нужно пробросить USB устройство в WSL 2, сначала установите необходимые пакеты в вашем дистрибутиве WSL (например для Ubuntu):

$ sudo apt install linux-tools-5.4.0-77-generic hwdata
$ sudo update-alternatives --install /usr/local/bin/usbip usbip /usr/lib/linux-tools/5.4.0-77-generic/usbip 20

используйте команды:

usbipd wsl list
usbipd wsl attach --busid 7-1

Проверьте, что USB устройство доступно:

$ lsusb

Чтобы отключить USB устройство:

usbipd wsl detach --busid 7-1

Если нужно пробросить USB устройство по сети на другой Windows хост, нужно установить на нем специальный агент usbip.exe (https://github.com/cezanne/usbip-win)

Для автоматического подключение USB устройства по сети при загрузке Windows, добавьте в планировщик Windows Scheduler команду:

usbip.exe attach -r 192.168.0.10 -b 7-1

Если вам требуется пробросить какое-либо USB-устройство в виртуальную машину Hyper-V, это будет сложнее чем в других виртуальных машинах, есть ряд ограничений, но всё-таки возможно.

В этой инструкции о способах проброса USB-накопителей и других USB-устройств в виртуальных машинах Hyper-V в Windows 11 или Windows 10. На близкую тему: Как пробросить видеокарту в Hyper-V.

Подключение физического диска в Hyper-V

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

Шаги для подключения такого накопителя в Hyper-V будут следующими:

  1. Зайдите в управление дисками: Win+Rdiskmgmt.msc или через контекстное меню по правому клику на кнопке «Пуск».
  2. Нажмите правой кнопкой мыши по диску, который нужно подключить в Hyper-V и выберите пункт «Вне сети» для его отключения от хоста.
    Отключение диска в Hyper-V

  3. Откройте диспетчер Hyper-V, нажмите правой кнопкой мыши по виртуальной машине, к которой нужно подключить накопитель и выберите пункт «Параметры».
  4. В разделе «Оборудование» выберите «SCSI-контролер» — «Жесткий диск» и нажмите кнопку «Добавить».
  5. Отметьте пункт «Физический жесткий диск» и укажите, какой диск (в списке будут отображаться только диски «Вне сети», на скриншоте таких нет, потому поле не активно) нужно подключить.
    Подключение физического диска в Hyper-V

  6. Нажмите «Ок» и запустите виртуальную машину.

Готово, диск будет напрямую подключен к виртуальной машине. В дальнейшем, чтобы работать с ним на хосте потребуется снова сделать диск «В сети» в управлении дисками и, если в виртуальной машине он больше не потребуется — удалить его в параметрах ВМ.

Подключение дисков в расширенном сеансе

Следующий метод подойдет для доступа к данным на USB-накопителе в виртуальной машине, но не является прямым подключением: использовать инструменты, требующие прямого доступа, не получится (программы для восстановления данных и записи загрузочной флешки, утилиты для прошивки USB-устройств).

  1. Откройте «Диспетчер Hyper-V», нажмите правой кнопкой мыши по имени хоста в панели слева и выберите пункт «Параметры Hyper-V».
  2. Убедитесь, что в разделах «Сервер» — «Политика режима расширенного сеанса» и «Пользователь» — «Режим расширенного сеанса» разрешен режим расширенного сеанса.
    Включить режим расширенного сеанса в Hyper-V

  3. Запустите виртуальную машину. В окне «Подключить» нажмите «Показать параметры».
    Показать параметры подключения к виртуальной машине

  4. Перейдите на вкладку «Локальные ресурсы» и нажмите кнопку «Дополнительно».
    Подключение локальных ресурсов в Hyper-V

  5. В разделе «Диски» включите те накопители, доступ к которым нужно получить из виртуальной машины. Также можно установить отметку «Диски, которые будут подключены позже». Также можно использовать раздел «Другие поддерживаемые самонастраивающиеся устройства» для подключения других PnP-устройств.
    Проброс USB накопителей в Hyper-V

  6. Нажмите «Ок» и подключитесь к виртуальной машине — выбранные диски будут доступны в Проводнике.
    USB-накопитель доступен в Проводнике в Hyper-V

Учитывайте, что работать такое подключение будет только для виртуальных машин Windows.

Другие USB-устройства RemoteFX

Если вам требуется подключить не флешку или диск, а какое-то иное периферийное USB-устройство, можно попробовать включить перенаправление USB-устройств RemoteFX:

  1. На хосте откройте редактор локальной групповой политики (Win+Rgpedit.msc).
  2. Перейдите к разделу Конфигурация компьютера — Административные шаблоны — Компоненты Windows — Службы удаленных рабочих столов — Клиент подключения к удаленному рабочему столу — Перенаправление USB-устройств RemoteFX. Включите политику «Разрешает RDP-перенаправление других поддерживаемых USB-устройств RemoteFX».
    Политика подключения USB-устройств RemoteFX

  3. В гостевой системе в виртуальной машине в редакторе локальной групповой политики перейдите в раздел Конфигурация компьютера — Административные шаблоны — Компоненты Windows — Службы удаленных рабочих столов — Узел сеансов удаленных рабочих столов — Перенаправление устройств и ресурсов и установите для политики «Не разрешать перенаправление поддерживаемых самонастраиваемых устройств» значение «Отключено».
  4. Выполните перезагрузку компьютера.
  5. Используйте дополнительные настройки локальных ресурсов при подключении к виртуальной машине в режиме расширенного сеанса (как в предыдущем разделе инструкции): теперь среди доступных ресурсов появится новый раздел «Другие поддерживаемые USB-устройства RemoteFX», отметьте те, доступ к которым нужно получить в виртуальной машине.
    Подключение USB-устройств RemoteFX в Hyper-V

  6. Нажмите «Ок» для подключения — устройство будет подключено напрямую в системе. В моем тесте подключение USB-камеры прошло без каких-либо проблем, и она исправно работала в виртуальной машине, а USB-микрофон не работал несмотря на то, что также был доступен в диспетчере устройств и не требует драйверов.

Насколько мне известно, это все доступные способы подключения USB-устройств в Hyper-V в текущей версии: как было изначально отмечено не очень удобно и есть ограничения, но для некоторых задач может быть достаточным.

usbipd-win

Windows software for sharing locally connected USB devices to other machines, including Hyper-V guests and WSL 2.

How to install

This software requires
Microsoft Windows 10 (x64 or ARM64) / Microsoft Windows Server 2019, version 1809 or newer;
it does not depend on any other software.

Run the installer (.msi) from the latest release
on the Windows machine where your USB device is connected.

Alternatively, use the Windows Package Manager:

This will install:

  • A service called usbipd (display name: USBIP Device Host).
    You can check the status of this service using the Services app from Windows.
  • A command line tool usbipd.
    The location of this tool will be added to the PATH environment variable.
  • A firewall rule called usbipd to allow all local subnets to connect to the service.
    You can modify this firewall rule to fine tune access control.

Note

If you are using a third-party firewall, you may have to reconfigure it to allow
incoming connections on TCP port 3240.

How to use

Share Devices

By default devices are not shared with USBIP clients.
To lookup and share devices, run the following commands with administrator privileges:

usbipd --help
usbipd list
usbipd bind --busid=<BUSID>

Sharing a device is persistent; it survives reboots.

Tip

See the wiki for a list of tested devices.

Connecting Devices

Attaching devices to a client is non-persistent. You will have to re-attach after a reboot,
or when the device resets or is physically unplugged/replugged.

Non-WSL 2

From another (possibly virtual) machine running Linux, use the usbip client-side tool:

usbip list --remote=<HOST>
sudo usbip attach --remote=<HOST> --busid=<BUSID>

Note

Client-side tooling exists for other operating systems such as Microsoft Windows, but not as part of this project.

WSL 2

You can attach the device from within Windows with the following command, which does not require administrator privileges:

usbipd attach --wsl --busid=<BUSID>

Tip

See the wiki on how to add drivers
for USB devices that are not supported by the default WSL 2 kernel.

GUI

See the wiki
for a list of GUI and IDE integration tools in case you prefer that over a CLI.

How to remove

Uninstall via Add/Remove Programs or via Settings/Apps.

Alternatively, use the Windows Package Manager:

Hyper-V USB passthrough via network redirection

USB Network Gate enables almost any USB device, such as dongles, pen drives, smartcards, printers, webcams, etc. to interface with a Hyper-V virtual machine. It can use any networked computer with a physical USB connection as a host for Hyper-V USB devices.

usb network gate hyper-v passthrough

Microsoft Corporation designed Hyper-V to run on the Windows Server Core and offers only a command-line interface. Consequently, installing third-party software on it may be challenging, but not with USB Network Gate that comes with a built-in CLI in addition to a more user-friendly GUI.

For a lot of customers that want to use USB devices in their virtual machines, Hyper-USB V’s compatibility is a serious worry. The lack of such a capability severely restricts the applicability of Hyper-V-based systems.

The following procedures outline the process of enabling server-side Hyper-V USB passthrough.

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • 3cx мини атс для windows
  • Скрипт для бесплатного обновления windows 7 до windows 10 без потери данных
  • Драйвер нвидиа для windows 7 64 bit
  • Какие опции содержит главное меню windows
  • Как полностью отключить компьютер windows 10