Время на прочтение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).
После установки в 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 устройства с локального ПК на сервер Windows Автор Алексей | HiTex.BY на 20 июня 2022 11:10 |
USB Redirector – Программа для транслирования любого USB-устройства в сеть, т.е позволяет получить доступ к USB-устройству через интернет или локальную сеть так, как если бы оно было подключено к вашему компьютеру. Для транслирования USB устройства нужно проделать определенные (описанные ниже) действия на сервере (там, где подключено USB-устройство) и на клиенте (на котором мы хотим получить доступ к USB устройству). Со стороны сервера. Скачиваем дистрибутив программы USB-Redirector for RDP с официального сайта www.usb-server.com или по прямой ссылке http://incentivespro.com/usb-redirector-rdp.zip Ждем, когда в появившемся окне станет активна кнопка «Next» и нажимаем ее (обычно это происходит секунд через 10-15 после запуска). Устанавливаем «I accept the agreement», как показано на рисунке, и нажимаем «Next». Указываем путь для установки или просто нажимаем кнопку «Next» ничего не меняя. Нажимаем «Finish», это приведет к первому запуску программы. При запуске отображается окно, в котором нужно либо нажать кнопку «Enter License Key» и ввести приобретенный ключ для программы, либо нажать кнопку «Continue evaluation» и продолжить знакомство с программой в тестовом режиме. Если у вас еще нет ключа, то нажимаем «Continue evaluation». Важно! Это сообщение говорит о том, что нужно иметь на сервере драйвер для устройства, к которому мы хотим получить доступ (т.е. драйвер для Веб-камеры). Ставим галочку как на рисунке и нажимаем ОК. Появляется окно программы. На этом настройка сервера окончена. Настройка со стороны клиента (т.е. на компьютере удаленного приемного пункта). Скачиваем дистрибутив программы USB-Redirector for RDP с официального сайта www.usb-server.com или по прямой ссылке http://incentivespro.com/usb-redirector-rdp.zip Ждем, когда в появившемся окне станет активна кнопка «Next» и нажимаем ее (обычно это происходит секунд через 10-15 после запуска). Устанавливаем «I accept the agreement», как показано на рисунке, и нажимаем «Next». Выбираем путь для установки или просто нажимаем кнопку «Next» ничего не меняя. Нажимаем «Install». После окончания процесса установки нажимаем «Finish», это приведет к первому запуску программы.
Главное окно программы выглядит следующим образом. В нем отображены все USB-устройства, которые подключены к данному компьютеру. Например, в данном случае подключено два устройства. Чтобы дать доступ к нашему устройству (Веб-камере), необходимо выделить его в списке и нажать кнопку «Share USB device» (она выделена красным кружком на рисунке). Если всё сделано правильно, то на иконке устройства появится изображение руки. Это значит, что доступ к нашему устройству открыт. Теперь можно подключаться к серверу, который мы настраивали в начале статьи. Для этого используем «Подключение к удаленному рабочему столу». В строке Компьютер вводим IP адрес сервера и нажимаем кнопку подключить. После подключения удаленного компьютера к серверу, если всё сделано правильно, то в окне USB Redirector на сервере появится название сеанса и отобразится подключенное устройство с зеленой галочкой. На компьютере-клиенте изображение устройства изменит свой вид как показано на рисунке. |
(0 голос(а)) Эта статья полезна Эта статья бесполезна |
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 thePATH
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:
В эпоху гипервизоров редко когда под какой-то сервер приложений или баз данных выделяют отдельный физический сервер. Очень часто такие сервера работают в качестве гостевой операционной системы виртуальной машины на одном из гипервизоров. Обычно в 80-90% случаев это так (данные взять на основе сугубо моего личного опыта). Проброс USB устройств в таком случае не всегда является тривиальной задачей.
Если у вас, скажем, гипервизор ESXi, то задача может быть решена без помощи стороннего ПО. Проброс USB в Hyper-V все еще не завезли.
Совсем по-другому обстоят дела, когда вам необходимо подключить удаленное USB устройство, например, на ноутбук сотрудника. Особенно, если этим устройством пользуются попеременно. Это может быть токен с ЭЦП, аппаратный ключ с лицензией на ПО.
Я хочу поделиться с одним из возможных решений данной проблемы.
Как поделились коллеги в комментариях ЭЦП с Рутокен2 для ЕГАИС не выгружается таким образом, как приведено в методе ниже. Рутокен Lite – без проблем выгружается как на флэшку, так и в реестр.
Краткое описание задачи
Задача, собственно, проста. Есть порядка 5-10 USB устройств, которые будут периодически подключаться к разным клиентам. Соответственно, все эти USB устройства физически должны быть подключены к какому-то одному устройству, которое будет доступно всем клиентам. Клиенты же уже в порядке живой очереди будут “разбирать” пул доступных устройств.
В силу особенностей работы 1 USB устройство в один момент времени будет подключено только к одному клиенту.
Если у вас исключительно Linux окружение, то вы можете использовать встроенное решение USB/IP.
Выбор решения
Программного обеспечения, которое может обеспечить проброс USB устройств по сети, очень много. После долгих сравнений набора возможностей, стоимости и предлагаемого набора клиентов решение было выбрано – VirtualHere.
Скажу сразу – решение платное (49$). Однако, лицензируется сервер целиком, т.е. нет ограничений на количество подключенных устройств. Без лицензии в один и тот же момент времени можно использовать только одно USB устройство. Для настройки PoC (Proof of Concept) решения этого достаточно. Вы сможете проверить – подойдет ли вам этот продукт или нет.
Почему VirtualHere?
Аргументы в сторону выбора этого решения:
- Большой выбор серверной части – Window, Linux, Android, OSX.
- До безобразия простая настройка сервера.
- Достаточно большой набор клиентов. Есть клиент под Windows, Linux, Mac OS и Android.
- Клиент может быть запущен как сервис.
- У клиента есть как графический вариант, так и консольный аналог.
- У клиента есть свой API.
- Относительно гуманная стоимость – 49$.
ВАЖНО: В Linux CentOS 8 и 9 из коробки нет модуля vhci_hcd. Поэтому нужно либо добавлять этот модуль вручную. Либо использовать контейнеры. Признаюсь честно, я потратил около 2-х часов на то, чтобы попробовать реализовать какой-то из этих вариантов, но из этого толком ничего не получилось. Пробовал даже сторонний модуль vhci_hcd от elrepo. Насколько я понял, модуль от elrepo не работает на ядре 4.18.0-394, а рассчитан на работу с более старой версией ядра. Но это только мои догадки - не так много у меня опыта работы с Linux. Если у кого-то получилось запустить клиент на CentOS 8 или 9 - поделитесь в комментариях опытом.
В качестве физической коробки, к которой будут подключены устройства будет выступать небольшой неттоп. Можно использовать любое практически любое физическое устройство, т.к. ресурсов серверу много не нужно. Можно даже использовать Raspberry Pi.
Могу ошибаться, но все или некоторые аппаратные решения DistKontrolUSB, например, используют клиент как две капли воды похожий на клиент VirtualHere. Возможно, что серверная часть тоже. Но это лишь мои наблюдения и догадки.
Теперь я покажу вам, как выполняется как выполняется настройка сервера, а также подключение к серверу с клиентских рабочих мест.
Настройка сервера
Мы будем использовать вариант с Linux сервером. Наш дистрибутив – Ununtu 20.04. Вы можете использовать любой дистрибутив. Но у меня под рукой для написания статьи был только этот 🙂
Если у вас абсолютно новая установка Ubuntu, то предварительно необходимо установить curl:
apt update
apt install curl
При наличии на сервере прямого выхода в Интернет установка производится в одну команду:
curl https://raw.githubusercontent.com/virtualhere/script/main/install_server | sudo sh
Теперь проверим статус нашего сервера:
systemctl status virtualhere.service
Серсив запущен и готов принимать клиентские подключения. Клиентский трафик прослушивается на порту TCP/7575:
netstat -tulpn
Клиент для Windows
Сначала я покажу, как выглядит клиент для Windows. Скачиваем его с сайта проекта.
Запускаем клиент:
Если вы находитесь в одной подсети с сервером, то клиент скорее всего найдет его автоматически. Если сервер автоматически не найдет, то нужно подсказать клиенту, по какому IP-адресу находится сервер:
Теперь мы видим все подключенные к серверу USB устройства и можем примонтировать одно из них:
Также можем зарегистрировать клиент в качестве службы Windows:
Работу клиента я проверил на следующих серверных ОС: Windows Server 2008 R2, 2012 R2, 2016 и 2019 и соответствующим им клиентским ОС – Windows 7, 8.1, 10 + Windows 11.
Также можно использовать API для работы с клиентом. Например, запросим перечень всех устройств на сервере:
vhui64.exe -t list
Клиент для Linux
Теперь я покажу, как выглядит клиент для Linux. Скачиваем его с сайта проекта.
Разрешаем выполнение:
chmod +x vhuit64
И запускаем клиент.
sudo ./vhuit64
В остальном работа Linux клиента аналогична работе Windows клиента. Также нужно указать расположение сервера:
Теперь мы можем увидеть перечень устройств и подключить одно из них:
Стоит отметить, что для Linux есть отдельный консольный клиент для тех случае, если вы будите использовать клиент, например, на Linux сервере.