USB-IP • USB-Geräte via Netzwerk einbinden

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
				
			

Weiterführende Links

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Nach oben scrollen
WordPress Cookie Hinweis von Real Cookie Banner