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. 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
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 — . Atrai pela sua abertura, especialmente porque os caras do 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 usbipFoi 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 usbipVamos adicionar as seguintes linhas em /etc/modules, para carregá-las automaticamente ao iniciar o sistema:
usbip-core
usbip-host
vhci-hcdVamos iniciar o servidor usbip:
sudo usbipd -DEm 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 usbipApó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: completeHurra, 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 -DParte 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-1Vamos 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 dispositivoOh-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 11E… sim!
C:Program FilesUSB-IP>usbip -a %server-ip% 1-1
novo dispositivo usb conectado à porta usbvbus 1Poderí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 dispositivoE 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=00Parte 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
