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 usbip
no host e no arquivo de serviço do cliente.
Eu também tive que iniciar o usbipd
serviç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