Привет, Хабр! В прошлой статье мы рассмотрели историю и принцип работы технологии 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. Чтобы добавить для них драйверы, нужно использовать утилиту ручной настройки «Мастер установки оборудования».
Для этого необходимо:
- Зайти в диспетчер устройств → Действие → Установить старое устройство.
- Выбрать пункт с ручной установкой оборудования и вместо конкретного типа оборудования выбрать пункт Показать все устройства. Далее выбираем Установить с диска и выбираем USBIPEnum.Inf файл из распакованного архива.
- Мастер установки распознает оборудование 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
andusbip_vhci
projects’ Target OS version toWindows 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.
- Right-click on the
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
andusbip_vhci
projects- Right-click on the
Project > Properties > Driver Signing > Test Certificate
- Browse to
driver/usbip_test.pfx
(password: usbip)
- Right-click on the
- 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
- «Trusted Root Certification Authority» in «Local Computer» (not current user) and
- «Trusted Publishers» in «Local Computer» (not current user)
- Install
- 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
- You can find
- 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:
- You can get id from usbip listing
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
andusbip_stub.sys
files should be in the same folder asusbip.exe
> usbip.exe bind -b 1-59
- The next command replaces the existing function driver with usbip stub driver
- 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
- «Trusted Root Certification Authority» in «Local Computer» (not current user) and
- «Trusted Publishers» in «Local Computer» (not current user)
- Install
- 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)
, copyusbip.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)
, copyusbip.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.
- If you’re testing
- 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 onlyPS> 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».
- You can install using
- 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 messageTraceView.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 defineDEBUG_PDU
at the head of the file - compile
usbip.exe
orusbipd.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 или правой кнопкой по Этот компьютер в проводнике — Управление — Диспетчер устройств).
Кликаем по Действие — Установить старое устройство:
Выбираем ручную установку устройства — показать все устройства — Установка с диска и выбираем файл 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:
* было
* стало
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
Программа создаст в Windows отдельную службу usbipd (USBIP Device Host):
"C:Program Filesusbipd-winusbipd.exe" server,
которая слушает на порту TCP 3240
Для программы 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
В 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
- Если вы используете 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 устройство на другой компьютер с 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
WSL может смонтировать таким образом диски с FAT, ExFAT, ReFs или NTFS, а также VHD образы.
Таким образом usbipd-win можно использовать для сквозной передачи физических USB устройств из Windows в WSL, в виртуальные машину или физические компьютер с Linux по сети с помощью USBOverIP
Содержание
- USB over IP для личного использования: организовываем клиент-серверный комплекс на Linux и Windows
- Настройка сервера
- Настройка клиента на Linux
- Настройка клиента на Windows
- Автоматизация клиента и сервера
- Автоматизация серверной части
- Автоматизация клиентской части (Windows)
- Автоматизация клиентской части (Linux)
- Как USBIP в очередной раз «спас мир»
- Укрощаем USB/IP
- Часть первая, историческая
- Часть вторая, серверно-линуксовая
- Часть третья, клиентская и запутанная
- USB over IP для личного использования: организовываем клиент-серверный комплекс на Linux и Windows
- Настройка сервера
- Настройка клиента на Linux
- Настройка клиента на Windows
- Автоматизация клиента и сервера
- Автоматизация серверной части
- Автоматизация клиентской части (Windows)
- Автоматизация клиентской части (Linux)
- Как 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. Чтобы добавить для них драйверы, нужно использовать утилиту ручной настройки «Мастер установки оборудования».
Для этого необходимо:
- Зайти в диспетчер устройств → Действие → Установить старое устройство.
- Выбрать пункт с ручной установкой оборудования и вместо конкретного типа оборудования выбрать пункт Показать все устройства. Далее выбираем Установить с диска и выбираем USBIPEnum.Inf файл из распакованного архива.
- Мастер установки распознает оборудование 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. Чтобы добавить для них драйверы, нужно использовать утилиту ручной настройки «Мастер установки оборудования».
Для этого необходимо:
- Зайти в диспетчер устройств → Действие → Установить старое устройство.
- Выбрать пункт с ручной установкой оборудования и вместо конкретного типа оборудования выбрать пункт Показать все устройства. Далее выбираем Установить с диска и выбираем USBIPEnum.Inf файл из распакованного архива.
- Мастер установки распознает оборудование 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
Интересное:
Самые низкие цены на окна пвх что я видел в Москве. Что вообщем и не удивительно, ведь у компании «Окна Комфорта» собственное производство.