Содержание

USB через IP

Сервер Linux

# Установка
apt install linux-tools-common linux-tools-generic
 
# Версия
usbip version
 
# Вкл модуль ядра для сервера:
modprobe usbip-host
echo "usbip-host" >> /etc/modules
# Вкл службу
usbipd -D
 
# Вкл модуль ядра для клиента:
modprobe vhci-hcd
echo "vhci-hcd" >> /etc/modules
#modprobe usbip-vudc
#echo "usbip-vudc" >> /etc/modules

Клиент Windows

Ставить сертификат и отключать цифровую подпись драйверов не нужно с версии usbip-win 0.3.6-dev

Установка сертификата и отключение цифровой подписи

# Список локальных USB-устройств
usbip list -l
 
# Расшарить девайс из списка
usbip bind -b 1-1
# Убрать общий доступ
usbip unbind -b 1-1
 
# Список девайсов на сервере с клиента
usbip list -r 192.168.1.24
# Примонтировать на клиенте
usbip attach -r 192.168.1.24 -b 1-1
# Список примонтированных девайсов
usbip port
# Отмонтировать девайс по номеру порта из списка
usbip detach -p 1

Идея монтирования скриптом по фильтрации ID устройства (здесь: 0529:0001) не подходит, т. к. ID бывают одинаковыми у нескольких устройств, а задать имя или псевдоним для устройства невозможно. Поэтому только по номеру (3-3, 3-4), и вести таблицу соответствия.

Exportable USB devices
======================
 - 10.1.0.236
        3-4: Aladdin Knowledge Systems : HASP copy protection dongle (0529:0001)
           : /sys/devices/pci0000:00/0000:00:14.0/usb3/3-4
           : Vendor Specific Class / unknown subclass / unknown protocol (ff/00/00)

        3-3: Aladdin Knowledge Systems : HASP copy protection dongle (0529:0001)
           : /sys/devices/pci0000:00/0000:00:14.0/usb3/3-3
           : Vendor Specific Class / unknown subclass / unknown protocol (ff/00/00)
           :  0 - Vendor Specific Class / unknown subclass / unknown protocol (ff/00/00)

Решение проблем

Сервер - failed to open usb.ids

usbip: error: failed to open /usr/share/hwdata//usb.ids
# Решение:
mkdir /usr/share/hwdata
ln -s /usr/share/misc/usb.ids /usr/share/hwdata/usb.ids

Клиент - cannot find device

При попытке монтирования с клиента возникает ошибка

.\usbip.exe -a 10.1.0.236 3-3
usbip err: usbip_windows.c: 829 (attach_device) cannot find device
# При этом устройство с клиента видно
.\usbip.exe -l 10.1.0.236
- 10.1.0.236
     3-3: Aladdin Knowledge Systems : HASP v0.06 (0529:0001)
        : /sys/devices/pci0000:00/0000:00:14.0/usb3/3-3
        : Vendor Specific Class / unknown subclass / unknown protocol (ff/00/00)

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

usbip attach --remote=localhost --busid=3-3
sleep 3
usbip detach --port=00
usbip: info: Port 0 is now detached!

Клиент - usbvbus interface is not registered

При попытке монтирования с клиента возникает ошибка

.\usbip.exe -a 10.1.0.236 3-3
usbip err: usbip_windows.c:  62 (usbip_vbus_dev_node_name) usbvbus interface is not registered
usbip err: usbip_windows.c: 654 (import_device) open vbus driver
usbip err: usbip_windows.c: 840 (attach_device) query

Решение - необходимо поставить в систему «старое устройство» (USB/IP Enumerator), указав драйвер usbipenum.

Если просто установить usbipenum.inf, то это не поможет. Через pnputil «старое устройство» тоже не ставится.

Ссылки

Tutorial – USB/IP (LinuxMagazine)
Как предоставить общий доступ к USB-устройству по сети
Укрощаем USB/IP
USB/IP (ArchWiki)
Предоставление удалённого доступа к USB-носителям и токенам c помощью USB-over-IP (Astra Linux)
usbip startup with systemd
USB over IP для личного использования: организовываем клиент-серверный комплекс на Linux и Windows (31.05.2022)
USBIP на CentOS 7 (USB через сеть) (10.03.2021)

https://github.com/cezanne/usbip-win (releases)
https://github.com/dorssel/usbipd-win

NIO Electronics EUSB4ep

https://nio-electronics.ru, клон https://www.virtualhere.com, который, в свою очередь, is most likely just a copy of usbip.

Модель NIO-EUSB 4ep

root@usb:~# lsb_release -a
LSB Version:    n/a
Distributor ID: poky
Description:    Poky (Yocto Project Reference Distro) 3.1.17
Release:        3.1.17
Codename:       dunfell
 
root@usb:~# uname -a
Linux usb 5.15.48 #1 SMP Thu Jun 16 11:30:35 UTC 2022 armv7l GNU/Linux
 
root@usb:~# cat /proc/cpuinfo
processor       : 0
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 37.89
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 4
 
processor       : 1
model name      : ARMv7 Processor rev 4 (v7l)
BogoMIPS        : 37.89
Features        : half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt vfpd32 lpae evtstrm
CPU implementer : 0x41
CPU architecture: 7
CPU variant     : 0x0
CPU part        : 0xc07
CPU revision    : 4
 
Hardware        : Allwinner sun7i (A20) Family
Revision        : 0000
Serial          : 165166450942d681
 
root@usb:~# cat /proc/meminfo
MemTotal:        1026384 kB
MemFree:          836840 kB
MemAvailable:     870952 kB
...

root@usb:~# cat /opt/nioeusb/service/niousbsh.cfg
AutoAttachToKernel=1
ClaimPorts=0
DisableEasyFind=1
HideClientInfo=${VHHideClientInfo}
License=${VHLicense}
MDNSServiceName=_rhusb._tcp
ServerName=${VHServerName}
TCPPort=${VHTCPPort}
UseAVAHI=${VHUseAVAHI}
UseAvahiServiceFile=0
clientAuthorization=/opt/nioeusb/service/clientAuthorization.sh "$VENDOR_ID$" "$PRODUCT_ID$" "$CLIENT_ID$" "$CLIENT_IP$" "$PRODUCT_SERIAL$" "$PASSWORD$" "$DEVPATH$" "$NICKNAME$" "$NUM_BINDINGS$"
clientDeauthorization=/opt/nioeusb/service/clientDeauthorization.sh "$VENDOR_ID$" "$PRODUCT_ID$" "$CLIENT_ID$" "$CLIENT_IP$" "$PRODUCT_SERIAL$" "$PASSWORD$" "$DEVPATH$" "$NICKNAME$"
onChangeNickname=/opt/nioeusb/service/onChangeNickname.sh "$VENDOR_ID$" "$PRODUCT_ID$" "$NICKNAME$" "$NEW_NICKNAME$" "$CLIENT_ID$" "$CLIENT_IP$" "$DEVPATH$"
onDeviceIgnore=/opt/nioeusb/service/onDeviceIgnore.sh "$VENDOR_ID$" "$PRODUCT_ID$" "$CLIENT_ID$" "$CLIENT_IP$"
onDeviceKick=/opt/nioeusb/service/onDeviceKick.sh "$VENDOR_ID$" "$PRODUCT_ID$" "$KICKER_ID$" "$KICKER_IP$" "$CLIENT_ID$" "$CLIENT_IP$" "$PRODUCT_SERIAL$" "$DEVPATH$" "$NICKNAME$"
onServerRename=/opt/nioeusb/service/onServerRename.sh "$NEW_NAME$"
It=1600598652
EasyFindId=KX1vnwHEhNimJz3HjRcHJ5
EasyFindPin=3yfYna
 
root@usb:~# cat /opt/nioeusb/service/niousbsh.env
VHLicense=02450942d681,4,MCICD...XP8
VHHideClientInfo=0
VHTCPPort=17602
VHServerName=usb
VHUseAVAHI=0
SSLCert=/etc/niousb/niousbVH.pem
SSLPort=17601
 
root@usb:~# cat /etc/niousb/niousbVH.pem
cat: can't open '/etc/niousb/niousbVH.pem': No such file or directory
root@usb:~# cat /var/log/messages
Mar  1 17:05:19 niousb syslog.info syslogd started: BusyBox v1.31.1
Mar  1 17:05:19 niousb cron.info crond[172]: (CRON) STARTUP (1.5.5)
Mar  1 17:05:19 niousb cron.info crond[172]: (CRON) INFO (Syslog will be used instead of sendmail.)
Mar  1 17:05:19 niousb cron.info crond[172]: (CRON) INFO (RANDOM_DELAY will be scaled with factor 59% if used.)
Mar  1 17:05:24 niousb user.info vhusbdarmpi2[214]: >>> Starting VirtualHere USB Server v4.4.7 (Built: Dec 10 2022, 21:26:07)<<<
Mar  1 17:05:24 niousb user.info vhusbdarmpi2[214]: Using configuration /opt/nioeusb/service/niousbsh.cfg
Mar  1 17:05:25 niousb user.info vhusbdarmpi2[217]: Server licensed to=02450942d681 max_devices=4
Mar  1 17:05:25 niousb user.info vhusbdarmpi2[217]: Using large URB's
Mar  1 17:05:25 niousb user.info vhusbdarmpi2[217]: Listening on all network interfaces at TCP port 17602
Mar  1 17:05:25 niousb user.info vhusbdarmpi2[217]: Found Low speed device [0529:0001] "AKS, HASP HL 3.25" at address 212
Mar  1 17:05:25 niousb user.info vhusbdarmpi2[217]: Found High speed device [0c45:6341] "HD 720P Webcam, HD 720P Webcam" at address 213
Mar  1 17:05:25 niousb user.info vhusbdarmpi2[217]: Found Low speed device [0529:0001] "AKS, HASP 2.17" at address 211
Mar  1 17:05:25 niousb user.info vhusbdarmpi2[217]: Found High speed device [8564:1000] "JetFlash, Mass Storage Device" at address 214
Mar  1 17:05:31 niousb user.info vhusbdarmpi2[217]: 192.168.1.59 connected as connection 1 (Standard TCP)
Mar  1 17:05:40 niousb user.info vhusbdarmpi2[217]: 192.168.1.138 connected as connection 2 (Standard TCP)
Mar  1 17:09:29 niousb user.info vhusbdarmpi2[217]: Unmanaging device 214 [8564:1000]
Mar  1 17:10:26 niousb user.info vhusbdarmpi2[217]: Unmanaging device 211 [0529:0001]
Mar  1 17:10:27 niousb user.info vhusbdarmpi2[217]: Unmanaging device 212 [0529:0001]
Mar  1 17:10:29 niousb user.info vhusbdarmpi2[217]: Unmanaging device 213 [0c45:6341]
Mar  1 17:11:04 niousb user.info vhusbdarmpi2[217]: Connection 2 remotely disconnected gracefully (rx msg size)
Mar  1 17:11:15 niousb user.info vhusbdarmpi2[217]: Connection 2 successfully removed (reason:timeout)
Mar  1 17:23:51 niousb user.info vhusbdarmpi2[217]: Connection 1 remotely disconnected gracefully (rx msg size)
Mar  1 17:23:53 niousb user.info vhusbdarmpi2[217]: 10.1.53.59 connected as connection 3 (Standard TCP)
Mar  1 17:23:57 niousb user.info vhusbdarmpi2[217]: Connection 1 successfully removed (reason:timeout)
Mar  1 17:30:01 niousb cron.info CROND[281]: (root) CMD (/usr/bin/ntpdate-sync silent)
Mar  1 17:36:19 niousb auth.info sshd[287]: User root authorized keys /dev/null is not a regular file
Mar  1 17:36:22 niousb auth.info sshd[287]: Accepted password for root from 192.168.1.138 port 55473 ssh2

Клиент

# Имя службы
rhclient
# Отображаемое имя
USB Hub Over Network USB Sharing
# Описание
Provides virtualized access to USB devices over a network
# Параметры запуска службы
"C:\Users\username\Downloads\rhcl64.exe\rhcl64.exe" -n --config="C:\Users\username\AppData\Roaming\rhcl.ini"

Help

USB Hub Over Network 5.2.8, USB Hub Over Network
Usage: rhcl64 [-h][-c <str>] [а] [-t <str>] [-p] [-q <str>] [-e] [-g]
[-r <str>] [-l <str>] [-m] [-d] [-x] [-i] [-b] [-u] [-y] [-w] [-n] 

-h, --help                Display this help
-c, --config=<str>         configuration file to use
-a, --admin               administrator mode
-t, --control=<str>       Issue command to running client
-p, --preferipv6          Prefer IPv6/IPv4 dual-stack
-q, --language=<str>       Set language [EN-US, ZH-CN, FR-FR, RU-RU, DE-DE, IT-IT, ES-AR]
-e, --autofind-off        Start with auto-find off
-g, --start-minimized     Start the client minimized
-r, --redirect=<str>      When used with arguments t/d/x/i/u, redirect output to file instead of console
-l, --log=<str>             log file to write ('OsEventLog'=Event Log)
-m
-d, --install-drivers     install drivers
-x, --extract-drivers     extract drivers
-i, --install-service     Install client as a service (autofind on by default)
-b, --install-service-na  Install client as service (autofind off by default)
-u, --uninstall-service   Uninstall service
-y, --uninstall-drivers   Uninstall drivers
-w
-n

rhcl.ini

[General]
AutoFind=0
MainFrameWidth=400
MainFrameHeight=250
MainFrameX=1096
MainFrameY=82
SSLClientCert=
SSLCAFile=
QualifyByName=1
QualifyByInterface=0
AutoUseDelaySec=0
RetryAutoUseDelaySec=2
AutoRefreshLookupPeriod=30
BonjourLookupTimeout=4
BonjourResolverTimeout=2
Language=RU-RU
SSLPort=17601
ReverseLookup=0
AutoMinimize=1
[Settings]
ManualHubs=usb.example.com:17602
[AutoShare]
usb.212=0
usb.1.1321.212=0
usb.1.1321=0
All=1
[Transport]
PingInterval=3
PingTimeout=10
CompressionLimit=384

Решение проблем

Есть ERP-система Галактика, был проброшен ключ, всё работает, установлена служба и для ключа установлена опция Auto-Use Device/Port. Но после перезагрузки сервера клиент usb ключ видит и он подключен, а ERP-система - нет. Постановка службы ключа ERP в зависимость от службы USB Hub Over Network USB Sharing ничего не меняет.

reg add HKLM\SYSTEM\CurrentControlSet\Services\HWServer /v DependOnService /t REG_MULTI_SZ /d rhclient /f

Решение - переключить службу ключа ERP в ручной запуск, а в планировщике сделать запуск скрипта при загрузке компьютера (система очень старая, powershell нет):

ping 127.0.0.1 -n 20
net start hwserver

Вопросы/ответы

Настройки, например, ограничения порта на IP-адрес надо делать на обеих нодах отдельно? Синхронизации настроек между нодами не существует?
Настройки, сделанные в NIO-EUSB на кластерном IP синхронизируются с backup-нодой.

Если задавать алиас для USB-устройства, служба USB перезапускается. Это влияет на ключи, которые уже работают? Повлияет ли это на доступность сервисов, которым нужен доступ к ключам?
В разделе Admin ACL в разделе Rename можно добавить доверенный IP, и можно с этого IP с клиента без рестарта переименовывать устройства.

Без рестарта только с клиента? Если делать на вкладке Ports на сервере, то в любом случае будет рестарт?
Переименовывать alias да, смена acl и description не требует рестарт.

Каким образом keepalived переключается с одной ноды на другую? Если он переключился на вторую ноду, то обратно он не переключается, даже если первая опять доступна?
Keepalived переключает мастер на слейв при потере мастером сети или недоступностью мастера. Ноды равнозначны, после возврата старого мастера в строй, переключений не происходит, дабы избежать лишние.

Ранее вы мне сообщили, что алиас можно переименовывать с клиента без перезапуска службы USB. Я переименовал его с клиента, но на самом сервере алиас остаётся пустым.
Конфигурирование проводилось на кластерном IP. Почему алиас не прописывается на устройстве?

Необходимо обновить веб-страницу (Ctrl-R). Полоса загрузки сверху каждые несколько секунд - это проверка информации о подключенных usb-портах.
Постоянно конфигурацию считывать смысла нет, переименование со стороны клиента это скорее как внешнее событие, нам можно подумать, как считывать его, если повлияло внешнее событие.

Где можно найти changelog прошивок?
https://nio-electronics.ru/ru/support/changes-server.txt