Use USBIP para dispositivos que estão sendo removidos e reconectados

Use USBIP para dispositivos que estão sendo removidos e reconectados

Estou usando o usbip e um raspberry pi para estender o alcance de um teclado sem fio a um computador que está um pouco longe demais para que o teclado funcione de maneira confiável por conta própria.

Às vezes, o receptor USB do teclado é reconectado e usado em outro lugar, mas quando é reconectado ao Raspberry Pi, a conexão USBIP não é restabelecida automaticamente.

Como posso conseguir a reconexão automática?

Responder1

Quando um dispositivo vinculado e conectado remotamente é desconectado, o dispositivo é automaticamente desconectado do cliente e desconectado do host. Depois disso, o estado é o mesmo como se nunca tivesse sido vinculado ou anexado.

Os comandos usbip para vinculação (no host) e anexação (no cliente) podem ser executados repetidamente com os mesmos argumentos. Embora isso emita uma mensagem de erro em dispositivos já vinculados ou conectados, nada de ruim acontece! Portanto, basta instalar scripts em segundo plano que vincularão e anexarão repetidamente os dispositivos. Exemplos de scripts e unidades do systemd são fornecidos abaixo. Certifique-se de alterar o nome do host e os IDs da porta de acordo com suas necessidades.

Hospedar

Escrita /opt/usbip/usbip-bind:

#!/bin/bash

SPOOL=/var/spool/usbip/bind

if [[ $1 == "-q" ]]
then
    exec &>/dev/null
fi

touch $SPOOL

while [[ -e $SPOOL ]]
do
  /usr/bin/usbip bind -b 1-1.2.1
  /usr/bin/usbip bind -b 1-1.2.2
  sleep 10
done

/usr/bin/usbip unbind -b 1-1.2.1
/usr/bin/usbip unbind -b 1-1.2.2

exit 0

Unidade do sistema /etc/systemd/system/usbip-bind.service:

[Unit]
Description=USB-IP Bindings

[Service]
ExecStart=/opt/usbip/usbip-bind -q
ExecStop=/bin/rm /var/spool/usbip/bind  ; /bin/bash -c "while [[ -d /proc/"$MAINPID" ]]; do sleep 1; done"

[Install]
WantedBy=multi-user.target

Certifique-se de criar o diretório /var/spool/usbip. Em seguida, habilite e inicie a unidade:

systemctl daemon-reload
systemctl enable usbip-bind
systemctl start usbip-bind

Cliente

Escrita /opt/usbip/usbip-attach:

#!/bin/bash

SPOOL=/var/spool/usbip/attach

if [[ $1 == "-q" ]]
then
    exec &>/dev/null
fi

touch $SPOOL

while [[ -e $SPOOL ]]
do
    /usr/bin/usbip attach -r pi -b 1-1.2.1
    /usr/bin/usbip attach -r pi -b 1-1.2.2
    sleep 10
done

/usr/bin/usbip detach -p 0
/usr/bin/usbip detach -p 1

exit 0

Unidade do sistema /etc/systemd/system/usbip-attach.service:

[Unit]
Description=USB-IP Attach
Wants=network-online.target
After=network-online.target

[Service]
ExecStart=/opt/usbip/usbip-attach -q
ExecStop=/bin/rm /var/spool/usbip/attach  ;  /bin/bash -c "while [[ -d /proc/"$MAINPID" ]]; do sleep 1; done"

[Install]
WantedBy=multi-user.target

Certifique-se de criar o diretório /var/spool/usbip. Em seguida, habilite e inicie a unidade:

systemctl daemon-reload
systemctl enable usbip-attach
systemctl start usbip-attach

Agora você pode remover o dispositivo sempre que necessário e no máximo 20 segundos após conectá-lo novamente a conexão usbip será restabelecida.

Responder2

Eu tentei isso e funcionou. Há mais algumas coisas que você precisa fazer.

Primeiro:

Você tem que tornar os scipts executáveis ​​tanto no host quanto no cliente

sudo chmod +x /opt/usbip/usbip-attach
sudo chmod +x /opt/usbip/usbip-bind

No meu caso, o usbip não foi instalado /opt/usbip, tive que simplesmente escrever apenas usbipno host e no arquivo de serviço do cliente.

Eu também tive que iniciar o usbipdserviço. Então, no host, usei este arquivo:

[Unit]
Description=USB-IP Bindings

[Service]
ExecStartPre=/usr/sbin/usbipd -D
ExecStart=/opt/usbip/usbip-bind -q
ExecStop=/bin/rm /var/spool/usbip/bind  ; /bin/bash -c "while [[ -d /proc/"$MAINPID" ]]; do sleep 1; done"

[Install]
WantedBy=multi-user.target

Ele inicia o servidor usbipd primeiro

e nos arquivos do host e do cliente eu tive que remover/usr/bin/

Após essas mudanças, funcionou bem no meu host Raspberry Pi e no cliente Ubuntu 19.10

Responder3

Embora minha resposta esteja bastante atrasada, talvez seja útil para os outros:https://github.com/alpertsev/usbip-service-shell

informação relacionada