====== 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]]