Domar USB/IP

La tarea de conectar un dispositivo USB a una PC remota a través de una red local surge regularmente. Debajo del corte, se establece el historial de mis búsquedas en esta dirección y el camino hacia una solución lista para usar basada en un proyecto de código abierto. USB/IP con una descripción de los obstáculos colocados cuidadosamente por varias personas en este camino, así como las formas de sortearlos.

Primera parte, historica

Si la máquina es virtual, todo esto es fácil. La funcionalidad de reenvío USB desde un host a una máquina virtual apareció en VMWare 4.1. Pero en mi caso, la clave de seguridad, reconocible como WIBU-KEY, tenía que estar conectada en diferentes momentos a diferentes máquinas, y no solo virtuales.
La primera ronda de búsqueda en el lejano 2009 me llevó a una pieza de hierro llamada TrendNet TU2-NU4
Pros:

  • a veces incluso funciona

Contras:

  • no siempre funciona. Supongamos que la clave de protección Guardant Stealth II no se inicia a través de ella, jurando con el error "no se puede iniciar el dispositivo".
  • El software de gestión (lectura - montaje y desmontaje de dispositivos USB) es patético hasta el extremo. Interruptores de línea de comando, automatización: no, no lo he escuchado. Todo es solo a mano. Pesadilla.
  • el software de control busca la pieza de hierro en la red mediante la transmisión, por lo que solo funciona dentro de un segmento de la red de transmisión. No puede especificar la dirección IP de la pieza de hierro a mano. ¿Un trozo de hierro en otra subred? Entonces tienes un problema.
  • los desarrolladores anotaron en el dispositivo, es inútil enviar informes de errores.

La segunda ronda sucedió en tiempos no tan lejanos y me llevó al tema del artículo: Proyecto USB/IP. Atrae con apertura, especialmente porque los chicos de ReactOS firmaron un controlador para Windows, por lo que ahora todo funciona incluso en x64 sin muletas como un modo de prueba. ¡Por lo cual muchas gracias al equipo de ReactOS! Todo suena hermoso, tratemos de sentirlo, ¿es realmente así? Desafortunadamente, el proyecto en sí también está abandonado y no puede contar con el apoyo, pero donde el nuestro no desapareció, la fuente está ahí, ¡lo resolveremos!

Segunda parte, servidor-linux

Un servidor USB/IP que comparte dispositivos USB a través de una red solo se puede configurar en un sistema operativo basado en Linux. Bueno, Linux es Linux, instalamos Debian 8 en una máquina virtual en la configuración mínima, movimiento de mano estándar:

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install usbip

Establecido. Además, Internet sugiere que necesitaría descargar el módulo usbip, pero - hola, el primer rastrillo. No existe tal módulo. Y todo porque la mayoría de los manuales en la red se refieren a la antigua rama 0.1.x, y en la última 0.2.0 los módulos usbip tienen nombres diferentes.

Por lo tanto:

sudo modprobe usbip-core
sudo modprobe usbip-host
sudo lsmod | grep usbip

Bueno, agreguemos las siguientes líneas a /etc/modules para cargarlas automáticamente al iniciar el sistema:

usbip-core
usbip-host
vhci-hcd

Iniciemos el servidor usbip:

sudo usbipd -D

Además, la mente universal nos dice que usbip viene con scripts que nos permiten administrar el servidor: mostrar qué dispositivo compartirá a través de la red, ver el estado, etc. Aquí nos espera otra herramienta de jardín: estos scripts en la rama 0.2.x, nuevamente, han sido renombrados. Puede obtener una lista de comandos con

sudo usbip

Después de leer la descripción de los comandos, queda claro que para compartir el dispositivo USB requerido, usbip quiere saber su Bus ID. Estimados espectadores, el rastrillo número tres está en la arena: el Bus ID que nos dará lsusb (parecería la forma más obvia) - ¡no le conviene! El hecho es que usbip ignora hardware como concentradores USB. Por lo tanto, usaremos el comando integrado:

user@usb-server:~$ sudo usbip list -l
 - busid 1-1 (064f:0bd7)
   WIBU-Systems AG : BOX/U (064f:0bd7)

Nota: en adelante, en los listados, describiré todo utilizando el ejemplo de mi llave USB específica. El nombre de su hardware y el par VID:PID pueden y serán diferentes. El mío se llama Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Ahora podemos compartir nuestro dispositivo:

user@usb-server:~$ sudo usbip bind --busid=1-1
usbip: info: bind device on busid 1-1: complete

¡Saludos, camaradas!

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 hurras, camaradas! El servidor compartió la pieza de hierro a través de la red, ¡y podemos conectarla! Solo queda agregar el inicio automático del daemon usbip a /etc/rc.local

usbipd -D

Tercera parte, del lado del cliente y confusa

Intenté conectar el dispositivo compartido a través de la red a una máquina Debian de inmediato en el mismo servidor y todo se conectó bien:

sudo usbip attach --remote=localhost --busid=1-1

Pasemos a Windows. En mi caso fue Windows Server 2008R2 Standard Edition. La guía oficial le pide que instale el controlador primero. El procedimiento está perfectamente descrito en el archivo Léame adjunto al cliente de Windows, hacemos todo como está escrito, todo sale bien. En XP también funciona sin problemas.

Después de desempaquetar el cliente, intentamos montar nuestra clave:

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 salió mal. Usamos la habilidad de Google. Hay menciones fragmentarias de que algo anda mal con las constantes; en la parte del servidor, los desarrolladores cambiaron la versión del protocolo al cambiar a la versión 0.2.0, pero se olvidaron de hacerlo en el cliente Win. La solución propuesta es cambiar la constante en el código fuente y reconstruir el cliente.

Pero realmente no quiero descargar Visual Studio por este procedimiento. Pero tengo un buen viejo Hiew. En el código fuente, la constante se declara como una palabra doble. Busquemos en el archivo 0x00000106, reemplazándolo con 0x00000111. Recuerde, el orden de los bytes está invertido. El resultado son dos 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

Esto podría haber terminado la presentación, pero la música no sonó por mucho tiempo. ¡Después de reiniciar el servidor, descubrí que el dispositivo en el cliente no está montado!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) cannot find device

Y eso es. Incluso Google, que todo lo sabe, no pudo responderme esto. Y al mismo tiempo, el comando para mostrar los dispositivos disponibles en el servidor se muestra correctamente: aquí está, la clave, puede montarla. Intento montar desde Linux, ¡funciona! ¿Y si ahora intenta desde Windows? ¡Mierda, funciona!

El último rastrillo: algo no se agrega en el código del servidor. Al compartir un dispositivo, no lee la cantidad de descriptores USB del mismo. Y al montar el dispositivo desde Linux, este campo se llena. Desafortunadamente, estoy familiarizado con el desarrollo bajo Linux en el nivel "make && make install". Por lo tanto, el problema se resuelve con un truco bastante sucio: agregar a /etc/rc.local

usbip attach --remote=localhost --busid=1-1
usbip port
usbip detach --port=00

parte final

Después de algunos retoques, funciona. Se obtuvo el resultado deseado, ahora la clave se puede montar en cualquier PC (y desmontar, por supuesto, también), incluso fuera del segmento de la red de transmisión. Si lo desea, puede hacerlo mediante un script de shell. Lo que es bueno: el placer es absolutamente gratis.
Espero que mi experiencia ayude a habrazhiteli a sortear el rastrillo que se imprimió en mi frente. ¡Gracias por su atención!

Fuente: habr.com

Añadir un comentario