### Update vom 15.11.2021
Komplett überarbeitet und auf beiden Seiten (Host & Client) autobind, autoattach und ohne externe Skripte/Dateien ausserhalb systemd! :-)
Wo?
https://gist.github.com/peedy2495/e9ed5938bf0c2e3983185d0c9622e97d (https://gist.github.com/peedy2495/e9ed5938bf0c2e3983185d0c9622e97d)
Hallo!
Hier wieder eines meiner Projekte, welches ich mit euch teilen will:
Heute geht es darum ein USB-Geraet, bei mir ein CC1101, an einer optimalen Funkposition weitab vom eigentlichen Server zu betreiben ...
Dies lässt sich mit dem usbip-Projekt umsetzen.
Hierfür habe ich einen Pi Zero W als usbip-Gateway auserkoren (siehe Bild)
Die Anregung habe ich von
https://unix.stackexchange.com/questions/406847/use-usbip-for-devices-that-are-being-removed-and-reconnected
aufgenommen, jedoch notwendige Anpassungen mit noch zusätzlichen "goodies" vorgenommen ;-)
auf dem Pi wird das usbip-Packet einfach mit
apt-get install usbip
auf Raspbian installiert.
Bei meinen CentOS-Server musste ich die Pakete folgend installieren
rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -ivh http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm
yum install kmod-usbip usbip-utils
auf dem usbip-Server (PiZero), als auch auf dem Client (FHEM-Server)
müssen noch Verzeichnisse erstellt werden
mkdir /opt/usbip
mkdir /var/spool/usbip
zunächst muss der usbip-daemon "usbipd" unter systemd gestartet werden.
Erstelle die Datei /lib/systemd/system/usbipd.service:
[Unit]
Description=USB/IP server daemon
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/sbin/usbipd
[Install]
WantedBy=multi-user.target
auf dem Server wird die Datei /opt/usbip/usbip-bind erstellt
#!/bin/bash
init () {
SPOOL=/var/spool/usbip/bind
touch $SPOOL
while [[ -e $SPOOL ]]; do
$exec bind -b $1
sleep 10
done
$exec unbind -b $1
exit 0
}
err () {
echo "Can't be a Device: $1"
echo $"Usage: $0 {-q|--quiet} [device]"
exit 1
}
exec=$(whereis usbip|cut -d " " -f 2|grep /)
if [ $? -eq 1 ];then
echo "Command usbip not found! Exit"
exit 1
fi
while test -n "$1"; do
case "$1" in
-q|--quiet)
exec &>/dev/null
shift
;;
*)
[[ $1 = [0-9]* ]] && init "$1" || err "$1"
;;
esac
done
und ein
chmod +x /opt/usbip/usbip-bind
hinterher
und dann die Datei /lib/systemd/system/usbip-bin-cul.service
[Unit]
Description=USB-IP Bindings
Wants=network-online.target
After=network-online.target
Requires=usbipd.service
[Service]
KillMode=none
ExecStart=/opt/usbip/usbip-bind -q 1-1
ExecStop=/bin/rm /var/spool/usbip/bind ; /bin/bash -c "while [[ -d /proc/"$MAINPID" ]]; do sleep 1; done"
[Install]
WantedBy=multi-user.target
mit
usbip list -l
bekommt man die lokalen device-ids heraus; bei mir 1-1für das CUL-device.
Entsprechend den Eintrag in der .service-Datei anpassen.
auf dem Client die Datei /opt/usbip/usbip-attach erstellen
#!/bin/bash
init () {
if [ -z $1 ]; then
echo "Missing Device argument! Exit"
exit 1
elif [ -z $2 ]; then
echo "Missing Host argument! Exit"
exit 1
fi
SPOOL=/var/spool/usbip/attach
touch $SPOOL
while [[ -e $SPOOL ]]; do
$exec attach -r $2 -b $1
if [ $? -eq 0 ]; then
sleep 2
port+=("$(usbip port|grep Port|cut -d " " -f 2|tail -n1|sed 's/://')")
echo "Device $1 bound on Port: $port"
fi
sleep 10
done
echo "detaching port: $port"
$exec detach -p $port
exit 0
}
err () {
echo "Can't be a Device: $1"
echo $"Usage: $0 {-q|--quiet} {-h=[host]} [device]"
exit 1
}
exec=$(whereis usbip|cut -d " " -f 2|grep /)
if [ $? -eq 1 ];then
echo "Command usbip not found! Exit"
exit 1
fi
while test -n "$1"; do
case "$1" in
"")
echo $"Usage: $0 {-q|--quiet} {-h=[host]} [device]"
exit 1
;;
-q|--quiet)
exec &>/dev/null
shift
;;
-h=*|--host=*)
host=$(echo $1|cut -d "=" -f 2)
shift
;;
*)
[[ $1 = [0-9]* ]] && init "$1" "$host" || err "$1"
;;
esac
done
und auch hier natürlich noch ausführbar machen
chmod +x /opt/usbip/usbip-attach
und dann noch in /lib/systemd/system/ die Datei usbip-attach-cul.service
[Unit]
Description=USB-IP Attach
Wants=network-online.target
After=network-online.target
[Service]
KillMode=none
ExecStart=/opt/usbip/usbip-attach -q -h=192.168.0.253 1-1
ExecStop=/bin/rm /var/spool/usbip/attach ; /bin/bash -c "while [[ -d /proc/"$MAINPID" ]]; echo "wait">>/opt/usbip/debug.txt; do sleep 1; done"
[Install]
WantedBy=multi-user.target
auf beiden Seiten müssen die .service-Dateien noch mit
systemctl daemon-reload
geladen werden.
danach lassen sich die Services auf der jeweiligen Seite starten
Server
systemctl enable usbipd
systemctl start usbipd
systemctl enable usbip-bind-cul
systemctl start usbip-bind-cul
Client
systemctl enable usbip-attach-cul
systemctl start usbip-attach-cul
Danach kann auch das USB-Gerät aus- und wieder einsteckt werden.
Dann ist es nach ein paar Sekunden wieder verfügbar
überprüfen lässt sich das mit
usbip port
Zusatzinfos:
Unter "systemctl status usbipd" sieht man nach einer Weile errors.
Dies ist normal, da der Clinetseitige Service ständig ein reconnect versucht, jedoch schon verbunden ist.
Also kommt nur beim ersten Versuch ein success heraus :-)
Prüfen ob der Server etwas anbietet
usbip list -r [servername oder IP]
Manuell ein USB-Gerät am Client "ausklinken"
usbip detach -p [Portnummer]
Manuell ein USB-Gerät am Server freigeben/zurücknehmen
usbip unbind -b [GeräteID]
Viel Spaß ... Peedy
Hi Peedy,
ich hab alles nach deiner Anleitung zusammengebaut aber wenn ich auf dem Server (Pi Zero)
bei mir ein alter Pi1 die Services starte kommt:
root@Pi1:/home/pi#
root@Pi1:/home/pi# systemctl enable usbip-bind-cul
Failed to enable unit: File usbip-bind-cul.service: No such file or directory
root@Pi1:/home/pi#
Alle Dateien erstellt, ebenso alle Ordner.
Gruß Dieter
Existiert folgende Datei?
i /lib/systemd/system/usbip-bin-cul.service
Zitat von: Wernieman am 30 Oktober 2019, 20:02:47
Existiert folgende Datei?
i /lib/systemd/system/usbip-bin-cul.service
Ja - die ist da :)
Systemd reloade oder Pi reboot?
Sonst kann folgendes nicht stimmen:
ZitatFailed to enable unit: File usbip-bind-cul.service: No such file or directory
Neuer Zwischenstand:
System neu aufgesetzt, Debian Buster.
Alle Updates und dann Installation wie oben beschrieben.
Also kein fhem drauf und nichts Anderes außer usbip.
Gleiches Ergebnis beim Start.
Kann es sein das irgend was Grundlegendes fehlt?
gib uns bitte mal:
ls -lha /lib/systemd/system/usbip-bin-cul.service
Bitte:
pi@raspberrypi:~ $ ls -lha /lib/systemd/system/usbip-bin-cul.service
-rw-r--r-- 1 root root 302 Oct 31 15:54 /lib/systemd/system/usbip-bin-cul.service
pi@raspberrypi:~ $
Gruß Wolfdieter
Ich glaube, ich habe etwas entsprechendes mithilfe ser2net realisiert, auf 2 externen Raspberries uns 3 CUL/SCC.
Hallo Leute,
Sorry, aber die Diskussion ist an mir vorbeigegangen, da ich [SHAME ON] vergessen hatte das Board zu Abonnieren [SHAME OFF]
Ich hatte übersehen, dass noch von vorherigen Basteleien ein eigener Systemd-Service läuft, welcher auf der Serverseite den usbip-daemon startet ...
Ich erweitere den ersten Beitrag um den fehlenden Anteil. Sorry und trotzdem viel Spaß :-)
Hasta ... Peedy
### Update
Komplett überarbeitet und auf beiden Seiten (Host & Client) autobind, autoattach und ohne externe Skripte/Dateien ausserhalb systemd! :-)
Wo?
https://gist.github.com/peedy2495/e9ed5938bf0c2e3983185d0c9622e97d