Ich verwende USBIP und einen Raspberry Pi, um die Reichweite einer drahtlosen Tastatur auf einen Computer zu erweitern, der für eine zuverlässige Funktion der Tastatur allein ein klein wenig zu weit entfernt ist.
Manchmal wird der USB-Empfänger der Tastatur wieder angeschlossen und woanders verwendet, aber wenn er wieder an den Raspberry Pi angeschlossen wird, wird die USBIP-Verbindung nicht automatisch wiederhergestellt.
Wie kann ich eine automatische Wiederverbindung erreichen?
Antwort1
Wenn ein Gerät, das remote gebunden und angeschlossen ist, ausgesteckt wird, wird das Gerät auf dem Client automatisch abgetrennt und auf dem Host ungebunden. Danach ist der Zustand derselbe, als wäre es nie gebunden oder angeschlossen gewesen.
Die usbip-Befehle zum Binden (auf dem Host) und Anhängen (auf dem Client) können mit denselben Argumenten wiederholt ausgeführt werden. Dies gibt zwar eine Fehlermeldung auf bereits gebundenen oder angeschlossenen Geräten aus, aber es passiert nichts Schlimmes! Man kann also einfach Hintergrundskripte installieren, die die Geräte wiederholt binden und anhängen. Beispielskripte und systemd-Einheiten finden Sie weiter unten. Achten Sie darauf, den Hostnamen und die Port-IDs nach Bedarf zu ändern.
Gastgeber
Skript /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
Systemd-Einheit /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
Stellen Sie sicher, dass Sie das Verzeichnis erstellen /var/spool/usbip
. Aktivieren und starten Sie dann die Einheit:
systemctl daemon-reload
systemctl enable usbip-bind
systemctl start usbip-bind
Klient
Skript /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
Systemd-Einheit /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
Stellen Sie sicher, dass Sie das Verzeichnis erstellen /var/spool/usbip
. Aktivieren und starten Sie dann die Einheit:
systemctl daemon-reload
systemctl enable usbip-attach
systemctl start usbip-attach
Jetzt können Sie das Gerät bei Bedarf entfernen und spätestens 20 Sekunden nach dem erneuten Einstecken wird die USB-IP-Verbindung wiederhergestellt.
Antwort2
Ich habe das versucht und es hat irgendwie funktioniert. Es gibt noch ein paar weitere Dinge, die Sie tun müssen.
Erste:
Sie müssen die Skripte sowohl auf dem Host als auch auf dem Client ausführbar machen
sudo chmod +x /opt/usbip/usbip-attach
sudo chmod +x /opt/usbip/usbip-bind
In meinem Fall war usbip nicht installiert /opt/usbip
, ich musste einfach usbip
sowohl in die Host- als auch in die Client-Servicedatei schreiben.
Ich musste den usbipd
Dienst auch starten. Also habe ich auf dem Host stattdessen diese Datei verwendet:
[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
Es startet zuerst den usbipd-Server
und sowohl in Host- als auch in Clientdateien musste ich entfernen/usr/bin/
Nach diesen Änderungen funktionierte es auf meinem Raspberry Pi-Host und Ubuntu 19.10-Client einwandfrei
Antwort3
Meine Antwort kommt zwar recht spät, ist aber vielleicht für die anderen hilfreich:https://github.com/alpertsev/usbip-service-shell