====== 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
++++ Установка сертификата и отключение цифровой подписи |
# На клиенте
$cert = "C:\temp\usbip-win-0.3.5\usbip_test.pfx"
$certPass = ConvertTo-SecureString -AsPlainText "usbip" -Force
Import-PfxCertificate -FilePath "$cert" -CertStoreLocation Cert:\LocalMachine\TrustedPublisher -Password $certPass
Import-PfxCertificate -FilePath "$cert" -CertStoreLocation Cert:\LocalMachine\Root -Password $certPass
# Ошибка отключения подписи драйверов
bcdedit /set TESTSIGNING ON
Произошла ошибка при задании данных элемента.
Значение защищено политикой безопасной загрузки и не может быть изменено или удалено.
# Решение - вход в загрузочное меню (Shift + reboot) и отключение подписи там.
++++
# Список локальных 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 "старое устройство" [[https://stackoverflow.com/questions/53864109/windows-driver-install-legacy-hardware-with-command-line-tool|тоже не ставится]].
===== Ссылки =====
[[https://www.linux-magazine.com/Issues/2018/208/Tutorial-USB-IP|Tutorial – USB/IP (LinuxMagazine)]]\\
[[https://itsecforu.ru/2022/03/15/%F0%9F%90%A7-%D0%BA%D0%B0%D0%BA-%D0%BF%D1%80%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%B8%D1%82%D1%8C-%D0%BE%D0%B1%D1%89%D0%B8%D0%B9-%D0%B4%D0%BE%D1%81%D1%82%D1%83%D0%BF-%D0%BA-usb-%D1%83%D1%81/|Как предоставить общий доступ к USB-устройству по сети]]\\
[[https://habr.com/ru/post/308860/|Укрощаем USB/IP]]\\
[[https://wiki.archlinux.org/title/USB/IP|USB/IP (ArchWiki)]]\\
[[https://wiki.astralinux.ru/pages/viewpage.action?pageId=79168306|Предоставление удалённого доступа к USB-носителям и токенам c помощью USB-over-IP (Astra Linux)]]\\
[[https://unix.stackexchange.com/questions/528769/usbip-startup-with-systemd|usbip startup with systemd]]\\
[[https://habr.com/ru/company/selectel/blog/668590/|USB over IP для личного использования: организовываем клиент-серверный комплекс на Linux и Windows]] (31.05.2022)\\
[[https://disweb.ru/linux/centos/usbip-na-centos-7-usb-cherez-set/|USBIP на CentOS 7 (USB через сеть)]] (10.03.2021)
https://github.com/cezanne/usbip-win ([[https://github.com/cezanne/usbip-win/releases/latest|releases]])\\
https://github.com/dorssel/usbipd-win
===== NIO Electronics EUSB4ep =====
https://nio-electronics.ru, клон https://www.virtualhere.com, который, в свою очередь, [[https://steamcommunity.com/app/440520/discussions/0/3130541122085973446/|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
...
{{:tasks:pasted:20230301-141900.png}}
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 ] [а] [-t ] [-p] [-q ] [-e] [-g]
[-r ] [-l ] [-m] [-d] [-x] [-i] [-b] [-u] [-y] [-w] [-n]
-h, --help Display this help
-c, --config= configuration file to use
-a, --admin administrator mode
-t, --control= Issue command to running client
-p, --preferipv6 Prefer IPv6/IPv4 dual-stack
-q, --language= 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= When used with arguments t/d/x/i/u, redirect output to file instead of console
-l, --log= 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]]