Разное

Проброс usb порта по сети: Проброс USB-портов из Windows 10 для удалённой работы / Хабр

Содержание

Проброс USB-портов из Windows 10 для удалённой работы / Хабр

Когда человек много лет рыл бункер и запасал там продукты, он должен испытывать глубокое моральное удовлетворение, если бункер понадобился. Он будет довольный заявлять: «А я говори-и-и-ил!» То же касается и того, кто делал запасы продуктов в кладовой, когда все закупались в магазинах только на сегодня. А вот с нашим комплексом для удалённой работы 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-порта. Каталоги создаются только до перезапуска системы. Так что создавать их надо каждый раз. Третья строка — с нею всё понятней, она запускает сервис.

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

[email protected]:~$ 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, вторая — в роли отлаживаемого устройства.

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

[email protected]:~ $ 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 по сети — утилита USB Network Gate

Здравствуйте, товарищи-сисадмины и компьютерщики! Сегодня я сделаю небольшой обзор на одну программку, которая позволяет прокинуть USB устройства через сеть Ethernet.

Где это может быть полезным? Сложно навскидку сказать, но вот некоторые области применения:

  1. Для обмена файлами в пределах локальной сети, если есть сложности в передачи USB-накопителя или прямом расшаривании USB-накопителя.
  2. Для получения доступа к периферии (веб-камеры, мыши, клавиатуры, принтеры, сканеры).

Честно говоря, я не тестировал, как будет происходить доступ к устройствам ввода-вывода – просто нет такой возможности. Но вот на примере USB-накопителя покажу в статье. Работает вполне неплохо.

USB Network Gate

Находим на просторах Интернета программу USB Network Gate и ставим её на компьютер, который выступает в роли сервера. После запуска увидим нечто подобное (на вкладке “Локальные USB-устройства“):

Перечислен список всех наших USB-устройств. Самым нижним обозначено устройство хранения данных “Mass Storage Device“, нажмём кнопку “Открыть доступ” напротив этого пункта.

Теперь установим программу на клиентской машине, то есть на той, с которой нужно получать доступ к ресурсам сервера. Увидим следующую картину (на вкладке “Удалённые USB-устройства“):

Нажмём кнопку “Добавить сервер” и увидим окно ввода IP-адреса сервера:

Ввожу IP-адрес того узла в сети, на котором установил серверную часть в самом начале и вижу следующую картину:

Нажатие на кнопку “Подключить” приведёт к монтированию удалённого USB-устройства к локальному компьютеру:

При этом в системе появится та самая флешка, которая физически подключена совершенно в другом месте! Вот это номер. На сервере отобразится следующая картина:

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

Настройки программы для проброса USB по сети

Кроме того, на стороне сервера есть возможность задать некоторые настройки доступа для каждого из устройств:

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

Доступ по паролю работает! При попытке подключения к устройству, появилось приглашение ввести пароль:

Ну что можно сказать по этому поводу… Утилита явно неплохая, несмотря на то, что коммерческая. Довольно таки неплохо справляется со своей задачей – пробросом USB устройств по сети.

Выводы

Итак, пару слов о данной программе. Мне понравилась задумка – люблю различные решения, которые могут иногда выручить в сложной ситуации. Никогда не знаешь, где может пригодиться это, а знать, что такая возможность имеется – очень даже полезно!

Один минус – программа платная, но в ознакомительных целях использовать её ограниченную версию вполне можно, разрабы не обидятся, надеюсь.

Друзья! Вступайте в нашу группу Вконтакте, чтобы не пропустить новые статьи! Хотите сказать спасибо? Ставьте Like, делайте репост! Это лучшая награда для меня от вас! Так я узнаю о том, что статьи подобного рода вам интересны и пишу чаще и с большим энтузиазмом!

Также, подписывайтесь на наш канал в YouTube! Видео выкладываются весьма регулярно и будет здорово увидеть что-то одним из первых!

Проброс USB в виртуалку по сети средствами UsbRedir и QEMU / Хабр

На сегодняшний день существет довольно много способов пробросить USB-устройство на другой компьютер или виртуалку по сети.

Из наиболее популярных — железячные такие как AnywhereUSB и чисто програмные продукты, из тех что я попробовал сам: USB Redirector и USB/IP.

Я бы хотел рассказать вам еще об одном интересном способе, который работает непосредственно с эмулятором QEMU.

Он так же является частью проекта spice, официально поддерживаемым RedHat.

UsbRedir, это открытый протокол для проброса usb-устройств по tcp на удаленный виртуальный сервер, разработанный при поддержке RedHat в рамках проекта spice. Но как оказалось им можно вполне успешно пользоваться и без spice. В роли сервера выступает usbredirserver, который шарит usb-устройство на определенный порт, а в качестве клиента сам QEMU, который эмулирует подключение экспортированного usb-устройства в определенный usb-контроллер вашей виртуальной машины. Благодаря такому подходу в качестве гостевой системы может использоваться абсолютно любая ОС, так как она даже не знает, что устройство является проброшенным удаленно, а вся логика ложится на QEMU.

Для начала несколько слов о вышеперчисленных решениях

  • AnywhereUSB — довольно неплохое решение, но дорогое, и имеет неприятние глюки, например бывает если расшаренная флешка отваливается, то переподключить ее обратно можно только физически вынув и вставив ее.
  • USB/IP — OpenSource проект. Вроде как был заброшен. По факту глючит довольно сильно. При разрыве соединения, машина частенько уходит в полнейший freezee, а windows показывает BSOD
  • USB Redirector — Замечательная софтина. Для расшаривания устройств с linux на linux бесплатна, во всех остальных случаях уже стоит денег, не так много как AnywhereUSB, но и не бесплатно как хотелось бы 🙂

Как видно есть из чего выбрать, но давайте же наконец попробуем еще один способ — UsbRedir?

Настройка виртуальной машины

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

  • uhci — для USB1.0
  • ehci — для USB2.0
  • xhci — для USB3.0

Для qemu (без libvirt)

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

-device ich9-usb-ehci1,id=ehci,addr=1d.7,multifunction=on
-device ich9-usb-uhci1,id=uhci-1,addr=1d.0,multifunction=on,masterbus=ehci.0,firstport=0
-device ich9-usb-uhci2,id=uhci-2,addr=1d.1,multifunction=on,masterbus=ehci.0,firstport=2
-device ich9-usb-uhci3,id=uhci-3,addr=1d.2,multifunction=on,masterbus=ehci.0,firstport=4
Для libvirt

В исходном файле конфигурации виртуальной машины в узле &ltdevices&gt удаляем все USB контроллеры и добавляем следущий блок:

<controller type='usb' index='0' model='ich9-ehci1'>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x7'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci1'>
<master startport='0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x0' multifunction='on'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci2'>
<master startport='2'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x1'/>
</controller>
<controller type='usb' index='0' model='ich9-uhci3'>
<master startport='4'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x08' function='0x2'/>
</controller>

Кстати, если вы используете spice, то добавив к контроллерам еще 3 специальных девайса, станет возможен проброс usb-устройств с клиента spice на сервер.

Пример под спойлером

Для qemu

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

-chardev spicevmc,name=usbredir,id=usbredirchardev1
-device usb-redir,chardev=usbredirchardev1,id=usbredirdev1,debug=3
-chardev spicevmc,name=usbredir,id=usbredirchardev2
-device usb-redir,chardev=usbredirchardev2,id=usbredirdev2,debug=3
-chardev spicevmc,name=usbredir,id=usbredirchardev3
-device usb-redir,chardev=usbredirchardev3,id=usbredirdev3,debug=3
Для libvirt


В исходном файле конфигурации виртуальной машины в узле &ltdevices&gt добавляем следующие опции, помимо контроллеров определеных нами раньше:

<redirdev bus='usb' type='spicevmc'><address type='usb' bus='0' port='3'/></redirdev>
<redirdev bus='usb' type='spicevmc'><address type='usb' bus='0' port='4'/></redirdev>
<redirdev bus='usb' type='spicevmc'><address type='usb' bus='0' port='5'/></redirdev>
<redirdev bus='usb' type='spicevmc'><address type='usb' bus='0' port='6'/></redirdev>

Теперь все готово для осуществления проброса.

Запуск сервера

Пакет usbredirserver можно найти в стандартных репозиториях практически во всех популярных дистрибутивах linux.

Вставляем флешку в компьютер, смотрим вывод usb-устройств:

$ lsusb
...
Bus 003 Device 011: ID 125f:c82a A-DATA Technology Co., Ltd. 
...

Видим что пара vendorid:prodid равна 125f:c82a, а ядро определило флешке 003-001 usbbus-usbaddr соотвественно.

Теперь давайте расшарим ее на 4000 порт:

# Используя пару vendorid:prodid
$ usbredirserver -p 4000 125f:c82a
# Используя пару usbbus-usbaddr
$ usbredirserver -p 4000 003-011

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

Через опции при запуске ВМ

Устройство которое нужно подключить к ВМ можно указать при запуске, добавив следующие опции в команду запуска

Для qemu
-chardev socket,id=usbredirchardev1,port=4000,host=192.168.1.123
-device usb-redir,chardev=usbredirchardev1,id=usbredirdev1,bus=ehci.0,debug=4
Для libvirt

Этот блок рамещается перед тегом &lt/devices&gt, рядом с контроллерами определенными нами раньше:

<redirdev bus='usb' type='tcp'>
  <source mode='connect' host='192.168.1.123' service='4000'/>
</redirdev>

Его так же можно исполнить командой virsh attach-device

Или через qemu-monitor

Заходим на гипервизор и в qemu-monitor нашей машины выполняем следующие команды:

# Добавляем наше устройство
chardev-add socket,id=usbredirchardev1,port=4000,host=192.168.1.123
# Подключем его в ehci контроллер (USB-2.0)
device_add usb-redir,chardev=usbredirchardev1,id=usbredirdev1,bus=ehci.0,debug=4

Что бы отключить флешку достаточно такой команды:

device_del usbredirdev1

На этом все, после данных шагов ваша ВМ увидит вашу флешку и сможет с ней нативно работать.

Если устройств много и все они одинаковые

Вот тут появилась интересная задачка, как пробросить несколько одинаковых девайсов на разные ВМ?
При этом, стоит отметить, все устройства имеют одинаковую пару vendorid:prodid, а пара usbbus-usbaddr совсем не постоянна, стоит только вынуть и вставить устройство, так оно сразу поменяет свой usbaddr.

Я решил ее при помощи udev.

Кстати если вы не совсем понимаете как работает udev, на Debian Wiki есть классная статья о udev

И так приступим

Для начала нам надо узнать серийник нашего устройства, по которому и будем идентифицировать его в udev:

Запустим udev-монитор:

$ udevadm monitor --environment --udev

И вставим наше устройство, после этого мы сразу увидим список переменных этого устройства которые udev любезно инициализировал для нас:

...
UDEV  [189056.151508] add      /devices/virtual/bdi/8:16 (bdi)
ACTION=add
DEVPATH=/devices/virtual/bdi/8:16
ID_SERIAL_SHORT=11C130317234004B
SEQNUM=4352
SUBSYSTEM=bdi
USEC_INITIALIZED=189056149826
...

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

$ udevadm info -a -n /dev/bus/usb/003/011 | grep '{serial}'

Теперь создадаим файл /etc/udev/rules.d/99-usb-serial.rules и запишем в него следующие правила:

ACTION=="add", ENV{ID_SERIAL_SHORT}="11C130317234004B", RUN+="/usr/bin/usbredirserver -p 4000 $attr{busnum}-$attr{devnum}"
ACTION=="remove", ENV{ID_SERIAL_SHORT}="11C130317234004B", RUN+="/usr/bin/fuser -k 4000/tcp"

Перезагрузим udev-правила:

$ udevadm control --reload-rules

Готово, теперь при подключении нашего устройства, оно будет автоматически шарится на нужный нам порт, а при отключении usbredirserver будет прекращать свою работу.
По аналогии добавляем и остальные устройства.

На этом все. Спасибо за проявленный интерес 🙂

UPD: Тем кому интересно, что из этого в итоге получилось, можете посмотреть здесь

Источники:

umvirt.ru/node/82
opennebula.org/opennebula-for-virtual-desktops
opennet.ru/opennews/art.shtml?num=30773
lists.gnu.org/archive/html/qemu-devel/2013-07/msg05244.html
askubuntu.com/questions/49910/how-to-distinguish-between-identical-usb-to-serial-adapters
bugzilla.redhat.com/show_bug.cgi?id=805172#c26

Проброс USB устройств по сети при помощи USBIP

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

Как оказалось, уже давно созданы как программы, так и отдельные железки, позволяющие пробросить любое USB устройство по сети, но цена коммерческого решения оказалась несколько великоватой — в магазине нам озвучили цену за мультихостовый девайс 1000 долларов, и жать его поставки Украину нужно будет три недели. Поэтому было решено попробовать решить задачу, используя бесплатное ршение USBIP, процедуру установки и настройки которого я и рассмотрю в данном материале.

Программа USBIP позволяет подключать USB устройства по сети, будь то Windows или Linux клиент. К сожалению данный проект не так активно развивается, как хотелось-бы, но спасибо разработчикам и за то что есть — продукт вполне рабочий, исходники есть, так что если у вас есть силы и желание — помогите проекту, а не можете, или не хотите помогать — пользуйтесь тем что есть, или покупайте коммерческие более функциональные продукты.

Итак, давайте рассмотрим по порядку процесс настройки и проброса USB устройств по сети при помощи USBIP.

Установка Linux

Для настройки серверной части USBIP, понадобится установить Linux. Разработчики проекта ограничились написанием серверной части только для Linux. Клиентская часть есть как для Linux, так и для Windows.

В даной статье я буду устанавливать Debian 7.9, так как после долгих разбирательств удалось получить рабочее решение на базе Дебиана, а дальше тратить время не было возможности, потому остановился на том что есть. Раассказывать как устанавливать Linux не буду, есели вы интересуетесь вопросом проброса USB устройств по сети на базе USBIP, процедура установки Linux должна быть для вас также прозрачна. В случае, если ищете решение, устанавливаемое нажатием пары кнопок мыши, следует повернуть свой взор в сторону платных продуктов, но там уже нужно платить денежки.

Установка сервера USBIP

Обновляем систему, устанавливаем пакет USBIP и загружаем модули ядра, необходимые для работы программы:

sudo apt-get update && sudo apt-get dist-upgrade -y

sudo apt-get install usbip -y

sudo modprobe usbip-core
sudo modprobe usbip-host

Теперь, нужно сделать так, чтоб эти модули загружаилсь при старте системы. В файл /etc/modules и добавьте две строчки, по одной для каждого загружаемого модуля:

sudo echo "usbip-core" >> /etc/modules
sudo echo "usbip-host" >> /etc/modules

Для того, чтоб после запуска системы сервер USBIP стартовал автоматом, нужно добавить init.d скрипт. Для этого скопируйте файл /etc/init.d/skeleton:

sudo cp /etc/init.d/skeleton /etc/init.d/usbipd

Далее отредактируйте файл /etc/init.d/usbipd, поменяйте параметры описание, имя демона и аргументы, как приведено ниже:

DESC="usbip service"
NAME=usbipd
DAEMON_ARGS="-D"

Сделайте файл исполняемым:

sudo chmod 755 /etc/init.d/usbipd

Ну и на последок запустите команду update-rc.d, после чего usbip готов для атоматического запуска. Запускаем программу:

sudo update-rc.d usbipd defaults
sudo /etc/init.d/usbipd start

Если нет ошибок, то все настроено правильно и сервер готов расшаривать USB девайсы

Список доступных к расшариванию устройств можно посмотреть выполнив команду usbip list -l. Параметр -l говорит программе, что нужно вывести локальные устройства. Программа должна вернуть список устройтв следующего вида:

[email protected]:~$ sudo usbip list -l
Local USB devices
=================
 - busid 1-4 (8564:1000)
         1-4:1.0 -> usb-storage

Если устройств перечислено несколько, определите какое именно устройство вам нужно проброить по сети и запомите его идентификатор, в моем случае, мне нужно пробросить устройство с идентификатором 1-4. Далее, выполняем команду:

[email protected]:~$ sudo usbip bind -b 1-4
bind device on busid 1-4: complete

Если в результате программа в конце написала : complete, и не вернула вам никаких сообщений об ошибках — устройство успешно расшарено и теперь к нему можно получить доступ с любого компьютера, на котором установлен USBIP клиент.

Если на вашем компьютере настроена фильтрация пакетов, то добавьте порт 3240 в разрешенные для подключения извне:

iptables -I INPUT -p tcp -m tcp --dport 3240 -j ACCEPT

Вот и все. Серверная часть настроена. Теперь будет самое интересное — подключить к серверу клиента и увидеть флешку, воткнутую в удаленном компьютер, но отображаемую, как будто она подключена непосредственно к вашему компьютеру.

Установка USBIP клиента под Windows

Откройте странцу USBIP на  сайте Sourceforge, и загрузите клиент USBIP последней версии. Распакуйте содержимое архива, например в папку c:\usbip

Установка драйвера.

Откройте диспетчер устройств, выберите корневой элемент дерева, нажмите правой кнопкой мыши и в контекстном меню выберите пункт Установить старое устройство.

Первый шаг пропускаем

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

Следующий шаг пропускаем, просто нажимаем Далее

На следующем шаге нажимаем кнопку Установить с диска, выбираем файл драйвера устройства USBIPEnum.inf.

В итоге видим драйвер USB/IP Enumerator, выбираем его и нажимаем кнопку Далее

Соглашаемся с предложением установить новое оборудование и нажимаем кнопку Далее.

На вопрос об установке программного обеспечения отвечаем утвердительно, дожидаемся завершения работы мастера, и нажимем кнопку Готово.

В Диспетчере устройств появилось новое системное устройство USB/IP Enumerator.

После установки драйвера, нужно загрузить еще один архивчик. Я столкнулся с проблемой, что при попытке подключения к серверу, выдается ошибка, сообщающая об отличии версий клиента и сервера. В процессе поиска решения проблемы, вот здесь на форуме, я нашел что один хороших человек выложил ссылку на архив, в котором лежит скомпилированный usbip.exe правильной версии, подключаясь с помощью которого к серверу никаких ошибок не выдается.
Может со временем, если дойдут руки, я попробую сам скомпилировать загруженный проект, но сейчас времени нет разбираться со всеми зависимостями и буду пользоваться тем что есть.

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

Открываем командную строку, устанавливаем текущей директорию, c:\usbip. Если выполнить команду без параметров, будет выведена справка.

PS C:\> cd C:\usbip\

PS C:\usbip> .\usbip.exe
usbip for windows ($Id$)

Usage: C:\usbip\usbip.exe [options]
        -a, --attach [host] [bus_id]
                Attach a remote USB device.

        -x, --attachall [host]
                Attach all remote USB devices on the specific host.

        -d, --detach [ports]
                Detach an imported USB device.

        -l, --list [hosts]
                List exported USB devices.

        -p, --port
                List virtual USB port status.

        -D, --debug
                Print debugging information.

        -v, --version
                Show version.

        -h, --help
                Print this help.

Запрашиваем список расшаренных USB устройств на удаленном компьютере. Для этого нужно запустить usbip.exe с параметром -l, —list [адрес-хоста]:

PS C:\usbip> .\usbip.exe -l 10.125.2.28
usbip for windows ($Id$)

- 10.125.2.28
     1-4: unknown vendor : unknown product (8564:1000)
        : /sys/devices/pci0000:00/0000:00:1a.7/usb1/1-4
        : (Defined at Interface level) (00/00/00)
        :  0 - unknown class / unknown subclass / unknown protocol (08/06/50)

PS C:\usbip>

Видим устройство 1-4, расшаенное ранее. Теперь, чтоб его подключить нужно запустить usbip.exe с параметром -a, —attach [адрес-хоста] [id устройства]

PS C:\usbip> .\usbip.exe -a 10.125.2.28 1-4
usbip for windows ($Id$)

new usb device attached to usbvbus port 1

Receive sequence:    8100

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

В результате устройство будет отображено у вас в системе и с ним можно работать как с обычным локальным устройством.

Если у вас есть замечания, или дополнения к материалу — буду рад, если поделитесь ими в комметариях.

Укрощаем USB/IP / Хабр

Регулярно возникает задача подключения USB-устройства к удаленному ПК через локальную сеть. Под катом изложена история моих поисков в этом направлении, и путь к готовому решению на базе open-source проекта USB/IP с описанием заботливо установленных различными людьми на этом пути препятствий, а также способов их обхода.

Часть первая, историческая

Если машина виртуальная — всё это несложно. Функционал проброса USB от хоста в виртуалку появился еще в VMWare 4.1. Но в моём случае ключик защиты, опознающийся как WIBU-KEY, нужно было в разное время подключать к разным машинам, и не только виртуальным.
Первый виток поиска в далеком 2009-м году привел меня к железке под названием TrendNet TU2-NU4
Плюсы:

  • иногда даже работает

Минусы:

  • работает не всегда. Допустим, ключ защиты Guardant Stealth II через неё не заводится, ругаясь ошибкой «устройство не может быть запущено».
  • ПО для управления (читай — монтирования и размонтирования USB-устройств) убого до крайности. Ключи командной строки, автоматизация — не, не слышали. Всё только руками. Кошмар.
  • управляющее ПО ищет саму железку в сети широковещанием, поэтому работает это только в пределах одного broadcast-сегмента сети. Указать IP-адрес железки руками нельзя. Железка в другой подсети? Тогда у вас проблема.
  • разработчики забили на устройство, слать баг-репорты бесполезно.

Второй виток случился во времена уже не столь отдаленные, и привел меня к теме статьи — USB/IP project. Привлекает открытостью, тем более, что ребята из ReactOS подписали им драйвер для Windows, так что теперь даже на x64 всё работает без всяких костылей вроде тестового режима. За что команде ReactOS огромное спасибо! Звучит всё красиво, попробуем пощупать, так ли оно на деле? К сожалению, сам проект тоже подзаброшен, и на поддержку рассчитывать не приходится — но где наша не пропадала, исходник есть, разберемся!

Часть вторая, серверно-линуксовая

Сервер USB/IP, расшаривающий USB-девайсы по сети, может быть поднят только в Linux-based OS. Ну что ж, линукс так линукс, устанавливаем на виртуалку Debian 8 в минимальной конфигурации, стандартное движение руками:

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

Установились. Дальше интернет подсказывает, что нужно бы загрузить модуль usbip, но — здравствуйте, первые грабли. Нет такого модуля. А всё оттого, что большинство руководств в сети относятся к более старой ветке 0.1.x, а в крайней 0.2.0 модули usbip имеют другие названия.

Поэтому:

sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip

Ну и добавим в /etc/modules такие строки, чтобы загружать их автоматически при старте системы:

usbip-core
usbip-host
vhci-hcd

Запустим сервер usbip:

sudo usbipd -D

Дальше всемирный разум нам подсказывает, что в комплекте с usbip идут скрипты, позволяющие нам управлять сервером — показать, какое устройство он будет расшаривать по сети, посмотреть статус, и так далее. Тут нас поджидает еще один садовый инструмент — эти скрипты в ветке 0.2.x, опять же, переименованы. Получить список команд можно с помощью

sudo usbip

Почитав описание команд, становится понятно, что для того, чтобы расшарить требуемый USB-девайс, usbip хочет узнать его Bus ID. Уважаемые зрители, на арене грабли номер три: тот Bus ID, который выдаст нам lsusb (казалось бы, самый очевидный путь) — ей не подходит! Дело в том, что железки вроде USB-хабов usbip игнорирует. Поэтому, воспользуемся встроенной командой:

[email protected]:~$ sudo usbip list -l
 - busid 1-1 (064f:0bd7)
   WIBU-Systems AG : BOX/U (064f:0bd7)

Примечание: здесь и далее в листингах я буду всё описывать на примере моего конкретного USB-ключа. Ваши название железки и пара VID:PID могут и будут отличаться. Моя называется Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Теперь мы можем расшарить наше устройство:

[email protected]:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete

Ура, товарищи!

[email protected]:~$ sudo usbip list -r localhost
Exportable USB devices
======================
 - localhost
        1-1: WIBU-Systems AG : BOX/U (064f:0bd7)
           : /sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
           : Vendor Specific Class / unknown subclass / unknown protocol (ff/00/ff)

Троекратное ура, товарищи! Сервер расшарил железку по сети, и мы можем её подключать! Осталось только дописать автозапуск демона usbip в /etc/rc.local

usbipd -D

Часть третья, клиентская и запутанная

Подключить расшаренное устройство по сети к машине под управлением Debian я попробовал сразу же на том же сервере, и всё прекрасно подключилось:

sudo usbip attach --remote=localhost --busid=1-1

Переходим к Windows. В моем случае это был Windows Server 2008R2 Standard Edition. Официальное руководство просит сначала установить драйвер. Процедура прекрасно описана в прилагаемом к windows-клиенту readme, делаем всё как написано, всё получается. На XP тоже работает без каких-либо трудностей.

Распаковав клиент, пробуем примонтировать наш ключик:

C:\Program Files\USB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip err: usbip_windows.c: 756 (query_interface0) recv op_common
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

Ой-ой. Что-то пошло не так. Используем навык гугла. Встречаются отрывочные упоминания, что что-то там не так с константами, в серверной части разработчики при переходе на версию 0.2.0 изменили версию протокола, а вот в клиенте под Win сделать это забыли. Предлагаемое решение — поменяйте константу в исходнике и пересоберите клиент.

Вот только очень мне не хочется качать Visual Studio ради этой процедуры. Зато у меня есть старый-добрый Hiew. В исходнике константа объявлена как двойное слово. Поищем в файле 0х00000106, заменяя на 0х00000111. Не забываем, порядок байт обратный. Итог — два совпадения, патчим:

[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11

Ииии… да!

C:\Program Files\USB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1

На этом можно было бы закончить изложение, но музыка играла недолго. Перезагрузив сервер, я обнаружил, что устройство на клиенте не монтируется!

C:\Program Files\USB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

И всё. На это мне не смог ответить даже всезнающий гугл. А при этом команда отобразить доступные на сервере устройства вполне корректно показывает — вот он, ключ, можете монтировать. Пробую примонтировать из-под Linux — работает! А если теперь попробовать из-под Windows? О ужас — это работает!

Грабли последние: что-то там в коде сервера не дописано. При расшаривании устройства он не считывает с него количество USB-дескрипторов. А при монтировании устройства из-под Linux, это поле заполняется. К сожалению, с разработкой под Linux я знаком на уровне «make && make install». Поэтому проблема решена с помощью довольно грязного хака — добавлением в /etc/rc.local

usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00

Часть заключительная

После некоторых мытарств, это работает. Желаемое получено, теперь ключ можно примонтировать к любому ПК (и размонтировать, конечно же, тоже), в том числе — за пределами широковещательного сегмента сети. Если хочется — можно это сделать с помощью скрипта командной оболочки. Что приятно — удовольствие абсолютно бесплатное.
Надеюсь, что мой опыт поможет хабражителям обойти те грабли, которые отпечатались у меня на лбу. Спасибо за внимание!

Проброс USB устройств по сети при помощи USBIP

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

Как оказалось, уже давно созданы как программы, так и отдельные железки, позволяющие пробросить любое USB устройство по сети, но цена коммерческого решения оказалась несколько великоватой — в магазине нам озвучили цену за мультихостовый девайс 1000 долларов, и жать его поставки Украину нужно будет три недели. Поэтому было решено попробовать решить задачу, используя бесплатное ршение USBIP, процедуру установки и настройки которого я и рассмотрю в данном материале.

Программа USBIP позволяет подключать USB устройства по сети, будь то Windows или Linux клиент. К сожалению данный проект не так активно развивается, как хотелось-бы, но спасибо разработчикам и за то что есть — продукт вполне рабочий, исходники есть, так что если у вас есть силы и желание — помогите проекту, а не можете, или не хотите помогать — пользуйтесь тем что есть, или покупайте коммерческие более функциональные продукты.

Итак, давайте рассмотрим по порядку процесс настройки и проброса USB устройств по сети при помощи USBIP.

Установка Linux

Для настройки серверной части USBIP, понадобится установить Linux. Разработчики проекта ограничились написанием серверной части только для Linux. Клиентская часть есть как для Linux, так и для Windows.

В даной статье я буду устанавливать Debian 7.9, так как после долгих разбирательств удалось получить рабочее решение на базе Дебиана, а дальше тратить время не было возможности, потому остановился на том что есть. Раассказывать как устанавливать Linux не буду, есели вы интересуетесь вопросом проброса USB устройств по сети на базе USBIP, процедура установки Linux должна быть для вас также прозрачна. В случае, если ищете решение, устанавливаемое нажатием пары кнопок мыши, следует повернуть свой взор в сторону платных продуктов, но там уже нужно платить денежки.

Установка сервера USBIP

Обновляем систему, устанавливаем пакет USBIP и загружаем модули ядра, необходимые для работы программы:

sudo apt-get update && sudo apt-get dist-upgrade -y

sudo apt-get install usbip -y

sudo modprobe usbip-core
sudo modprobe usbip-host

Теперь, нужно сделать так, чтоб эти модули загружаилсь при старте системы. В файл /etc/modules и добавьте две строчки, по одной для каждого загружаемого модуля:

sudo echo "usbip-core" >> /etc/modules
sudo echo "usbip-host" >> /etc/modules

Для того, чтоб после запуска системы сервер USBIP стартовал автоматом, нужно добавить init.d скрипт. Для этого скопируйте файл /etc/init.d/skeleton:

sudo cp /etc/init.d/skeleton /etc/init.d/usbipd

Далее отредактируйте файл /etc/init.d/usbipd, поменяйте параметры описание, имя демона и аргументы, как приведено ниже:

DESC="usbip service"
NAME=usbipd
DAEMON_ARGS="-D"

Сделайте файл исполняемым:

sudo chmod 755 /etc/init.d/usbipd

Ну и на последок запустите команду update-rc.d, после чего usbip готов для атоматического запуска. Запускаем программу:

sudo update-rc.d usbipd defaults
sudo /etc/init.d/usbipd start

Если нет ошибок, то все настроено правильно и сервер готов расшаривать USB девайсы

Список доступных к расшариванию устройств можно посмотреть выполнив команду usbip list -l. Параметр -l говорит программе, что нужно вывести локальные устройства. Программа должна вернуть список устройтв следующего вида:

[email protected]:~$ sudo usbip list -l
Local USB devices
=================
 - busid 1-4 (8564:1000)
         1-4:1.0 -> usb-storage

Если устройств перечислено несколько, определите какое именно устройство вам нужно проброить по сети и запомите его идентификатор, в моем случае, мне нужно пробросить устройство с идентификатором 1-4. Далее, выполняем команду:

[email protected]:~$ sudo usbip bind -b 1-4
bind device on busid 1-4: complete

Если в результате программа в конце написала : complete, и не вернула вам никаких сообщений об ошибках — устройство успешно расшарено и теперь к нему можно получить доступ с любого компьютера, на котором установлен USBIP клиент.

Если на вашем компьютере настроена фильтрация пакетов, то добавьте порт 3240 в разрешенные для подключения извне:

iptables -I INPUT -p tcp -m tcp --dport 3240 -j ACCEPT

Вот и все. Серверная часть настроена. Теперь будет самое интересное — подключить к серверу клиента и увидеть флешку, воткнутую в удаленном компьютер, но отображаемую, как будто она подключена непосредственно к вашему компьютеру.

Установка USBIP клиента под Windows

Откройте странцу USBIP на  сайте Sourceforge, и загрузите клиент USBIP последней версии. Распакуйте содержимое архива, например в папку c:\usbip

Установка драйвера.

Откройте диспетчер устройств, выберите корневой элемент дерева, нажмите правой кнопкой мыши и в контекстном меню выберите пункт Установить старое устройство.

Первый шаг пропускаем

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

Следующий шаг пропускаем, просто нажимаем Далее

На следующем шаге нажимаем кнопку Установить с диска, выбираем файл драйвера устройства USBIPEnum.inf.

В итоге видим драйвер USB/IP Enumerator, выбираем его и нажимаем кнопку Далее

Соглашаемся с предложением установить новое оборудование и нажимаем кнопку Далее.

На вопрос об установке программного обеспечения отвечаем утвердительно, дожидаемся завершения работы мастера, и нажимем кнопку Готово.

В Диспетчере устройств появилось новое системное устройство USB/IP Enumerator.

После установки драйвера, нужно загрузить еще один архивчик. Я столкнулся с проблемой, что при попытке подключения к серверу, выдается ошибка, сообщающая об отличии версий клиента и сервера. В процессе поиска решения проблемы, вот здесь на форуме, я нашел что один хороших человек выложил ссылку на архив, в котором лежит скомпилированный usbip.exe правильной версии, подключаясь с помощью которого к серверу никаких ошибок не выдается.
Может со временем, если дойдут руки, я попробую сам скомпилировать загруженный проект, но сейчас времени нет разбираться со всеми зависимостями и буду пользоваться тем что есть.

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

Открываем командную строку, устанавливаем текущей директорию, c:\usbip. Если выполнить команду без параметров, будет выведена справка.

PS C:\> cd C:\usbip\

PS C:\usbip> .\usbip.exe
usbip for windows ($Id$)

Usage: C:\usbip\usbip.exe [options]
        -a, --attach [host] [bus_id]
                Attach a remote USB device.

        -x, --attachall [host]
                Attach all remote USB devices on the specific host.

        -d, --detach [ports]
                Detach an imported USB device.

        -l, --list [hosts]
                List exported USB devices.

        -p, --port
                List virtual USB port status.

        -D, --debug
                Print debugging information.

        -v, --version
                Show version.

        -h, --help
                Print this help.

Запрашиваем список расшаренных USB устройств на удаленном компьютере. Для этого нужно запустить usbip.exe с параметром -l, —list [адрес-хоста]:

PS C:\usbip> .\usbip.exe -l 10.125.2.28
usbip for windows ($Id$)

- 10.125.2.28
     1-4: unknown vendor : unknown product (8564:1000)
        : /sys/devices/pci0000:00/0000:00:1a.7/usb1/1-4
        : (Defined at Interface level) (00/00/00)
        :  0 - unknown class / unknown subclass / unknown protocol (08/06/50)

PS C:\usbip>

Видим устройство 1-4, расшаенное ранее. Теперь, чтоб его подключить нужно запустить usbip.exe с параметром -a, —attach [адрес-хоста] [id устройства]

PS C:\usbip> .\usbip.exe -a 10.125.2.28 1-4
usbip for windows ($Id$)

new usb device attached to usbvbus port 1

Receive sequence:    8100

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

В результате устройство будет отображено у вас в системе и с ним можно работать как с обычным локальным устройством.

Если у вас есть замечания, или дополнения к материалу — буду рад, если поделитесь ими в комметариях.

Проброс USB устройств по локальной сети

Иногда возникает необходимость проброса физических USB устройств в виртуальную машину. Для того чтобы это сделать проще всего воспользоваться сетью так как поддержка сети есть в каждом гипервизоре. Некоторые гипервизоры предоставляют инструментарий для проброса локальных USB-устройств а, что делать если USB-устройство подключены к другому компьютеру? Может помочь только проброс USB-устройств по сети.

Существует два варианта решения:

  1. Использование аппаратного USB сервера
  2. Использование программного USB сервера

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

Внимание: Самое главное при использовании любого USB сервера — это совместимость операционной системы с USB-сервером.

Проброс устройств через программный USB-сервер USB/IP

Адрес проекта: http://usbip.sourceforge.net/

Настройка сервера
Для того чтобы пробросить устройство через USB/IP нужно иметь компьютер под управлением ОС Linux и возможность выполнять команды от имени root. Рассмотрим создание сервера на примере Ubuntu.

Устанавливаем пакет
# apt-get install usbip
Подключаем модули ядра
# modprobe usbip
# modprobe usbip_common_mod

Запускаем сервер
# usbipd -D
Получаем список имен USB устройств и запоминаем их usbid
# lsusb
Получаем состояние устройств и запоминаем busid
# usbip_bind_driver --list
Подключаем доступ к устройству через busid
# usbip_bind_driver --usbip 1-6
Отключаем доступ к устройству через busid
# usbip_bind_driver --other 1-6

Настройка Linux-клиента

Для получения доступа к USB устройству через USBIP потребуется получение root-доступа.

Устанавливаем пакет
# apt-get install usbip
Подключаем модуль ядра
# modprobe vhci-hcd
Получаем список устройств на сервере
# usbip -l 192.168.1.1
Подключаем устройство и запоминаем номер виртуального порта
# usbip -a 192.168.1.1 1-6
Отключение осуществляем по номеру виртуального порта
# usbip -d 1

Настройка Windows-клиента

Загружаем дистрибутив клиента под Windows c сайта проекта. Устанавливаем драйвер клиента как новое системное устройство.

Получаем список устройств
usbip.exe -l 192.168.1.1
Подключаем устройство
usbip.exe -a 192.168.1.1 1-6

Источник

Перенаправление последовательных и USB-портов по сети в openHAB — Учебники и примеры

Как и было обещано, вот руководство по перенаправлению последовательных или USB-портов в openHAB. Это руководство является результатом моих усилий по использованию Bluetooth-привязки Влада Колотова (спасибо @vkolotov) для моих датчиков растений MiFlora.

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

Для решения этой проблемы существует два решения, в зависимости от задачи, которые кратко представлены ниже. Возможным решением для последовательных портов является комбинация ser2net и socat, а для USB-портов — usbip.

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

Я использую Raspberry Pi первого поколения с DietPi в качестве ОС для сервера (который поставляется с адаптером). И openhab работает на Raspberry Pi 3 с SSD и вручную установленными openHabian и Raspbian Stretch (Престижность @ThomDietrich)

Решение 1: USBIP для непоследовательных портов USB
В отличие от комбинации ser2net / socat, это решение можно использовать для любого порта USB. Недостаток: мне удалось запустить его на сервере (тот, который с адаптером), но еще не на сайте openHAB (клиент).

Руководство основано на записи блога «Linux, RPi и USB через IP» Петра Круля и здесь немного сокращено.

Erste Schritt ist das Aufsetzen des Servers, демонстрационный USB-адаптер angeschlossen ist. Hierzu muss zunächst usbip installiert werden. Мы опускаем проверку, подготовлено ли ядро ​​к этому, так как это обычно имеет место в текущих ядрах

.

  sudo apt установить usbip
  

Затем запускается демон usbip, идентифицируется и используется соответствующий USB-адаптер.

  sudo modprobe usbip-ядро
sudo modprobe usbip-host
sudo usbipd -D
  

Теперь мы можем отобразить USB-адаптеры.

  пользователь @ сервер: ~ $ usbip list -l
 - busid 1-1.1 (0424: ec00)
   Standard Microsystems Corp.: SMSC9512 / 9514 Fast Ethernet Adapter (0424: ec00)

 - busid 1-1.3 (0a12: 0001)
   Cambridge Silicon Radio, Ltd: Bluetooth-ключ (режим HCI) (0a12: 0001)
  

Тот, который мы ищем, имеет идентификатор шины 1-1.-3 и является адаптером Bluetooth.С помощью привязки он связывается и используется в сети.

  sudo usbip --debug bind -b 1-1.3
  

А теперь мы подошли к стороне клиента, к серверу openhab. Здесь тоже должен быть установлен usbip. После этого мы можем проверить, виден ли наш включенный адаптер. IP-адрес следует заменить на IP-адрес вашего сервера.

  sudo usbip list -r 
  

результат команды list должен быть примерно таким.

  Экспортные USB-устройства
======================
 - 10.42.42.205
      1-1.3: Cambridge Silicon Radio, Ltd: Bluetooth-ключ (режим HCI) (0a12: 0001)
           : /sys/devices/platform/soc/20980000.usb/usb1/1-1/1-1.3
           : Беспроводная связь / Радиочастота / Bluetooth (e0 / 01/01)
  

Адаптер Bluetooth теперь доступен в сети и может быть интегрирован с помощью следующих команд. Внимание: на Raspberry мне не удалось интегрировать адаптер.

  sudo modprobe vhci-hcd
sudo usbip attach -r  -b 1-1.3
  

Для удаления соединения см. Вышеупомянутую статью блога «Linux, RPi и USB over IP обновлены»

Решение 2: ser2net и socat для последовательных портов USB
Если теперь у вас есть адаптер USB, который выглядит как последовательный интерфейс, например адаптер Bluetooth от BlueGiga или адаптер Z-Wave, такой как от Aeotech, решением может быть комбинация ser2net и socat.

ser2net устанавливается на сервере и использует последовательный порт в сети, а socat устанавливается на клиенте и обеспечивает там интерфейс.

Руководство по сути представляет собой сборник различных сообщений и ваших собственных исследований. Поэтому слава @snoekieboe, @snackboards, 2devnull

Как и в случае с решением usbip, мы начинаем с сервера. Мой сервер — Raspberry 1 с DietPi () и адаптером Bluetooth BlueGiga.

Сначала проверяем, работает ли адаптер. Для этого есть сценарий Python от BlueGiga, который запрашивает адаптер.

  apt установить python-serial
wget https://raw.github.com/jrowberg/bglib/master/Python/Examples/bled112_scanner.ру
chmod + x ./bled112_scanner.py
./bled112_scanner.py
  

Если вывод как-то так выглядит, значит адаптер уже работает.

  пользователь @ сервер: ~ $ ./bled112_scanner.py -p / dev / ttyACM0
================================================== ==============
BLED112 Сканер для Python v2013-04-07
================================================== ==============
Последовательный порт: / dev / ttyACM0
Скорость передачи: 115200
Интервал сканирования: 200 (250,00 мс)
Окно сканирования: 200 (250,00 мс)
Тип сканирования: пассивное
Фильтры UUID: Нет
MAC-фильтр (-ы): Нет
Фильтр RSSI: Нет
Поля отображения: - Время
                - RSSI
                - Тип пакета
                - MAC отправителя
                - Тип адреса
                - Статус облигации
                - Данные полезной нагрузки
Дружественный режим: отключен
-------------------------------------------------- --------------
Запуск сканирования рекламы BLE...
1529261718.724 -90 2 11880C3159C7 1255 1EFF0600010920029D1D359B9D58E977F053975C0B48A5A2756C7CD8B470DB
1529261718.837 -87 2 11880C3159C7 1255 1EFF0600010920029D1D359B9D58E977F053975C0B48A5A2756C7CD8B470DB
1529261719.129 -90 2 11880C3159C7 1 255 1EFF0600010920029D1D359B9D58E977F053975C0B48A5A2756C7CD8B470DB
1529261719.185 -87 0 DCD93522D048 1 255 0201060302AFFE06094E30305558
1529261719.244 -87 2 11880C3159C7 1 255 1EFF0600010920029D1D359B9D58E977F053975C0B48A5A2756C7CD8B470DB
1529261719.290 -62 0 FB45E00C3C13 1 255 0201060302AFFE06094E30343130
1529261719.554-87 2 11880C3159C7 1 255 1EFF0600010920029D1D359B9D58E977F053975C0B48A5A2756C7CD8B470DB
1529261719.622 -85 0 C47C8D65B8A1 0255 020106030295FE141695FE71209800BEA1B8658D7CC40D0910026208
  

Нет вывода или сообщение об ошибке? По умолчанию в качестве порта используется / dev / ttyACM0. Если это неверный вариант, его можно указать в командной строке.

  ./bled112_scanner.py -p / dev / ttyACM0
  

Затем желаемый последовательный порт становится доступным в сети с помощью инструмента ser2net.Для этого сначала необходимо установить ser2net.

  sudo apt установить ser2net
  

Затем отредактируйте файл конфигурации.

  судо нано /etc/ser2net.conf
  

, а затем добавьте линет следующим образом.

  3001: raw: 600: / dev / ttyACM0: 115200 8DATABITS NONE 1STOPBIT
  

Все остальные строки закомментированы. Затем эта линия используется, чтобы сделать наш последовательный порт доступным в сети через порт 3001. Если хотите, вы также можете попробовать более высокую скорость, чем 115200 бод.После сохранения перезапустите службу.

  перезапуск службы ser2net
  

С помощью netstat вы можете увидеть, прослушивает ли ser2net на порту 3001 соединение.

  netstat -antp
  

А теперь мы подошли к стороне клиента, к серверу openhab. Клиент настраивается не так быстро, как сервер. Сначала необходимо установить пакет socat.

  sudo apt установить socat
  

Теперь следует конфигурация, так что мы можем легко интегрировать несколько общих портов.Последовательный порт должен быть доступен в / dev / ttyNET0. Сначала создаем служебный файл

  судо нано /etc/systemd/system/[email protected]
  

Контент должен выглядеть так.

  [Единица]
Описание = Многоцелевое реле (SOcket CAT)
После = network.target
StartLimitIntervalSec = 0
StartLimitBurst = 3000

[Обслуживание]
Перезагрузка = всегда
RestartSec = 3
EnvironmentFile = / etc / default / socat-% i.conf
Тип = простой
PIDFile = / var / run / socat-% i.pid
ExecStart = / usr / bin / socat -L / var / run / socat-% i.pid $ SOCAT_DEFAULTS $ SOCAT_CONNECTION
ExecStop = / bin / kill -SIGKILL $ MAINPID

[Установить]
WantedBy = multi-user.target
  

После сохранения конфигурация перезагружается

  systemctl демон-перезагрузка
  

Теперь идет файл конфигурации для последовательного устройства / dev / ttyNET0

  судо нано /etc/default/socat-ttyNET0.conf
  

Контент должен выглядеть так.

  SOCAT_DEFAULTS = -d -d -s -lf /var/log/socat.log

SOCAT_CONNECTION = pty, link = / dev / ttyNET0, raw, user = openhab, group = dialout, mode = 777 tcp: : 
  

Вы должны заменить IP-адрес и порт на IP-адрес сервера и соответствующий порт, а также включить и запустить его после сохранения для запуска системы.

  systemctl включить socat @ ttyNET0
systemctl start socat @ ttyNET0
  

Теперь то же самое можно повторить с широкими конфигурациями, пока не будут подключены все удаленные интерфейсы. С помощью скрипта BlueGiga вы можете проверить на клиенте, поступают ли данные в новый интерфейс.

Теперь новый последовательный интерфейс доступен на сервере openHAB, но еще не хватает двух шагов для его использования в openHAB. На первом этапе последовательный порт должен быть встроен в параметры службы openhab, чтобы Java могла получить к нему доступ.

  судо нано / и т. Д. / По умолчанию / openhab2
  

Отрегулируйте EXTRA_JAVA_OPTS соответственно

  EXTRA_JAVA_OPTS = "- Dgnu.io.rxtx.SerialPorts = / dev / ttyUSB0: / dev / ttyS0: / dev / ttyS2: / dev / ttyACM0: / dev / ttyAMA0: / dev / ttyNET0"
  

Затем вам нужно войти в консоль Karaf (см. Также документацию openHAB) и установить последовательный транспорт. Просто введите следующее.

  особенность: установить openhab-transport-serial
выйти
  

И, наконец, необходимо перезапустить openHAb.Остались уловки с правилами udev, но я их еще не реализовал.

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

Томас

.

USB через IP. Совместное использование USB-устройства через TCP / IP во всех операционных системах

Термин TCP / IP знаком большинству пользователей компьютеров. Он означает протокол управления передачей (TCP) и Интернет-протокол (IP), которые представляют собой два разных сетевых протокола, которые часто используются вместе. TCP / IP формирует основу сетей, которые люди используют каждый день для выхода в Интернет, общения с другими через социальные сети и игры в онлайн-игры.Веб-браузеры взаимодействуют с веб-сайтами с помощью протоколов TCP / IP.

Мы собираемся показать вам, как вы можете совместно использовать USB через IP с помощью специализированного коммуникационного программного обеспечения. USB Network Gate обеспечивает удаленный доступ к USB-устройствам с любого компьютера, подключенного к сети. Загрузите программное обеспечение в выбранную операционную систему и выполните действия, описанные ниже, для совместного использования USB-устройств через Интернет или любую сеть TCP / IP.

Содержание:

  1. Основные принципы совместного использования USB-устройств
  2. USB через IP [ОС Windows]
  3. USB через IP [Mac OS]
  4. USB через IP [ОС Linux]
  5. USB через IP [Android]
  6. Настройка дополнительных параметров [для всех платформ]

Основные принципы совместного использования USB-устройства

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

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

Внешний IP-адрес необходим при совместном использовании USB через TCP / IP. Это позволяет видеть устройства и получать к ним доступ с других машин.

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

.

USB через Ethernet — полный список программного обеспечения 2019

Лучшие возможности USB Network Gate

  • Приложение позволяет легко обмениваться данными и получать доступ к USB-устройствам через Ethernet не только в Windows, но и в Mac, Linux и ОС Android. Будучи кроссплатформенной, эта программа позволяет использовать периферийные USB-устройства для разных платформ, например, подключаться с Windows к Mac, с Mac к Linux и т. Д.
  • USB Network Gate помогает решить проблемы доступа к локальным USB-устройствам из приложений виртуализации VMware, VMware ESX, Citrix XenDesktop и Microsoft Hyper-V.
  • Решение позволяет совместно использовать USB по протоколу удаленного рабочего стола, что упрощает работу с локальными USB-устройствами в удаленном сеансе.
  • USB Network Gate имеет возможность сжимать трафик, что позволяет повысить скорость передачи данных и оптимизировать использование полосы пропускания.
  • Приложение поддерживает расширенное 256-битное шифрование SSL, которое гарантирует безопасность ваших коммуникаций при совместном использовании USB через Ethernet.

USB / IP — альтернатива бесплатному программному обеспечению

Проект USB / IP разработан для создания общей системы для совместного использования периферийных USB-устройств по сети Ethernet. Это бесплатное решение. Его задача — преобразовывать сообщения ввода-вывода USB в IP-пакеты для их дальнейшего перенаправления на требуемый компьютер. Что хорошо в этом проекте, так это то, что вы можете использовать оригинальные драйверы USB-устройств и программы для удаленных периферийных USB-устройств. Что касается слабых мест, то решение USB / IP довольно давно не обновлялось и рекомендуется для опытных пользователей, а не для компьютерных новичков.

USB через сеть

Еще один отличный инструмент для удаленного доступа к USB-устройствам — это программное обеспечение USB через сеть. Утилита отлично работает в операционных системах Windows и Linux. Это дает вам возможность подключаться к периферийному USB-устройству, даже если оно находится далеко от вас. С помощью этого приложения вы получаете эффективную функцию автоматического обнаружения USB-серверов, которая позволяет вам находить USB-серверы, установленные в вашей локальной сети, без указания их удаленного IP-адреса.

FlexiHub

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

FlexiHub поддерживает операционные системы Windows, Linux, macOS и Android, и легко достигается кроссплатформенное соединение между любой из поддерживаемых платформ. Инструмент также работает со многими виртуальными средами, включая ESX, VMWare, Microsoft Hyper-V, Citrix XenDesktop и Windows Virtual PC. Инструмент предлагает пользователям простой и интуитивно понятный способ доступа к USB через Ethernet.

VirtualHere

VirtualHere — это удобное приложение, которое избавляет вас от необходимости физически подключать USB-устройства к компьютеру, когда вы хотите их использовать.С помощью этого решения к вашим ценным периферийным устройствам можно получить удаленный доступ через локальную сеть, Интернет или в облаке. Приложение имеет чистый и удобный графический интерфейс и требует минимальных усилий для установки. Он совместим с Windows, macOS, Linux и Android, что также является большим преимуществом. Некоторые другие преимущества, которые вы получаете с VirtualHere, включают встроенную службу подписки VPN и специальную версию для сетевых хранилищ.

USB через Ethernet — KernelPro

Удаленный доступ к USB-устройствам через IP-сеть любого типа становится простым благодаря USB over Ethernet.Это приложение профессионального уровня, которое позволяет использовать подключенное к сети USB-устройство на удаленном компьютере, как если бы оно было подключено напрямую. Инструмент выполняет это без необходимости устанавливать драйвер устройства на компьютер, к которому оно подключено.

USB-накопитель

USBDeviceShare — еще один инструмент, который позволяет совместное использование USB-устройств через Ethernet . Доступ к сетевым USB-устройствам можно получить удаленно, как если бы они были напрямую подключены к удаленному компьютеру.Устройство можно использовать для взаимодействия с программами, даже если оно физически не подключено к компьютеру. USBDeviceShare поддерживает все разновидности USB. Он может работать с устройствами USB 1.x, 2.0 и 3.0, которые обеспечивают переменную скорость передачи данных. Это приложение представляет собой программное решение для доступа к USB-устройствам через IP-сеть.

Как выбрать лучшее программное обеспечение USB over Ethernet?

Вот некоторые из наиболее распространенных критериев, которые пользователи принимают во внимание при выборе решения для совместного использования USB через Ethernet:

1. Безопасность передачи данных . Различные программные инструменты предлагают разные уровни защиты при перенаправлении данных USB по сети. Если вы собираетесь совместно использовать USB через Ethernet, вы должны убедиться, что ваше приложение USB через LAN пересылает ваши конфиденциальные данные по зашифрованным каналам.

2. Вариант интеграции программного обеспечения . Важно, может ли решение использоваться только как отдельное приложение USB через Ethernet или может быть интегрировано в специализированный продукт.

3. В компьютерной среде с общим доступом используйте USB Network Gate для изоляции любых подключенных USB-устройств и предотвращения несанкционированного доступа. С помощью любого периферийного USB-устройства, будь то USB-накопитель, камера или звуковая карта, вы можете управлять доступом, указав идентификатор сеанса или конкретного пользователя с помощью учетной записи Microsoft.

4. Цена . Существуют бесплатные и платные приложения USB по сети.

Если вы разрабатываете свой собственный продукт и ваша цель — добавить в свой проект некоторые базовые возможности совместного использования USB, бесплатного решения может быть достаточно.Однако, если вы ищете некоторые расширенные функции перенаправления USB, такие как удаленный доступ к USB-устройствам через RDP, перенаправление USB в виртуальную среду или блейд-серверы и т. Д., Было бы разумно рассмотреть платное приложение с мощным набором функций.

Теперь давайте взглянем на некоторые из моделей

.

android — ADB через USB: перенаправление портов 2 МБ / с

Переполнение стека

  1. Около
  2. Продукты

  3. Для команд
  1. Переполнение стека
    Общественные вопросы и ответы

  2. Переполнение стека для команд
    Где разработчики и технологи делятся частными знаниями с коллегами

  3. Вакансии
    Программирование и связанные с ним технические возможности карьерного роста

  4. Талант
    Нанимайте технических специалистов и создавайте свой бренд работодателя

  5. Реклама
    Обратитесь к разработчикам и технологам со всего мира

  6. О компании

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *