Usb over ip linux to windows

Привет, Хабр! В прошлой статье мы рассмотрели историю и принцип работы технологии USB over IP, узнали, как ее применяют на базе готового аппаратного решения.

Привет, Хабр! В прошлой статье мы рассмотрели историю и принцип работы технологии USB over IP, узнали, как ее применяют на базе готового аппаратного решения.

Для личного использования, однако, аппаратное решение скорее не подойдет: нужно приобретать дорогостоящее оборудование, что нецелесообразно. Поэтому под катом рассказываю, как организовать клиент-серверный комплекс USB over IP на современных ОС и автоматизировать этот процесс.

Итак, USBIP прекрасно работает не только на специализированном оборудовании, но и на современных операционных системах. Это позволяет недорого или вообще без денежных вложений решать небольшие кейсы.

В данной статье мы рассмотрим организацию клиент-серверного комплекса USB over IP. В качестве клиента выступит облачный сервер Selectel (ОС — Ubuntu 20.04), а сервером будет классический bare metal-сервер, с той же версией Ubuntu. Помимо облачного клиента на Linux, мы выполним проброс устройства на клиент Windows 10.

Настройка сервера


Для начала установим необходимые инструменты и модули для работы. Все необходимые модули входят в состав пакета linux-tools. Выполняем его установку (у меня версия 5.4.0-100-generic):

root@Descartes:~# apt-get install linux-tools-`uname -r`

Далее проверяем доступные для загрузки USBIP модули ядра:

root@Descartes:~# find /lib/modules/$(uname -r) -name '*.ko'| grep usbip

/lib/modules/5.4.0-100-generic/kernel/drivers/usb/usbip/usbip-core.ko
/lib/modules/5.4.0-100-generic/kernel/drivers/usb/usbip/usbip-host.ko
/lib/modules/5.4.0-100-generic/kernel/drivers/usb/usbip/vhci-hcd.ko
/lib/modules/5.4.0-100-generic/kernel/drivers/usb/usbip/usbip-vudc.ko

Для работы сервера нам потребуются:

  • usbip-core — основа USBIP-сервера,
  • usbip-host — управление USB-устройствами,
  • vhci-hcd — модуль экспорта виртуальных USB-устройств.

Выполним запуск необходимых нам модулей:

root@Descartes:~# modprobe usbip-core
root@Descartes:~# modprobe usbip-host
root@Descartes:~# modprobe vhci-hcd

Чтобы не запускать данные модули вручную каждый раз, добавим их в конфигурационный файл modules.conf:

root@Descartes:~# vi /etc/modules-load.d/modules.conf

usbip-core
usbip-host
vhci-hcd

Чтобы USB-сервер работал в фоновом режиме, мы запустим его в качестве демона, а после проверим BusID подключенного накопителя. Этот ID понадобится нам позже для проброса ключей в клиентскую часть. Запускаем USB-сервер в качестве демона:

root@Descartes:~# usbipd -D

Проверяем список подключенных устройств:

root@Descartes:~# usbip list -l

 - busid 1-1 (058f:6387)
   unknown vendor : unknown product (058f:6387)
 - busid 1-13.1 (0557:2419)
   unknown vendor : unknown product (0557:2419)

где BusID 1-1 — это наш USB-накопитель, подключенный в сервер.

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

root@Descartes:~# usbip bind -b 1-1
usbip: info: bind device on busid 1-1: complete

Теперь устройство готово быть подключенным к удаленным клиентским устройствам. Далее рассмотрим настройку клиентской части.

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

По аналогии с сервером нам потребуется пакет linux-tools под необходимую версию ядра. Выполняем установку:

root@Racio:~# apt-get install linux-tools-`uname -r`

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

root@Racio:~# usbip attach --remote=188.124.55.21 --busid=1-1

Находим подключенный девайс среди остальных блочных устройств. В клиентской системе девайс определился как sda4-устройство:

root@Racio:~# fdisk -l
Device     Boot Start      End  Sectors  Size Id Type
/dev/sda4  *      256 31129599 31129344 14.9G  c W95 FAT32 (LBA)

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

Одним из вариантов подключения устройств для Windows является использование отдельного ПО — VirtualHere USB Client. Эта программа практически исключает какую-либо настройку руками.

Но мы пойдем по более интересному пути, где для Windows-клиента проброс будет осуществлен с помощью пакета usbip-client. Этот пакет содержит необходимые конфигурационные файлы для работы, в том числе каталог безопасности. Благодаря нему в будущем у нас не возникнет проблем с сертификатами. Пакет работает с Windows 7 и 10, а также с Windows Server 2008 и 2021.

Распакованный usbip-client необходимо подключить к нашей ОС как виртуальное устройство. Windows не видит старые устройства, у которых нет поддержки технологии Plug-and-Play. Чтобы добавить для них драйверы, нужно использовать утилиту ручной настройки «Мастер установки оборудования».

Для этого необходимо:

  1. Зайти в диспетчер устройств → ДействиеУстановить старое устройство.
  2. Выбрать пункт с ручной установкой оборудования и вместо конкретного типа оборудования выбрать пункт Показать все устройства. Далее выбираем Установить с диска и выбираем USBIPEnum.Inf файл из распакованного архива.
  3. Мастер установки распознает оборудование USB/IP Enumerator, его и устанавливаем.

После этого в диспетчере устройств в системных устройствах мы увидим установленный и подписанный драйвер USB/IP Enumerator.

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

C:Usersusbip usbip -l 188.124.55.21
1-1: Alcor Micro Corp. : Transcend JetFlash Flash Drive (058f:6387)
        : /sys/devices/pci0000:00/0000:00:14.0/usb1/1-1
        : (Defined at Interface level) (00/00/00)
        :  0 - Mass Storage / SCSI / Bulk (Zip) (08/06/50)

где 1-1 – BusID удаленного девайса.

Подключаем девайс к системе:

C:Usersusbip usbip -a 188.124.55.21 1-1
new usb device attached to usbvbus port 1

Автоматизация клиента и сервера


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

Рассмотрим, как реализовать это на практике.

Автоматизация серверной части

Аналогично разделу с базовой настройкой сервера необходимо добавить модули в автозапуск, без этого никуда:

root@Descartes:~# vi /etc/modules
usbip-core
usbip-host
vhci-hcd

Далее создаем юнит в systemd, который будет обращаться к скрипту usbipd и расшаривать наш USB-девайс автоматически после старта сетевых служб ОС:

root@Descartes:~# vi /etc/systemd/system/usbipd.service

[Unit]
Description=USBIPd
After=network.target

[Service]
ExecStart=/bin/sh /root/script/usbipd
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Обновляем конфигурацию systemd и добавляем юнит в автозапуск:

root@Descartes:~#systemctl daemon-reload
root@Descartes:~#systemctl enable usbipd

После чего создаем сам скрипт автообновления инструментов и расшаривания устройства usbipd:

root@Descartes:~# vi /scripts/usbipd

#!/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

bindID='1-1' # BusID нашего USB-устройства на сервере

kernel_version=$(uname -r) - # создание переменной, содержащей текущую версию ядра системы
apt install linux-tools-$kernel_version # установка инструментов проброса для актуальной версии ядра
usbipd -D 
sleep 1
usbip bind -b $bindID # делаем USB-устройство на сервере доступным для проброса

usbip attach --remote=localhost --busid=$bindID
sleep 3

usbip detach --port=00

Выдаем разрешение на запуск скрипта:

root@Descartes:~# chmod ugo+x usbipd

Последние три строки скрипта вынесены отдельно неслучайно. ПО на стороне сервера может работать неидеально. Иногда при попытке подключения устройства к клиенту под управлением ОС Windows может возникнуть проблема, когда клиент попросту не видит на сервере устройства с BusID 1-1:

usbip -a 188.124.55.21 1-1 
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

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

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

Автоматизация клиентской части (Windows)

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

cd C:UsersMaksonDesktopusbip
usbip.exe -a 188.124.55.21 1-1

Запускаем планировщик заданий, где указываем следующие параметры:

  • во вкладке Общие ставим галочку Выполнять с наивысшим приоритетом,
  • во вкладке Триггеры указываем При запуске (либо любой другой),
  • во вкладке Действия указываем путь до нашего bat-файла. В моем случае это C:UsersMaksonDesktopusbipscript.bat,
  • во вкладке Условия снимаем галочку с пункта Останавливать задачу, выполняемую дольше.

Остальные настройки можно оставить по умолчанию.

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

Автоматизация клиентской части (Linux)

Аналогично серверу создаем новый юнит для запуска автоматического подключения USB-устройства:

root@Descartes:~# vi /etc/systemd/system/usbip_client.service

[Unit]
Description=usbip_client
After=network.target

[Service]
ExecStart=/bin/sh /root/script/usbip_client 
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Создаем скрипт подключения:

root@Descartes:~# vi /root/script/usbip_client

#!/bin/sh
apt-get install linux-tools-`uname -r` -y
sleep 1
usbip attach --remote=188.124.55.21 --busid=1-1
sleep 1
echo "Подключенные устройства:"
usbip port 

Даем разрешение на запуск скрипта:

root@Descartes:~# chmod ugo+x usbip_client

Обновляем конфигурацию systemd и добавляем юнит в автозапуск:

root@Descartes:~#systemctl daemon-reload
root@Descartes:~#systemctl enable usbip_client

Как USBIP в очередной раз «спас мир»


Удаленный доступ к USB-устройствам по сети продолжает решать многие задачи в мире IT. Это может быть организация доступа к камере видеонаблюдения в серверной стойке современного дата-центра, где, как правило, запрещено размещать собственные точки Wi-Fi. Или же настройка удаленного доступа к аппаратным USB-ключам с дорогостоящими лицензиями проприетарного ПО, что защищает их от физического воздействия человека (поломки, утери и т.д.).

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

USB/IP for Windows

  • This project aims to support both a USB/IP server and a client on Windows platform.

Build

Notes

  • Build is tested on Windows 10 x64 and the projects are configured for this target by default.
  • x86/x64 platforms should be supported. However, we don’t have an x86 setup for testing at the moment.
  • For Windows 7 users, change usbip_stub and usbip_vhci projects’ Target OS version to Windows 7.
    • Right-click on the Project > Properties > Driver Settings > Target OS version > Windows 7
    • The recent tag version which supports is v0.1.0. All versions after v0.1.0 do not support Windows 7 or 8 because usbip-win started to use kernel libraries of Windows 10.

Build Tools

  • Visual Studio 2019 Community (v142)
    • Build with VS 2017 (v141) is also possible if Platform Toolset in Setting is configured to v141.
  • Windows SDK 10.0.18362.0 (recommended)
    • VS 2019 (v142): requires >= 10.0.18xxx
    • VS 2017 (v141): requires >= 10.0.17xxx
  • Windows Driver Kit Windows 10, version 1903 (10.0.18362)
    • WDK 10.0.17134 (1803), 10.0.17763 (1809) and 10.0.18346 are also tested.

Build Process

  • Open usbip_win.sln
  • If VS 2017 is used, SDK version for userspace projects (usbip, usbip_common, usbipd, stubctl) should be adjusted.
  • Set certificate driver signing for usbip_stub and usbip_vhci projects
    • Right-click on the Project > Properties > Driver Signing > Test Certificate
    • Browse to driver/usbip_test.pfx (password: usbip)
  • Build solution or desired project
  • All output files are created under {Debug,Release}/{x64,x86} folder.

Install

Windows USB/IP server

  • Prepare a Linux machine as a USB/IP client or Windows usbip-win VHCI client (tested on Ubuntu 16.04 with kernel 4.15.0-29 — USB/IP kernel module crash was observed on some other versions)
    • # modprobe vhci-hcd
  • Install USB/IP test certificate
    • Install driver/usbip_test.pfx (password: usbip)
    • Certificate should be installed into
      1. «Trusted Root Certification Authority» in «Local Computer» (not current user) and
      2. «Trusted Publishers» in «Local Computer» (not current user)
  • Enable test signing
    • > bcdedit.exe /set TESTSIGNING ON
    • reboot the system to apply
  • Copy usbip.exe, usbipd.exe, usb.ids, usbip_stub.sys, usbip_stub.inx into a folder in target machine
    • You can find usbip.exe, usbipd.exe, usbip_stub.sys in the output folder after build or on release page.
    • userspace/usb.ids
    • driver/stub/usbip_stub.inx
  • Find USB Device ID
    • You can get id from usbip listing
      • > usbip.exe list -l
    • Bus id is always 1. So output from usbip.exe listing is shown as:
usbip.exe list -l
 - busid 1-59 (045e:00cb)
   Microsoft Corp. : Basic Optical Mouse v2.0 (045e:00cb)
 - busid 1-30 (80ee:0021)
   VirtualBox : USB Tablet (80ee:0021)
  • Bind USB device to usbip stub
    • The next command replaces the existing function driver with usbip stub driver
      • This should be executed using administrator privilege
      • usbip_stub.inx and usbip_stub.sys files should be in the same folder as usbip.exe
    • > usbip.exe bind -b 1-59
  • Run usbipd.exe
    • > usbipd.exe -d -4
    • TCP port 3240 should be allowed by firewall
  • Attach USB/IP device on Linux machine
    • # usbip attach -r <usbip server ip> -b 1-59

Windows USB/IP client

  • Currently, there are 2 versions for a VHCI driver with different installation procedures:
    • vhci(wdm): original version, implemented via WDM (Windows Driver Model);
    • vhci(ude): newly developed version to fully support USB applications and implemented via UDE (USB Device Emulation) which is MS provided USB virtualization framework over KMDF (Kernel-Model Driver Framework).
  • Prepare a Linux machine as a USB/IP server or Windows usbip-win stub server — (tested on Ubuntu 16.04 (kernel 4.15.0-29), 18.04, 20.04)
    • # modprobe usbip-host
    • You can use virtual usbip-vstub as a stub server
  • Run usbipd on a USB/IP server (Linux)
    • # usbipd -4 -d
  • Install USB/IP test certificate
    • Install driver/usbip_test.pfx (password: usbip)
    • Certificate should be installed into
      1. «Trusted Root Certification Authority» in «Local Computer» (not current user) and
      2. «Trusted Publishers» in «Local Computer» (not current user)
  • Enable test signing
    • > bcdedit.exe /set TESTSIGNING ON
    • reboot the system to apply
  • Copy VHCI driver files into a folder in target machine
    • If you’re testing vhci(ude), copy usbip.exe, usbip_vhci_ude.sys, usbip_vhci_ude.inf, usbip_vhci_ude.cat into a folder in target machine;
    • If you’re testing vhci(wdm), copy usbip.exe, usbip_vhci.sys, usbip_vhci.inf, usbip_root.inf, usbip_vhci.cat into a folder in target machine;
    • You can find all files in output folder after build or on release page.
  • Install USB/IP VHCI driver
    • You can install using usbip.exe or manually
    • Using usbip.exe install command
      • Run PowerShell or CMD as an Administrator
      • PS> usbip.exe install
      • The previous command will install a UDE driver or a WDM driver depending on the available files
        • (UDE version first)
      • PS> usbip.exe install -u if UDE driver only
      • PS> usbip.exe install -w if WDM driver only
    • Manual Installation for vhci(ude)
      • Run PowerShell or CMD as an Administrator
      • PS> pnputil /add-driver usbip_vhci_ude.inf
      • Start Device manager
      • Choose «Add Legacy Hardware» from the «Action» menu.
      • Select «Install the hardware that I manually select from the list».
      • Click «Next».
      • Click «Have Disk», click «Browse», choose the copied folder, and click «OK».
      • Click on the «usbip-win VHCI(ude)», and then click «Next».
      • Click Finish at «Completing the Add/Remove Hardware Wizard».
    • Manual Installation for vhci(wdm)
      • Run PowerShell or CMD as an Administrator
      • PS> pnputil /add-driver usbip_vhci.inf
      • Start Device manager
      • Choose «Add Legacy Hardware» from the «Action» menu.
      • Select «Install the hardware that I manually select from the list».
      • Click «Next».
      • Click «Have Disk», click «Browse», choose the copied folder, and click «OK».
      • Click on the «USB/IP VHCI Root», and then click «Next».
      • Click Finish at «Completing the Add/Remove Hardware Wizard».
  • Attach a remote USB device
    • PS> usbip.exe attach -r <usbip server ip> -b 2-2
  • Uninstall driver
    • PS> usbip.exe uninstall
  • Disable test signing
    • > bcdedit.exe /set TESTSIGNING OFF
    • reboot the system to apply

Reporting Bugs

  • usbip-win is not yet ready for production use. We could find the problems with detailed logs.

How to get Windows kernel log for vhci(wdm)

  • Set registry key to enable a debug filter
    • usbip-win uses DbgPrintEx API for kernel logging.
    • save following as .reg file and run or manually insert the registry key
    • reboot the system to apply
Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession ManagerDebug Print Filter]
"IHVDRIVER"=dword:ffffffff
  • Run a debugging log viewer program before you test.
    • DebugView is a good tool to view the logs.
  • If your testing machine suffer from BSOD (Blue Screen of Death), you should get it via remote debugging.
    • WinDbg on virtual machines would be good to get logs.

How to get Windows kernel log for vhci(ude)

  • A new vhci(ude) implementation uses WPP SW tracing instead of DbgPrintEx.
    • DebugView.exe cannot catch a VHCI debug message
      • TraceView.exe is a good utility for a new approach, which is included in WDK.
  • usbip_vhci_ude.pdb file is required to add a trace provider easily.
  • Create a new session log in TraceView.exe
    • Choose PDB file radio button in «Provider Control GUID Setup» popup dialog
    • Specify usbip_vhci_ude.pdb as a PDB file
  • You can send real-time trace messages to WinDbg by modifying in «Advanced Log Session Options«.
  • If your testing machine suffer from BSOD (Blue Screen of Death), you should get it via remote debugging.
    • WinDbg on virtual machines would be good to get logs

How to get usbip forwarder log

  • usbip-win transmits usbip packets via a userland forwarder.
    • forwarder log is the best to look into usbip packet internals.
  • edit usbip_forward.c to define DEBUG_PDU at the head of the file
  • compile usbip.exe or usbipd.exe
  • debug_pdu.log is created at the path where an executable runs.

How to get linux kernel log

  • Sometimes Linux kernel log is required
# dmesg --follow | tee kernel_log.txt

This project was supported by Basic Science Research Program through the National Research Foundation of Korea(NRF) funded by the Ministry of Education(2020R1I1A1A01066121).

Обновлено Обновлено: 19.09.2018
Опубликовано Опубликовано: 22.06.2018

В инструкции описан процесс настройки бесплатного решения для редиректа USB устройства с сервера на любой другой компьютер сети. Это может пригодиться, например, для проброса USB токена на виртуальную машину или несетевого принтера. В рамках примера сервер будет на Linux Ubuntu, клиент — на Windows (проверено на 7, 10, Server 2008 и 2012).

Устанавливаем usbip
Настраиваем клиента
Настраиваем автоматический запуск
    USB-сервера
    Клиента Windows
Решение проблем
    usbip_common_mod.ko and usbip.ko must be loaded
    /usr/sbin/usbipd: No such file or directory
    failed to open /usr/share/hwdata//usb.ids
    recv op_common
    cannot find device
    udev_device_new_from_subsystem_sysname failed

Установка и запуск

В Ubuntu установка инструмента проброса USB выполняется следующей командой:

apt-get install linux-tools-`uname -r`

* в моем случае была выполнена установка linux-tools-4.4.0-128-generic, где 4.4.0-128-generic — версия ядра, используемого в Ubuntu.

Подгружаем модули драйверов USB:

modprobe usbip-core

modprobe usbip-host

modprobe vhci-hcd

Запускаем usbip в качестве демона:

usbipd -D

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

usbip list -l

Пример ответа:

root@usb:/usr/src# usbip list -l
 — busid 2-1.3 (8564:1000)
   Transcend Information, Inc. : JetFlash (8564:1000)

 — busid 2-1.4 (1c4f:0026)
   SiGma Micro : Keyboard (1c4f:0026)

Теперь можно расшарить флешку:

usbip bind -b 2-1.3

Должны увидеть на подобие:

usbip: info: bind device on busid 2-1.3: complete

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

Выполним настройку на базе операционной системы Windows.

Скачиваем драйвер и утилиту для Windows. Распаковываем архив usbip.zip.

Открываем диспетчер устройств (команда devmgmt.msc или правой кнопкой по Этот компьютер в проводнике — Управление — Диспетчер устройств).

Кликаем по ДействиеУстановить старое устройство:

Установка старого устройства в диспетчере устройств Windows

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

Будет обнаружено устройство USB/IP Enumerator — кликаем Далее, чтобы его установить. Мы должны его увидеть среди системных устройств.

Теперь открываем командную строку (cmd.exe) и переходим в распакованный каталог, например:

cd C:UsersuserDownloadsusbip

* где C:UsersuserDownloadsusbip — полный путь до папки.

Смотрим список расшаренных USB устройств на сервере:

usbip -l 192.168.0.15

* где 192.168.0.15 — IP-адрес сервера USB.

Мы получим ответ, на подобие этого:

C:UsersuserDownloadsusbip>usbip -l 192.168.0.15
— 192.168.0.15
   2-1.3: unknown vendor : unknown product (8564:1000)
        : /sys/devices/pci0000:00/0000:00:1d.0/usb2/2-1/2-1.3
        : (Defined at Interface level) (00/00/00)

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

usbip.exe -a 192.168.0.15 2-1.3

* если увидим ошибку …cannot find device, переходим к решению.

Автозапуск

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

Автозапуск сервера

Добавляем модули в автозапуск:

vi /etc/modules

usbip-core
usbip-host
vhci-hcd

Создаем юнит в systemd:

vi /etc/systemd/system/usbipd.service

[Unit]
Description=USBIPd

[Service]
ExecStart=/scripts/usbipd
Type=oneshot
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

Перечитываем конфигурацию systemd и разрешаем запуск созданного нами юнита:

systemctl daemon-reload

systemctl enable usbipd

Создаем каталог хранения скрипта и сам скрипт:

mkdir /scripts

vi /scripts/usbipd

#!/bin/sh
PATH=/etc:/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin

bindID=’2-1.3′

usbipd -D
usbip bind -b $bindID

usbip attach —remote=localhost —busid=$bindID
sleep 2
usbip detach —port=00

Разрешаем запуск скрипта:

chmod +x /scripts/usbipd

Запускаем демона:

systemctl start usbipd

systemctl status usbipd

Для окончательного тестирования можно перезагрузить сервер.

Автозапуск клиента Windows

Пишем небольшой батник:

@echo off

cd C:UsersuserDownloadsusbip
usbip.exe -a 192.168.0.15 2-1.3

C:UsersuserDownloadsusbip — путь, где хранится распакованная утилита; 192.168.0.15 — адрес  сервера USB; 2-1.3 — идентификатор USB устройства на сервере.

Сохраняем скрипт с расширением bat или cmd. Запускаем планировщик заданий и добавляем новую задачу.

На вкладке Общие отмечаем Выполнять вне зависимости от регистрации пользователя и ставим галочку Выполнить с наивысшими правами:

Планировщик - вкладка общие

В триггерах выбираем При запуске системы:

Планировщик - вкладка триггеры

На вкладке Действия выбираем Запуск программы и прописываем путь до скрипта, который мы сохранили ранее:

Планировщик - вкладка действия

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

Планировщик - вкладка параметры

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

Возможные проблемы

1. usbip_common_mod.ko and usbip.ko must be loaded

Ошибка появляется при попытке выполнить usbipd -D.

Причина: был установлен пакет usbip вместо linux-tools-<версия ядра>.

Решение: удаляем usbip:

apt-get remove usbip

Ставим нужный пакет:

apt-get install linux-tools-`uname -r`

2. /usr/sbin/usbipd: No such file or directory

Данная ошибка также появляется при попытке выполнить usbipd -D.

Причина: Нужный бинарник для запуска находится по другому пути — /usr/bin/usbipd.

Решение: создаем симлинк:

ln -s /usr/bin/usbipd /usr/sbin/usbipd

3. usbip: error: failed to open /usr/share/hwdata//usb.ids

Выскакивает при попытке посмотреть список устройств командой usbip list -l.

Причина: необходимый файл usb.ids находится в другой директории.

Решение: создаем каталог /usr/share/hwdata:

mkdir /usr/share/hwdata

Создаем симлинк на существующий файл:

ln -s /usr/share/misc/usb.ids /usr/share/hwdata/usb.ids

4. usbip err … recv op_common

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

usbip err: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip err:       usbip.c: 216 (query_exported_devices) recv op_common
usbip err:       usbip.c: 288 (show_exported_devices) query

Причина: ошибка в бинарном файле для Windows.

Решение: открыть exe-файл в HEX редакторе, например, HxD. И в адресах смещения 00000CBC и 00000E0A заменить 06 на 11:

Редактирование exe — было

* было

Редактирование exe — стало

* стало

5. (attach_device) cannot find device

При попытке монтирования устройства в Windows, выскакивает ошибка с похожим текстом:

usbip err: usbip_windows.c: 829 (attach_device) cannot find device

Причина: недоработка серверного ПО — при расшаривании USB не считывается количество дескрипторов.

Решение: примонтировать устройство на сервере с последующим отмонтированием:

usbip attach —remote=localhost —busid=2-1.3

* в моем случае устройство имеет идентификатор 2-1.3.

usbip port

* смотрим номер порта, на котором висит наше примонтированное устройство. 

usbip detach —port=00

6. udev_device_new_from_subsystem_sysname failed

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

libusbip: error: udev_device_new_from_subsystem_sysname failed
usbip: error: open vhci_driver
usbip: error: query

Причина: не подключен модуль vhci-hcd.

Решение: разово выполняем команду:

modprobe vhci-hcd

и добавляем в файл /etc/modules строку vhci-hcd.

Для получения прямого доступа к физическим USB устройствам компьютера из подсистемы Windows для Linux (WSL2) или виртуальной машины Hyper-V вы можете open-source проект usbipd-win. Это проект позволяет настроить сквозную передачу внешнего USB устройства, подключенного к хостовой Windows, в любой дистрибутив Linux, запущенный в виде WSL или в виртуальные машины. Это позволяет выполнять любые действия с USB устройствами из Linux (прошивка Android устройств/ADB/Fastboot, доступ к смарт-картам, работа с оборудованием Arduino и т.д.).

В usbipd-win используется протокол USB/IP для перенаправления USB трафика через виртуальный сетевой интерфейс между WSL и хостовой Windows. Сначала мы настроим клиент USB/IP в Linux (WSL), и затем установим и установим и запустим серверную часть usbipd-win на Windows и прокинем USB устройство в Linux.

Usbipd-win поддерживает версии, начиная с Windows 8.1 x64 и Windows Server 2012 R2, и позволяет предоставить общий доступ к локальным USB устройствам Windows другим виртуальным машинам (включая WSL2 и гостевые ОС Linux на Hyper-V). С помощью встроенных средств Hyper-V ранее можно было пробрасывать только USB накопители или другие виды USB устройства через довольно ограниченный режим Enhanced Session Mode.

Проект usbipd-win доступен на GitHub (https://github.com/dorssel/usbipd-win). Вы можете скачать и установить его вручную (доступен установочный MSI файл), но гораздо быстрее установить приложение с помощью встроенного менеджера пакетов winget.

winget install --interactive --exact dorssel.usbipd-win

установка dorssel.usbipd-win

Программа создаст в Windows отдельную службу usbipd (USBIP Device Host):
"C:Program Filesusbipd-winusbipd.exe" server,
которая слушает на порту TCP 3240

служба USBIP Device Host

Для программы usbipd.exe в Windows Defender Firewall создано правило (
usbipd
), разрешающее доступ на порт TCP 3240 с компьютеров в локальной сети.

Теперь настроим поддержку USBIP в среде Windows Subsystem for Linux. Проверьте, что версия ядра в вашем образе не ниже 5.10.60.1 (в нашем примере для демонстрации используется WSL 2 с образом Ubuntu 22.04 LTS):

$ uname -a

Теперь нужно установить инструменты для работы с USB/IP и базу с идентификаторами USB устройств.

$ sudo apt install linux-tools-virtual hwdata
$ sudo update-alternatives --install /usr/local/bin/usbip usbip `ls /usr/lib/linux-tools/*/usbip | tail -n1` 20

установка linux-tools-virtual для пробросаUSB

В Debian образе WSL используется команда:

$ sudo apt-get install usbip hwdata usbutils

Установка USB/IP утилит в WSL образа на базе rpm (CentOS/Oracle Linux):
$ sudo rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
$ sudo rpm -ivh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
$ sudo yum install kmod-usbip
$ sudo yum install usbip-utils
$ sudo yum install hwdata

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

usbipd wsl list

Как вы видите, ни одно из USB устройств не опубликовано (Not shared). Вы можете предоставить общий доступ к USB устройству по его BUSID. В моем примере я хочу прокинуть в WSL флешку (USB Mass Storage Device) с BUISID 4-2.

usbipd wsl attach --busid 4-2

usbipd открыть общий доступ к usb устройству в WSL через usboverip

  • Если вы используете WSL 1 (не поддерживается в usbip), появится ошибка: sbipd: error: The specified WSL distribution is using WSL 1, but WSL 2 is required. Learn how to upgrade at https://docs.microsoft.com/windows/wsl/basic-commands#set-wsl-version-to-1-or-2.
  • Если появится ошибка: usbipd: error: WSL kernel is not USBIP capable, обновите WSL систему командой:
    wsl --update

Проверьте, что ваша флешка была подключена к WSL:

dmesg | tail
lsusb

usb устройство пробросить в Windows Subsystem for Linux

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

$ usbip list --remote=192.168.31.20

Теперь можно подключить нужное USB по его ID:

$ sudo usbip attach -remote=192.168.31.20 --busid=4-2

В этом примере указан IP адрес хоста Windows, где запущен сервер usbipd-win.

Теперь ваши Linux утилиты должны увидеть подключенное USB устройство.

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

usbipd wsl detach --busid 4-2

Обратите внимание, что подключенные таким образом USB накопители не определяются как блочные устройства в WSL. Проверьте это командой lsblk. Дело в том, что в ядре WSL отсутствует драйвера для USB накопителей (чтобы добавить их придется пересобрать ядро).

В обычных дистрибутивах Linux вы сможете смонтировать файловую систему прокинутых USB накопителей стандартным образом.

Поэтому, если вам нужно смонтировать внешнюю USB флешку, диск, SD карту в WSL, нужно использовать такие команды:

$ sudo mkdir /mnt/f
$ sudo mount -t drvfs f: /mnt/f

смонтировать USB диск в WSL Linux

WSL может смонтировать таким образом диски с FAT, ExFAT, ReFs или NTFS, а также VHD образы.

Таким образом usbipd-win можно использовать для сквозной передачи физических USB устройств из Windows в WSL, в виртуальные машину или физические компьютер с Linux по сети с помощью USBOverIP

Содержание

  1. USB over IP для личного использования: организовываем клиент-серверный комплекс на Linux и Windows
  2. Настройка сервера
  3. Настройка клиента на Linux
  4. Настройка клиента на Windows
  5. Автоматизация клиента и сервера
  6. Автоматизация серверной части
  7. Автоматизация клиентской части (Windows)
  8. Автоматизация клиентской части (Linux)
  9. Как USBIP в очередной раз «спас мир»
  10. Укрощаем USB/IP
  11. Часть первая, историческая
  12. Часть вторая, серверно-линуксовая
  13. Часть третья, клиентская и запутанная
  14. USB over IP для личного использования: организовываем клиент-серверный комплекс на Linux и Windows
  15. Настройка сервера
  16. Настройка клиента на Linux
  17. Настройка клиента на Windows
  18. Автоматизация клиента и сервера
  19. Автоматизация серверной части
  20. Автоматизация клиентской части (Windows)
  21. Автоматизация клиентской части (Linux)
  22. Как USBIP в очередной раз «спас мир»

USB over IP для личного использования: организовываем клиент-серверный комплекс на Linux и Windows

Привет, Хабр! В прошлой статье мы рассмотрели историю и принцип работы технологии USB over IP, узнали, как ее применяют на базе готового аппаратного решения.

Для личного использования, однако, аппаратное решение скорее не подойдет: нужно приобретать дорогостоящее оборудование, что нецелесообразно. Поэтому под катом рассказываю, как организовать клиент-серверный комплекс USB over IP на современных ОС и автоматизировать этот процесс.

Итак, USBIP прекрасно работает не только на специализированном оборудовании, но и на современных операционных системах. Это позволяет недорого или вообще без денежных вложений решать небольшие кейсы.

В данной статье мы рассмотрим организацию клиент-серверного комплекса USB over IP. В качестве клиента выступит облачный сервер Selectel (ОС — Ubuntu 20.04), а сервером будет классический bare metal-сервер, с той же версией Ubuntu. Помимо облачного клиента на Linux, мы выполним проброс устройства на клиент Windows 10.

Настройка сервера

Для начала установим необходимые инструменты и модули для работы. Все необходимые модули входят в состав пакета linux-tools. Выполняем его установку (у меня версия 5.4.0-100-generic):

Далее проверяем доступные для загрузки USBIP модули ядра:

Для работы сервера нам потребуются:

  • usbip-core — основа USBIP-сервера,
  • usbip-host — управление USB-устройствами,
  • vhci-hcd — модуль экспорта виртуальных USB-устройств.

Выполним запуск необходимых нам модулей:

Чтобы не запускать данные модули вручную каждый раз, добавим их в конфигурационный файл modules.conf:

Чтобы USB-сервер работал в фоновом режиме, мы запустим его в качестве демона, а после проверим BusID подключенного накопителя. Этот ID понадобится нам позже для проброса ключей в клиентскую часть. Запускаем USB-сервер в качестве демона:

Проверяем список подключенных устройств:

где BusID 1-1 — это наш USB-накопитель, подключенный в сервер.

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

Теперь устройство готово быть подключенным к удаленным клиентским устройствам. Далее рассмотрим настройку клиентской части.

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

По аналогии с сервером нам потребуется пакет linux-tools под необходимую версию ядра. Выполняем установку:

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

Находим подключенный девайс среди остальных блочных устройств. В клиентской системе девайс определился как sda4-устройство:

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

Одним из вариантов подключения устройств для Windows является использование отдельного ПО — VirtualHere USB Client. Эта программа практически исключает какую-либо настройку руками.

Но мы пойдем по более интересному пути, где для Windows-клиента проброс будет осуществлен с помощью пакета usbip-client. Этот пакет содержит необходимые конфигурационные файлы для работы, в том числе каталог безопасности. Благодаря нему в будущем у нас не возникнет проблем с сертификатами. Пакет работает с Windows 7 и 10, а также с Windows Server 2008 и 2021.

Распакованный usbip-client необходимо подключить к нашей ОС как виртуальное устройство. Windows не видит старые устройства, у которых нет поддержки технологии Plug-and-Play. Чтобы добавить для них драйверы, нужно использовать утилиту ручной настройки «Мастер установки оборудования».

Для этого необходимо:

  1. Зайти в диспетчер устройств → ДействиеУстановить старое устройство.
  2. Выбрать пункт с ручной установкой оборудования и вместо конкретного типа оборудования выбрать пункт Показать все устройства. Далее выбираем Установить с диска и выбираем USBIPEnum.Inf файл из распакованного архива.
  3. Мастер установки распознает оборудование USB/IP Enumerator, его и устанавливаем.

После этого в диспетчере устройств в системных устройствах мы увидим установленный и подписанный драйвер USB/IP Enumerator.

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

где 1-1 – BusID удаленного девайса.

Подключаем девайс к системе:

Автоматизация клиента и сервера

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

Рассмотрим, как реализовать это на практике.

Автоматизация серверной части

Аналогично разделу с базовой настройкой сервера необходимо добавить модули в автозапуск, без этого никуда:

Далее создаем юнит в systemd, который будет обращаться к скрипту usbipd и расшаривать наш USB-девайс автоматически после старта сетевых служб ОС:

Обновляем конфигурацию systemd и добавляем юнит в автозапуск:

После чего создаем сам скрипт автообновления инструментов и расшаривания устройства usbipd:

Выдаем разрешение на запуск скрипта:

Последние три строки скрипта вынесены отдельно неслучайно. ПО на стороне сервера может работать неидеально. Иногда при попытке подключения устройства к клиенту под управлением ОС Windows может возникнуть проблема, когда клиент попросту не видит на сервере устройства с BusID 1-1:

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

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

Автоматизация клиентской части (Windows)

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

Запускаем планировщик заданий, где указываем следующие параметры:

  • во вкладке Общие ставим галочку Выполнять с наивысшим приоритетом,
  • во вкладке Триггеры указываем При запуске (либо любой другой),
  • во вкладке Действия указываем путь до нашего bat-файла. В моем случае это C:UsersMaksonDesktopusbipscript.bat,
  • во вкладке Условия снимаем галочку с пункта Останавливать задачу, выполняемую дольше.

Остальные настройки можно оставить по умолчанию.

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

Автоматизация клиентской части (Linux)

Аналогично серверу создаем новый юнит для запуска автоматического подключения USB-устройства:

Создаем скрипт подключения:

Даем разрешение на запуск скрипта:

Обновляем конфигурацию systemd и добавляем юнит в автозапуск:

Как USBIP в очередной раз «спас мир»

Удаленный доступ к USB-устройствам по сети продолжает решать многие задачи в мире IT. Это может быть организация доступа к камере видеонаблюдения в серверной стойке современного дата-центра, где, как правило, запрещено размещать собственные точки Wi-Fi. Или же настройка удаленного доступа к аппаратным USB-ключам с дорогостоящими лицензиями проприетарного ПО, что защищает их от физического воздействия человека (поломки, утери и т.д.).

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

Источник

Укрощаем 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 в минимальной конфигурации, стандартное движение руками:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Источник

USB over IP для личного использования: организовываем клиент-серверный комплекс на Linux и Windows

Привет, Хабр! В прошлой статье мы рассмотрели историю и принцип работы технологии USB over IP, узнали, как ее применяют на базе готового аппаратного решения.

Для личного использования, однако, аппаратное решение скорее не подойдет: нужно приобретать дорогостоящее оборудование, что нецелесообразно. Поэтому под катом рассказываю, как организовать клиент-серверный комплекс USB over IP на современных ОС и автоматизировать этот процесс.

Итак, USBIP прекрасно работает не только на специализированном оборудовании, но и на современных операционных системах. Это позволяет недорого или вообще без денежных вложений решать небольшие кейсы.

В данной статье мы рассмотрим организацию клиент-серверного комплекса USB over IP. В качестве клиента выступит облачный сервер Selectel (ОС — Ubuntu 20.04), а сервером будет классический bare metal-сервер, с той же версией Ubuntu. Помимо облачного клиента на Linux, мы выполним проброс устройства на клиент Windows 10.

Настройка сервера

Для начала установим необходимые инструменты и модули для работы. Все необходимые модули входят в состав пакета linux-tools. Выполняем его установку (у меня версия 5.4.0-100-generic):

Далее проверяем доступные для загрузки USBIP модули ядра:

Для работы сервера нам потребуются:

  • usbip-core — основа USBIP-сервера,
  • usbip-host — управление USB-устройствами,
  • vhci-hcd — модуль экспорта виртуальных USB-устройств.

Выполним запуск необходимых нам модулей:

Чтобы не запускать данные модули вручную каждый раз, добавим их в конфигурационный файл modules.conf:

Чтобы USB-сервер работал в фоновом режиме, мы запустим его в качестве демона, а после проверим BusID подключенного накопителя. Этот ID понадобится нам позже для проброса ключей в клиентскую часть. Запускаем USB-сервер в качестве демона:

Проверяем список подключенных устройств:

где BusID 1-1 — это наш USB-накопитель, подключенный в сервер.

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

Теперь устройство готово быть подключенным к удаленным клиентским устройствам. Далее рассмотрим настройку клиентской части.

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

По аналогии с сервером нам потребуется пакет linux-tools под необходимую версию ядра. Выполняем установку:

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

Находим подключенный девайс среди остальных блочных устройств. В клиентской системе девайс определился как sda4-устройство:

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

Одним из вариантов подключения устройств для Windows является использование отдельного ПО — VirtualHere USB Client. Эта программа практически исключает какую-либо настройку руками.

Но мы пойдем по более интересному пути, где для Windows-клиента проброс будет осуществлен с помощью пакета usbip-client. Этот пакет содержит необходимые конфигурационные файлы для работы, в том числе каталог безопасности. Благодаря нему в будущем у нас не возникнет проблем с сертификатами. Пакет работает с Windows 7 и 10, а также с Windows Server 2008 и 2021.

Распакованный usbip-client необходимо подключить к нашей ОС как виртуальное устройство. Windows не видит старые устройства, у которых нет поддержки технологии Plug-and-Play. Чтобы добавить для них драйверы, нужно использовать утилиту ручной настройки «Мастер установки оборудования».

Для этого необходимо:

  1. Зайти в диспетчер устройств → ДействиеУстановить старое устройство.
  2. Выбрать пункт с ручной установкой оборудования и вместо конкретного типа оборудования выбрать пункт Показать все устройства. Далее выбираем Установить с диска и выбираем USBIPEnum.Inf файл из распакованного архива.
  3. Мастер установки распознает оборудование USB/IP Enumerator, его и устанавливаем.

После этого в диспетчере устройств в системных устройствах мы увидим установленный и подписанный драйвер USB/IP Enumerator.

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

где 1-1 – BusID удаленного девайса.

Подключаем девайс к системе:

Автоматизация клиента и сервера

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

Рассмотрим, как реализовать это на практике.

Автоматизация серверной части

Аналогично разделу с базовой настройкой сервера необходимо добавить модули в автозапуск, без этого никуда:

Далее создаем юнит в systemd, который будет обращаться к скрипту usbipd и расшаривать наш USB-девайс автоматически после старта сетевых служб ОС:

Обновляем конфигурацию systemd и добавляем юнит в автозапуск:

После чего создаем сам скрипт автообновления инструментов и расшаривания устройства usbipd:

Выдаем разрешение на запуск скрипта:

Последние три строки скрипта вынесены отдельно неслучайно. ПО на стороне сервера может работать неидеально. Иногда при попытке подключения устройства к клиенту под управлением ОС Windows может возникнуть проблема, когда клиент попросту не видит на сервере устройства с BusID 1-1:

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

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

Автоматизация клиентской части (Windows)

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

Запускаем планировщик заданий, где указываем следующие параметры:

  • во вкладке Общие ставим галочку Выполнять с наивысшим приоритетом,
  • во вкладке Триггеры указываем При запуске (либо любой другой),
  • во вкладке Действия указываем путь до нашего bat-файла. В моем случае это C:UsersMaksonDesktopusbipscript.bat,
  • во вкладке Условия снимаем галочку с пункта Останавливать задачу, выполняемую дольше.

Остальные настройки можно оставить по умолчанию.

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

Автоматизация клиентской части (Linux)

Аналогично серверу создаем новый юнит для запуска автоматического подключения USB-устройства:

Создаем скрипт подключения:

Даем разрешение на запуск скрипта:

Обновляем конфигурацию systemd и добавляем юнит в автозапуск:

Как USBIP в очередной раз «спас мир»

Удаленный доступ к USB-устройствам по сети продолжает решать многие задачи в мире IT. Это может быть организация доступа к камере видеонаблюдения в серверной стойке современного дата-центра, где, как правило, запрещено размещать собственные точки Wi-Fi. Или же настройка удаленного доступа к аппаратным USB-ключам с дорогостоящими лицензиями проприетарного ПО, что защищает их от физического воздействия человека (поломки, утери и т.д.).

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

Источник

From the USB/IP site:

USB/IP Project aims to develop a general USB device sharing system over IP network. To share USB devices between computers with their full functionality, USB/IP encapsulates «USB I/O messages» into TCP/IP payloads and transmits them between computers.

Installation

Install the usbip package.

Usage

Server setup

The server should have the physical USB device connected to it, and the usbip_host USB/IP kernel module loaded. Then start and enable the USB/IP systemd service usbipd.service. The daemon will accept connections on TCP port 3240.

List the connected devices:

$ usbip list -l

Bind the required device. For example, to share the device having busid 1-1.5:

Note: The device needs to be bound again after suspending.

$ usbip bind -b 1-1.5

To unbind the device:

$ usbip unbind -b 1-1.5

After binding, the device can be accessed from the client.

Binding with systemd service

In order to make binding persistent following systemd template unit file can be used:

/etc/systemd/system/usbip-bind@.service
[Unit]
Description=USB-IP Binding on bus id %I
After=network-online.target usbipd.service
Wants=network-online.target
Requires=usbipd.service
#DefaultInstance=1-1.5

[Service]
Type=simple
ExecStart=/usr/bin/usbip bind -b %i
RemainAfterExit=yes
ExecStop=/usr/bin/usbip unbind -b %i  
Restart=on-failure

[Install]
WantedBy=multi-user.target

So, e.g., to share the device having busid 1-1, one should start/enable usbip-bind@1-1.service.

Client setup

Make sure the vhci-hcd kernel module is loaded.

Then list devices available on the server:

$ usbip list -r server_IP_address

Attach the required device. For example, to attach the device having busid 1-1.5:

$ usbip attach -r server_IP_address -b 1-1.5

Tip: To connect to an alternate TCP port use --tcp-port port.

Disconnecting devices

A device can be disconnected only after detaching it on the client.

List attached devices:

$ usbip port

Detach the device:

$ usbip detach -p port_number

Unbind the device on the server:

$ usbip unbind -b busid

Note: USB/IP by default requires port 3240 to be open. If a firewall is running, make sure that this port is open. For detailed instruction on configuring the firewall, go to Category:Firewalls.

Tips and tricks

Binding by vendor/device ID

If bus ids are inconsistent and dynamically assigned at each system boot, binding by vendor/device ID can be used alternatively:

/etc/systemd/system/usbip-bind@.service
[Unit]
Description=USB-IP Binding device id %I
After=network-online.target usbipd.service
Wants=network-online.target
Requires=usbipd.service

[Service]
Type=simple
ExecStart=/bin/sh -c "/usr/sbin/usbip bind --$(/usr/sbin/usbip list -p -l | grep '#usbid=%i#' | cut '-d#' -f1)"
RemainAfterExit=yes
ExecStop=/bin/sh -c "/usr/sbin/usbip unbind --$(/usr/sbin/usbip list -p -l | grep '#usbid=%i#' | cut '-d#' -f1)"
Restart=on-failure
 
[Install]
WantedBy=multi-user.target

So, e.g., to share the device having vendor/device ID 0924:3d68, one should start/enable usbip-bind@0924:3d68.service.

Note: Such a binding method cannot work correctly for multiple devices with the same vendor/device ID.

Then client setup will be like this:

  • Linux clients
$ usbip attach -r server_IP_address --$(/usr/sbin/usbip list -p -r server_IP_address | grep '#usbid=0924:3d68#' | cut '-d#' -f1)

Note: If the previous command fails, check if -p flag in usbip list -p -r server_IP_address is working properly. If not, use the following line instead:

$ usbip attach -r server_IP_address -b $(/usr/sbin/usbip list -p -r server_IP_address | grep '0924:3d68' | cut '-d:' -f1 | awk '{print $1}')
  • Windows clients
c:> for /f "tokens=1 delims=:, " %a in ('usbip list -r server_IP_address ^| findstr /r /c:"0924:3d68"') do start usbip attach -r server_IP_address -b %a

Sharing devices configured with files in /etc/..

usbip-systemdAUR provides systemd service files for binding by vendor/device id and for connecting by hostname and vendor/device id.

Server setup

For each device create a device.conf in /etc/usbip/bind-devices/ with USBIP_DEVICE set to the vendor/product id, e.g.:

/etc/usbip/bind-devices/example-device.conf
USBIP_DEVICE=0924:3d68

To bind a cofigured device start/enable the service usbip-bind@example-device.service

Client setup

For each host/device create a device.conf in /etc/usbip/remote-devices/ with HOST set and USBIP_DEVICE set to the vendor/product id, e.g.:

/etc/usbip/remote-devices/example-device.conf
USBIP_HOST=example-host
USBIP_DEVICE=0924:3d68

Make sure your server is running and the configured device is bound, then start or stop the service usbip@example-device.service

See also

  • Official USB/IP project site
  • Linux Kernel «README for usbip-utils»
  • «How To Setup and use USB/IP»
  • «USB/IP for Windows»
  • usbip(8)
  • usbipd(8)

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

Конечно можно использовать аппратное оборудование, например USBoverIP, однако оно стоит значительных денег. И вот наконец решение найдено. Я обнаружил отличный бесплатный проект , доступный по этому линку — http://usbip.sourcefrge.net/

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

Настройки сервера

1- Скачайте последний пакет по ссылке http://downloads.sourceforge.net/project/usbip/usbip/usbip-win-preview/usbip-win.zip?use_mirror=ignum

Я тестировал все под Ubuntu Karmic, поэтому мне необходимо было выполнить следующую команду:

usbip:~$ sudo aptitude install usbip

Затем необходимо загрузить следующие модули для возможности контролировать USB порты.

usbip:~$ sudo modprobe usbip
usbip:~$ sudo modprobe usbip_common_mod

 Теперь запустим usbip в качестве системного демона:

usbip:~$ usbipd -D
Bind usbip.ko to a usb device to be exportable!
usbip:~$ 

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

1- Подключите USB устройство к компьютеру

2- Выполните команду

lsusb

Для поиска соответствующего индентификатора Vendor/Device ID, который имеет следующую форму:

Bus XXX Device YYY: ID VendorID:DeviceID

Know that to find your favourite hardware ID, you can locate its possition on the BUS. Just match the ID with the result of usbip server check:

usbip:~$ sudo usbip_bind_driver --list
busid 1-6 (0c45:63ee)
               1-6:1.0 -  > uvcvideo
             1-6:1.1 -    > uvcvideo

Из этой команды нам становиться известне bus-ID, указывающий на USB устройство. В данном случае это «1-6».

Теперь подключаем устройство к серверу:

usbip:~$ sudo usbip_bind_driver --usbip 1-6

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

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

* Клиент MS Windows

Скачайте zip версию клиента по ссылке http://ignum.dl.sourceforge.net/project/usbip/usbip/usbip-win-preview/usbip-win.zip

Распакуйте её и выполните два простых шага.

Первое:

В архиве есть файл «bus.inf», который вам необходимо установить как «Generic system device» в своей системе.

Второе:

Выполните следующую команду из командной строки:

path-to-usbip:> usbip.exe -l <server-ip>

В результате выполнения этой команды вы увидите bus-ID, найденные на сервере.

Теперь подключите устройство следующей командой:

path-to-usbip:> usbip.exe -a <server-ip> USB-ID

** USB-ID в нашем случае 1-6.

Все!!! Вы увидите новое USB устройство, обнаруженное вашей системой.

* Клиент Gnu/Linux

В качестве клиента я тестировал дистрибутив  Ubuntu Karmic

Подобно настройке серверной части необходимо выполнить команду:

$ sudo apt-get install usbip

Загрузите модуль «vhci-hcd»:

$ sudo modprobe vhci-hcd

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

$ sudo usbip -l <server-ip>

А потом и подключить нужное устройство следующей командой:

$ sudo usbip -a <server-ip> X-Y

Интересное:

Самые низкие цены на окна пвх что я видел в Москве. Что вообщем и не удивительно, ведь у компании «Окна Комфорта» собственное производство.

Понравилась статья? Поделить с друзьями:
  • Usb optical mouse драйвер windows 7 скачать бесплатно 32 бита
  • Usb optical mouse driver windows 7 не устанавливается
  • Usb optical mouse driver windows 7 64 bit
  • Usb network joystick скачать драйвер windows 10 на русском
  • Usb multi channel audio device windows 10 скачать