USB over IP в домашни условия

Понякога се появява желанието да работите с устройство, свързано чрез USB, без да го държите на масата до лаптопа. В моем случай такова устройство е китайският гравюр с лазер от 500 мВт, нещо доста неприятно при близък контакт. Освен непосредствената опасност за очите, по време на работа с лазера се отделят токсични продукти от горене, затова устройството трябва да бъде в добре проветривано помещение и за предпочитане изолирано от хора. А как да управляваме такова устройство? Отговорът на този въпрос случайно открих, преглеждайки репозитория OpenWRT в надежда да намеря достойно приложение за стария маршрутизатор D-Link DIR-320 A2. За свързване реших да използвам описваното по-рано на Хабра USB over IP тунел, но всички инструкции за неговото инсталиране вече бяха загубили актуалност, затова пиша своя.

OpenWRT — операционна система, която не се нуждае от представяне, затова няма да описвам инсталацията ѝ. За моя маршрутизатор взех последната стабилна версия OpenWrt 19.07.3 и я свързах с основната точка за достъп по Wi-Fi като клиент, избирайки режим lan, за да не мъча защитната стена.

Серверна част

Действаме според официалната инструкция. След свързване по ssh инсталираме необходимите пакети.

root@OpenWrt:~# opkg update
root@OpenWrt:~# opkg install kmod-usb-ohci usbip-server usbip-client

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

Опитваме да изведем списък на свързаните устройства:

root@OpenWrt:~# usbip list -l

Празно.

Чрез гуглене намерих виновника, а именно библиотеката libudev-fbsd.
Изтегляме ръчно последната работеща версия от репозитория libudev_3.2-1 от версията OpenWRT 17.01.7 за моята архитектура, в моя случай това е libudev_3.2-1_mipsel_mips32.ipk. С помощта на wget/scp я зареждаме в паметта на маршрутизатора и преинсталираме

root@OpenWrt:~# opkg remove --force-depends libudev-fbsd
root@OpenWrt:~# opkg install libudev_3.2-1_mipsel_mips32.ipk

Проверяваме:

root@OpenWrt:~# usbip list -l
 - busid 1-1.1 (090c:1000)
   Silicon Motion, Inc. - Taiwan (преди Feiya Technology Corp.) : Флаш устройство (090c:1000)

 - busid 1-1.4 (1a86:7523)
   QinHeng Electronics : HL-340 USB-сериален адаптер (1a86:7523)

Китаецът, свързан в USB хъба, получи bsuid 1-1.4. Запомнихме.

Сега стартираме демона:

root@OpenWrt:~# usbipd -D

и биндим китайца

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

Проверяваме дали всичко работи:

root@OpenWrt: /home# netstat -alpt
Активни интернет връзки (сервиз и установени)
Протокол Ресив-Q Изпрати-Q Локален адрес           Чужд адрес         Състояние       PID/Име на програмата
tcp        0      0 0.0.0.0:3240            0.0.0.0:*               СЛУШАМ      1884/usbipd

За да свържем устройството автоматично, ще редактираме /etc/rc.local, добавяйки преди exit 0 следното:

usbipd -D &
sleep 1
usbip bind -b 1-1.4

Клиентска част

Ще опитаме да свържем устройството с Windows 10, използвайки гореспоменатата инструкция от openwrt.org. Веднага казвам: начинанието е обречено на провал. Първо, разглежда се само Windows 7 x64. На второ място, дадена е връзка към тема на sourceforge.net, в която се предлага да се изтегли патчнат драйвер от Dropbox от 2014 година. При опит за стартиране под Windows 10 и свързване с нашето устройство получаваме грешка:

c:Utilsusbip>usbip -a 192.168.31.203 1-1.4
usbip за windows ($Id$)

*** ГРЕШКА: не може да се намери устройството

Свързано е с факта, че клиентът не работи със сървър, събран под ядро по-старо от версия 3.14.
Сървърът usbip под OpenWRT 19.07.3 е събран на ядро 4.14.180.

Като продължавам търсенето, попадам на актуално разработен Windows клиент на github. Ок, заявена е поддръжка на Windows 10 x64, но клиентът е само тестов и затова има редица ограничения.

Така първо искат да инсталирате сертификат, освен това два пъти. Ок, поставяме го в Trusted Root Certification Authority и Trusted Publishers.

След това е необходимо да се преведе операционната система в тестов режим. Това става с командата

bcdedit.exe /set TESTSIGNING ON

От първия път не успях, пречеше ми secure boot. За да го деактивирате, е необходимо да се рестартира в UEFI и да се зададе secure boot — disable. На някои модели лаптопи може да се изисква да се зададе парола на супервайзера.

След това влизаме в Windows и правим bcdedit.exe /set TESTSIGNING ON
Windows казва, че всичко е наред. Отново се рестартираме и виждаме в долния десен ъгъл надпис Test Mode, версията и номера на билд-а на ОС.

Каква е целта на всички тези манипулации? За инсталиране на неподписан драйвер USB/IP VHCI. Предлага се да се направи това, като се изтеглят файловете usbip.exe, usbip_vhci.sys, usbip_vhci.inf, usbip_vhci.cer, usbip_vhci.cat, и се изпълняват с права на администратор

usbip.exe install

или вторият начин, инсталиране на Legacy Hardware в ръчен режим. Избрах втория вариант, получих предупреждение за инсталиране на неподписан драйвер и се съгласих с него.

След това проверяваме дали можем да се свържем с отдалеченото USB-устройство, изпълнявайки командата:

usbip.exe list -r

получаваме списък с устройства:

c:Utilsusbip>usbip.exe list -r 192.168.31.203
usbip: грешка: не успя да отвори базата данни за usb идентификатори
Износими USB устройства
======================
 - 192.168.31.203
      1-1.4: неизвестен производител : неизвестен продукт (1a86:7523)
           : /sys/devices/ssb0:1/ehci-platform.0/usb1/1-1/1-1.4
           : неизвестен клас / неизвестен подтип / неизвестен протокол (ff/00/00)

за грешка usbip: грешка: не успя да отвори базата данни за usb идентификатори не му обръщаме внимание, не влияе на работата.

Сега биндим устройството:

c:Utilsusbip>usbip.exe attach -r 192.168.31.203 -b 1-1.4

Всичко, Windows откри ново устройство, сега можем да работим с него така, сякаш е физически свързано към лаптопа.

С китайския гравьор трябваше малко да се измъча, тъй като при опит за инсталиране на драйвера CH341SER чрез предоставения с гравьора инсталатор (да, гравьорът е на Arduino), USB/IP VHCI сряга Windows до BSOD. Въпреки това, инсталацията на драйвера CH341SER до при свързване на устройството чрез usbip.exe решава проблема.

Резултат: гравьорът шумни и дими на кухнята при отворен прозорец и затворена врата, наблюдавам процеса на изгаряне от друга стая чрез собствения софтуер, който не разпознава измамата.

Използвани източници:

https://openwrt.org/docs/guide-user/services/usb.iptunnel
https://github.com/cezanne/usbip-win

Източник: habr.com

Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри 🔥 Купете надежден хостинг за сайтове с защита от DDoS, VPS VDS сървъри | ProHoster