Domar USB/IP

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 USB/IP cunha descrición dos obstáculos coidadosamente establecidos por varias persoas neste camiño, así como formas de evitalos.

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 TrendNet TU2-NU4
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: Proxecto USB/IP. Atrae con apertura, sobre todo porque os mozos de ReactOS asinaron un controlador para Windows, polo que agora todo funciona incluso en x64 sen muletas como un modo de proba. Polo que moitas grazas ao equipo de ReactOS! Todo soa bonito, intentemos sentilo, é realmente así? Desafortunadamente, o proxecto en si tamén está abandonado e non podes contar co apoio, pero onde o noso non desapareceu, a fonte está aí, descubrirémolo!

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

Engadir un comentario