Domando USB/IP

Regularmente surge a necessidade de conectar um dispositivo USB a um PC remoto através de uma rede local. Abaixo está a história das minhas buscas nesse sentido e o caminho para uma solução pronta baseada em um projeto open-source. USB/IP com a descrição das várias dificuldades instaladas por diferentes pessoas nesse caminho, bem como dos métodos para superá-las.

Parte um, histórica

Se a máquina é virtual, tudo isso não é complicado. A funcionalidade de redirecionamento USB do host para a virtual já existe desde o VMWare 4.1. Mas, no meu caso, a chave de proteção, reconhecida como WIBU-KEY, precisava ser conectada a diferentes máquinas ao longo do tempo, e não apenas virtuais.
O primeiro giro da busca em 2009 me levou a um dispositivo chamado TrendNet TU2-NU4
Acesso direto aos sistemas de cabos transpacíficos. Ping mínimo para a China, Japão, Austrália e costa oeste dos EUA.

  • às vezes até funciona

Pontos negativos:

  • não funciona sempre. Por exemplo, a chave de proteção Guardant Stealth II não é reconhecida por ela, mostrando um erro de "o dispositivo não pode ser iniciado".
  • O software de gerenciamento (leia-se — montagem e desmontagem de dispositivos USB) é extremamente limitado. Chaves de linha de comando, automação — não, nunca ouviram falar. Tudo é feito manualmente. Um pesadelo.
  • o software de controle procura o próprio dispositivo na rede por meio de broadcast, portanto isso só funciona dentro de um único segmento de broadcast da rede. Não é possível especificar manualmente o endereço IP do dispositivo. O dispositivo está em uma sub-rede diferente? Então você tem um problema.
  • os desenvolvedores abandonaram o dispositivo, enviar relatórios de bugs é inútil.

O segundo giro aconteceu em um tempo não tão distante, e me levou ao tema do artigo — projeto USB/IP. Atrai pela sua abertura, especialmente porque os caras do ReactOS forneceram um driver para Windows, então agora até em x64 tudo funciona sem qualquer atalho como o modo de teste. Agradecimento especial à equipe do ReactOS! Parece tudo bonito, vamos testar para ver se realmente funciona? Infelizmente, o projeto também foi abandonado, e não podemos contar com suporte — mas onde nossa determinação não falha, o código-fonte está aí, vamos descobrir!

Parte dois, servidora-linux

O servidor USB/IP, que compartilha dispositivos USB pela rede, só pode ser configurado em um sistema operacional baseado em Linux. Pois bem, se é para ser Linux, vamos instalar no Debian 8 em uma configuração mínima, o movimento padrão manual:

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

Foi instalado. A seguir, a internet sugere que precisamos carregar o módulo usbip, mas — olá, os primeiros obstáculos. Não existe tal módulo. E tudo isso porque a maioria dos guias na rede se refere a uma versão mais antiga 0.1.x, enquanto na versão mais recente 0.2.0, os módulos usbip têm nomes diferentes.

Portanto:

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

Vamos adicionar as seguintes linhas em /etc/modules, para carregá-las automaticamente ao iniciar o sistema:

usbip-core
usbip-host
vhci-hcd

Vamos iniciar o servidor usbip:

sudo usbipd -D

Em seguida, a sabedoria coletiva nos informa que junto com o usbip vêm scripts que nos permitem gerenciar o servidor — mostrando qual dispositivo ele compartilhará na rede, verificando o status, e assim por diante. Aqui, encontramos mais uma armadilha — esses scripts na versão 0.2.x, novamente, foram renomeados. Para obter a lista de comandos, podemos usar

sudo usbip

Após ler a descrição dos comandos, fica claro que para compartilhar o dispositivo USB requerido, o usbip precisa saber seu Bus ID. Caros espectadores, chega a terceira armadilha: o Bus ID que será fornecido por lsusb (aparentemente, o caminho mais óbvio) — não serve! Isso porque equipamentos como hubs USB são ignorados pelo usbip. Portanto, vamos usar o comando embutido:

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

Nota: aqui e nos listados a seguir, descreverei tudo com base no meu pen drive USB específico. O nome do seu dispositivo e a combinação VID:PID podem ser diferentes. O meu se chama Wibu-Systems AG: BOX/U, VID 064F, PID 0BD7.

Agora podemos compartilhar nosso dispositivo:

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

Hurra, camaradas!

user@usb-server:~$ sudo usbip list -r localhost
Dispositivos USB exportáveis
======================
 - 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
           : Classe Específica do Fornecedor / subclasse desconhecida / protocolo desconhecido (ff/00/ff)

Três vezes hurra, camaradas! O servidor compartilhou o dispositivo pela rede, e podemos conectá-lo! Só resta adicionar a inicialização automática do daemon usbip em /etc/rc.local

usbipd -D

Parte três, a parte do cliente, que é confusa

Tentei conectar o dispositivo compartilhado pela rede a uma máquina com Debian imediatamente no mesmo servidor, e tudo se conectou perfeitamente:

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

Vamos para o Windows. No meu caso, era o Windows Server 2008R2 Standard Edition. O guia oficial pede para instalar o driver primeiro. O procedimento está muito bem descrito no readme incluído com o cliente Windows, seguimos tudo como está escrito e tudo funciona. Também funciona no XP sem dificuldades.

Depois de descompactar o cliente, tentamos montar nossa 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) não é possível encontrar o dispositivo

Oh-oh. Algo deu errado. Usamos a habilidade do Google. Existem menções esparsas de que algo não está certo com as constantes, na parte do servidor os desenvolvedores mudaram a versão do protocolo ao atualizar para a versão 0.2.0, mas no cliente para Windows esqueceram de fazer isso. A solução proposta é — mude a constante no código fonte e recompilhe o cliente.

Só que eu realmente não quero baixar o Visual Studio para esse procedimento. Mas eu tenho o antigo Hiew. No código fonte, a constante é declarada como um inteiro de 32 bits. Vamos procurar no arquivo 0х00000106, substituindo por 0х00000111. Não se esqueçam da ordem dos bytes. Resultado — duas correspondências, vamos aplicar o patch:

[usbip.exe]
00000CBC: 06 11
00000E0A: 06 11

E… sim!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
novo dispositivo usb conectado à porta usbvbus 1

Poderíamos encerrar aqui, mas a música não tocou por muito tempo. Após reiniciar o servidor, descobri que o dispositivo no cliente não está se montando!

C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
usbip err: usbip_windows.c: 829 (attach_device) não é possível encontrar o dispositivo

E isso. Nem mesmo o Google all-knowing conseguiu me responder isso. No entanto, o comando para listar os dispositivos disponíveis no servidor mostra corretamente — aqui está, chave, pode montar. Tento montar usando o Linux — funciona! E agora, vamos tentar a partir do Windows? Oh, horror — isso funciona!

Últimas dificuldades: algo não está escrito no código do servidor. Ao compartilhar o dispositivo, ele não lê a quantidade de descritores USB. E ao montar o dispositivo a partir do Linux, esse campo é preenchido. Infelizmente, conheço o desenvolvimento no Linux apenas no nível de 'make && make install'. Portanto, o problema foi resolvido com um hack bem sujo - adicionando ao /etc/rc.local

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

Parte final

Após algumas dificuldades, funcionou. O desejado foi alcançado, agora a chave pode ser montada em qualquer PC (e desmontada, claro), inclusive fora do segmento de broadcast da rede. Se desejar, isso pode ser feito com um script de shell. O que é apreciável é que a diversão é totalmente gratuita.
Espero que minha experiência ajude os moradores do Habr a evitar as armadilhas que eu enfrentei. Obrigado pela atenção!

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster