Xorde regularmente a tarefa de conectar un dispositivo USB a un PC remoto a través dunha rede local. Baixo o corte, exponse o historial das miñas buscas nesta dirección e o camiño cara a unha solución preparada baseada nun proxecto de código aberto
Primera parte, histórica
Se a máquina é virtual, todo isto é sinxelo. A funcionalidade de reenvío USB desde un host a unha máquina virtual apareceu en VMWare 4.1. Pero no meu caso, a chave de seguridade, recoñecible como WIBU-KEY, tiña que estar conectada en diferentes momentos a diferentes máquinas, e non só virtuais.
A primeira rolda de busca no afastado 2009 levoume a unha peza de ferro chamada
Pros:
- ás veces mesmo funciona
Contras:
- non sempre funciona. Supoñamos que a chave de protección Guardant Stealth II non comeza a través dela, xurando co erro "non se pode iniciar o dispositivo".
- O software de xestión (leer - montar e desmontar dispositivos USB) é patético ata o extremo. Interruptores de liña de comandos, automatización - non, non oín. Todo é só a man. Pesadelo.
- o software de control busca a propia peza de ferro na rede mediante a emisión, polo que isto só funciona dentro dun segmento de rede de emisión. Non podes especificar a man o enderezo IP da peza de ferro. Un anaco de ferro noutra subrede? Entón tes un problema.
- programadores puntuaron no dispositivo, é inútil enviar informes de erros.
A segunda rolda ocorreu en tempos non tan distantes e levoume ao tema do artigo:
Segunda parte, servidor-linux
Un servidor USB/IP que comparte dispositivos USB nunha rede só se pode configurar nun sistema operativo baseado en Linux. Ben, Linux é Linux, así que instáleo na máquina virtual Debian 8 coa configuración mínima, movemento estándar da man:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbip
Asentado. Ademais, Internet suxire que tería que descargar o módulo usbip, pero - ola, o primeiro rake. Non existe tal módulo. E todo porque a maioría dos manuais da rede fan referencia á rama máis antiga 0.1.x, e na última 0.2.0 os módulos usbip teñen nomes diferentes.
Polo tanto:
sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip
Ben, imos engadir as seguintes liñas a /etc/modules para cargalas automaticamente ao iniciar o sistema:
usbip-core
usbip-host
vhci-hcd
Imos iniciar o servidor usbip:
sudo usbipd -D
Ademais, a mente universal dinos que usbip vén con scripts que nos permiten xestionar o servidor: mostrar que dispositivo compartirá na rede, ver o estado, etc. Aquí espéranos outra ferramenta de xardín: estes scripts da rama 0.2.x, de novo, foron renomeados. Podes obter unha lista de comandos con
sudo usbip
Despois de ler a descrición dos comandos, queda claro que para compartir o dispositivo USB necesario, usbip quere coñecer o seu ID de bus. Queridos espectadores, o rake número tres está na area: o Bus ID que nos dará lsusb (parecería o xeito máis obvio) - non lle convén! O feito é que usbip ignora o hardware como os concentradores USB. Polo tanto, usaremos o comando integrado:
user@usb-server:~$ sudo usbip list -l
- busid 1-1 (064f:0bd7)
WIBU-Systems AG : BOX/U (064f:0bd7)
Nota: a continuación nos listados describirei todo usando o exemplo da miña chave USB específica. O nome do teu hardware e o par VID:PID poden diferir e serán diferentes. O meu chámase Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.
Agora podemos compartir o noso dispositivo:
user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete
Hurra, compañeiros!
user@usb-server:~$ sudo usbip list -r localhost
Exportable USB devices
======================
- localhost
1-1: WIBU-Systems AG : BOX/U (064f:0bd7)
: /sys/devices/pci0000:00/0000:00:11.0/0000:02:00.0/usb1/1-1
: Vendor Specific Class / unknown subclass / unknown protocol (ff/00/ff)
Tres ánimos, compañeiros! O servidor compartiu a peza de ferro pola rede e podemos conectala! Só queda engadir o inicio automático do daemon usbip a /etc/rc.local
usbipd -D
Terceira parte, lado do cliente e confusa
Tentei conectar o dispositivo compartido a través da rede a unha máquina Debian de inmediato no mesmo servidor e todo conectou ben:
sudo usbip attach --remote=localhost --busid=1-1
Pasemos a Windows. No meu caso foi Windows Server 2008R2 Standard Edition. A guía oficial pídelle que instale primeiro o controlador. O procedemento está perfectamente descrito no readme adxunto ao cliente de Windows, facemos todo tal e como está escrito, todo funciona. En XP tamén funciona sen problemas.
Despois de desempaquetar o cliente, tentamos montar a nosa chave:
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_network.c: 121 (usbip_recv_op_common) recv op_common, -1
usbip err: usbip_windows.c: 756 (query_interface0) recv op_common
usbip err: usbip_windows.c: 829 (attach_device) cannot find device
Oh oh. Algo saíu mal. Usamos a habilidade de Google. Hai mencións fragmentarias de que algo está mal coas constantes; na parte do servidor, os desenvolvedores cambiaron a versión do protocolo ao cambiar á versión 0.2.0, pero esquecéronse de facelo no cliente Win. A solución proposta é cambiar a constante no código fonte e reconstruír o cliente.
Pero realmente non quero descargar Visual Studio polo feito deste procedemento. Pero teño un bo Hiew vello. No código fonte, a constante declárase como unha palabra dobre. Busquemos no ficheiro 0x00000106, substituíndoo por 0x00000111. Lembra que a orde dos bytes está invertida. O resultado son dous partidos, parche:
[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11
Eeeee... si!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
new usb device attached to usbvbus port 1
Así puido rematar a presentación, pero a música non soou por moito tempo. Despois de reiniciar o servidor, descubrín que o dispositivo no cliente non está montado.
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device
E iso é todo. Nin sequera Google que o sabe todo puido responderme. E ao mesmo tempo, o comando para mostrar os dispositivos dispoñibles no servidor amosa correctamente: aquí está, a clave, podes montala. Intento montar desde Linux: funciona! E se agora proba dende Windows? Ai merda, funciona!
O último rake: non se engade algo no código do servidor. Ao compartir un dispositivo, non le o número de descritores USB deste. E ao montar o dispositivo desde Linux, este campo énchese. Desafortunadamente, estou familiarizado co desenvolvemento baixo Linux no nivel de "facer e instalar". Polo tanto, o problema resólvese cun pirateo bastante sucio - engadindo a /etc/rc.local
usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00
Parte final
Despois de xogar, funciona. Obtívose o resultado desexado, agora a chave pódese montar en calquera PC (e desmontar, por suposto, tamén), incluídos os fóra do segmento da rede de transmisión. Se queres, podes facelo usando un script de shell. O que é bo - o pracer é absolutamente gratuíto.
Espero que a miña experiencia axude a habrazhiteli a sortear o anciño que se imprimiu na miña fronte. Grazas pola súa atención!
Fonte: www.habr.com