Verwenden Sie USBIP für Geräte, die entfernt und wieder angeschlossen werden

Verwenden Sie USBIP für Geräte, die entfernt und wieder angeschlossen werden

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 usbipsowohl in die Host- als auch in die Client-Servicedatei schreiben.

Ich musste den usbipdDienst 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

verwandte Informationen