USB-IP ermöglicht das Einbinden von USB-Geräten (USB-over-IP) auf entfernten Rechnern. Ein einfacher Raspberry Pi ist hierfür vollkommen ausreichend. Auch für Windows steht ein passender Client zur Verfügung (usbip-win2).
Diese Anleitung richtet einen Raspberry Pi als USB/IP-Server ein. Alle angeschlossenen USB-Geräte werden automatisch exportiert:
- beim Systemstart
- beim späteren Einstecken
- nach einem erneuten Verbinden
- ohne USB-Hubs und Root-Hubs zu exportieren
Voraussetzungen (Raspberry Pi)
Empfohlen:
- Raspberry Pi OS Lite 64 Bit
- feste IP-Adresse oder DHCP-Reservierung
- Raspberry Pi und Windows-Client im selben LAN oder VLAN
- kein direktes Portforwarding aus dem Internet
USB/IP verwendet standardmäßig TCP-Port 3240.
Schritt 1 - Pakete installieren
sudo apt update
sudo apt full-upgrade -y
sudo apt install -y usbip usbutils hwdata
Pfade prüfen:
command -v usbip
command -v usbipd
Typische Ausgabe:
/usr/sbin/usbip
/usr/sbin/usbipd
Falls die Programme an einem anderen Ort liegen, müssen die Pfade in den folgenden Dateien angepasst werden.
Schritt 2 - Kernelmodule dauerhaft laden
Datei erstellen:
sudo nano /etc/modules-load.d/usbip.conf
Inhalt:
usbip-core
usbip-host
Module sofort laden & prüfen:
sudo modprobe usbip-core
sudo modprobe usbip-host
lsmod | grep usbip
Erwartet wird:
usbip_host
usbip_core
Schritt 3 - USB/IP-Daemon als systemd-Dienst
Datei erstellen:
sudo nano /etc/systemd/system/usbipd.service
Inhalt:
[Unit]
Description=USB/IP server daemon
After=network-online.target
Wants=network-online.target
[Service]
Type=forking
ExecStart=/usr/sbin/usbipd -D
ExecStop=/usr/bin/pkill -TERM -x usbipd
Restart=on-failure
RestartSec=3
[Install]
WantedBy=multi-user.target
systemd neu laden, Dienst starten und prüfen:
sudo systemctl daemon-reload
sudo systemctl enable --now usbipd.service
systemctl status usbipd.service
Schritt 4 - Automatisches Export-Skript erstellen
Datei erstellen:
#!/bin/bash
set -u
USBIP="$(command -v usbip)"
TAG="usbip-autobind"
if [[ -z "${USBIP}" || ! -x "${USBIP}" ]]; then
logger -t "${TAG}" "usbip wurde nicht gefunden"
exit 1
fi
while true; do
while IFS= read -r busid; do
[[ -n "${busid}" ]] || continue
device_path="/sys/bus/usb/devices/${busid}"
[[ -f "${device_path}/idVendor" ]] || continue
[[ -f "${device_path}/idProduct" ]] || continue
vendor="$(cat "${device_path}/idVendor")"
product="$(cat "${device_path}/idProduct")"
device_class="$(cat "${device_path}/bDeviceClass" 2>/dev/null || echo "")"
# Linux-Root-Hubs nicht exportieren.
[[ "${vendor}" == "1d6b" ]] && continue
# Interne und externe USB-Hubs nicht exportieren.
# USB Device Class 09 steht für Hubs.
[[ "${device_class}" == "09" ]] && continue
# Keine Interface-Einträge wie 1-1:1.0 bearbeiten.
[[ "${busid}" == *:* ]] && continue
# Bereits an usbip-host gebundene Geräte überspringen.
driver=""
if [[ -L "${device_path}/driver" ]]; then
driver="$(basename "$(readlink -f "${device_path}/driver")")"
fi
[[ "${driver}" == "usbip-host" ]] && continue
output="$("${USBIP}" bind -b "${busid}" 2>&1)"
rc=$?
if [[ ${rc} -eq 0 ]]; then
logger -t "${TAG}" \
"USB-Gerät ${busid} ${vendor}:${product} exportiert"
else
logger -t "${TAG}" \
"Bind für ${busid} ${vendor}:${product} fehlgeschlagen: ${output}"
fi
done < <(
find /sys/bus/usb/devices \
-mindepth 1 \
-maxdepth 1 \
-type l \
-printf '%f\n' |
grep -E '^[0-9]+-[0-9]+(\.[0-9]+)*$'
)
sleep 2
done
Datei ausführbar machen:
sudo chmod 0755 /usr/local/sbin/usbip-autobind
Schritt 5 - Autobind-Dienst erstellen
Datei erstellen:
sudo nano /etc/systemd/system/usbip-autobind.service
Inhalt:
[Unit]
Description=Automatically export all USB devices through USB/IP
Requires=usbipd.service
After=usbipd.service systemd-modules-load.service
[Service]
Type=simple
ExecStart=/usr/local/sbin/usbip-autobind
Restart=always
RestartSec=3
[Install]
WantedBy=multi-user.target
Dienst aktivieren und Raspberry Pi neu starten:
sudo systemctl daemon-reload
sudo systemctl enable --now usbip-autobind.service
sudo reboot
Spätere Diagnose
echo "=== Module ==="
lsmod | grep -E 'usbip|vhci'
echo
echo "=== USB/IP-Daemon ==="
systemctl --no-pager --full status usbipd.service
echo
echo "=== Autobind-Dienst ==="
systemctl --no-pager --full status usbip-autobind.service
echo
echo "=== Lokale USB-Geräte ==="
usbip list -l
echo
echo "=== Exportierte USB-Geräte ==="
usbip list -r 127.0.0.1
echo
echo "=== TCP-Port 3240 ==="
ss -ltnp | grep 3240
echo
echo "=== Letzte Logs ==="
journalctl \
-u usbipd.service \
-u usbip-autobind.service \
--no-pager \
-n 100


