Wie kann der Raspberry Pi ein USB-Speichergerät emulieren?


46

USB-Speichergeräte, wie z. B. USB-Sticks und -Festplatten, dienen zum Anschließen von externem Speicher an Computer aller Art. Wie kann der Raspberry Pi einen USB-Speicher emulieren? Die einfachste Anwendung bestand darin, direkt über USB auf die SD-Karte zuzugreifen, aber man konnte auch über Ethernet auf Dateien zugreifen. Ich habe über folgendes Layout für einen " USB-Cloud-Stick " nachgedacht :

Computer <---USB---> |Raspberry Pi| <---Ethernet---> Cloud, NAS etc.

Der Computer sollte nur einen normalen USB-Stick zum Lesen und Schreiben von Dateien sehen. Der Raspberry Pi fungiert als programmierbare Brücke, die Verzeichnislisten und Dateizugriffe zuordnet, um eine Anforderung an einen Cloud-Speicher zu senden. Sie können mit jedem Computer (einschließlich Black-Box-Media-Playern) über USB auf Cloud-Speicherhoster zugreifen, ohne zusätzliche Software auf dem Computer installieren zu müssen . Die Raspberry Pi USB-Bridge sollte auch in der Lage sein, Dateien im laufenden Betrieb zu verschlüsseln / entschlüsseln, sodass verschlüsselte Dateien in der Cloud gespeichert werden können und auf jedem Gerät wie auf einem normalen USB-Laufwerk darauf zugegriffen werden kann.

Bearbeiten: Zu den vorhandenen Produkten mit ähnlichen, aber eingeschränkten Funktionen gehören Wireless Media Stick und USB-over-Network . Der Zugriff auf Dateien in der Cloud ist möglicherweise möglich, indem ein virtueller Speicher mit einem Cloud-Laufwerk oder einer ähnlichen Software bereitgestellt und mit TrueCrypt oder EncFS verschlüsselt wird. Passwörter werden nur auf der SD-Karte von Raspberry Pi gespeichert, aber auf den Speicher kann mit jedem Computer zugegriffen werden, ohne dass dies erforderlich ist Geben Sie eine Passphrase auf einem nicht vertrauenswürdigen Computer ein.


1
Ich denke, er möchte eine Partition oder einen freigegebenen Ordner auf seinem Pi haben, der über USB auf anderen Computern eingehängt werden kann. Die Idee ist, dass Sie die Raspi an jeden Computer anschließen können und dieser Ordner / diese Partition sich wie ein Flash-Laufwerk verhält und ohne zusätzliche Software beschrieben werden kann.
wmarbut

3
Das Pi sollte nur als Gateway zwischen handelt jeden Computer, einschließlich Schwarz - Boxen, und beispielsweise Amazon Wolke. Das Gateway kann die Dateien auch im laufenden Betrieb verschlüsseln.
Jakob

1
Schrott das - das wäre perfekt!
Alex Chamberlain

1
@AlexChamberlain - nein, das kannst du nicht. USB-Massenspeichergeräte verfügen über ein bestimmtes Protokoll, das vom Host-Betriebssystem unterstützt wird. Sie können natürlich einen Treiber erstellen, der etwas anderes für ein bestimmtes Betriebssystem wie eine Art Speichergerät aussehen lässt. Es handelt sich jedoch nicht um ein "USB-Massenspeichergerät", sondern um ein "benutzerdefiniertes Speichergerät, das über USB angeschlossen ist"
Chris Stratton

1
@ppumkin: Da für "Zuordnen des Laufwerks" oder "Anschließen an das LAN" der PC (oder der Media Player) konfiguriert werden muss. Das einfache Anschließen an einen USB-Anschluss erfordert keine Administration und es müssen keine Kennwörter für den PC verfügbar gemacht werden. Beachten Sie, dass ich Speicher von einem Cloud-Laufwerk freigeben möchte, für das immer Kennwörter oder sogar die Installation von Client-Software erforderlich sind.
Jakob

Antworten:


12

Das Problem ist, dass bei der USB-Verbindung des Pi zum PC nicht die Datenpins angeschlossen sind, sondern nur die Stromanschlüsse. Sie können dies nicht zum Sprechen von USB verwenden, da es nicht verkabelt ist.

Ihre einzige Option mit dem Pi wäre, USB mit den GPIO-Pins zu "knallen", aber dies ist sehr langsam und möglicherweise unzuverlässig. Ich vermute, dass Sie wirklich nur eine Tastatur oder eine Maus emulieren können - eine höhere Bandbreite wäre wahrscheinlich zu viel, um von der CPU bewältigt zu werden.

Eine andere Alternative wäre, ein Gerät zu finden, mit dem Sie zwei Computer über USB miteinander verbinden können, um eine Art Netzwerk zu erstellen. Dann können Sie aber auch einfach die Ethernet-Verbindung nutzen ...


1
Ich habe zuvor mit einem GP32 gespielt, der sich wie ein Host verhalten kann, selbst wenn er als Client an einen Hub angeschlossen ist. Wenn sich die Himbeere an den USB-Ports wie ein Host verhalten kann (nicht der Power-Host), sollte auch dort ein ähnlicher Trick möglich sein. Vielleicht kann USB-to-go das?
Thorbjørn Ravn Andersen

2
Huh? Der für das Netzteil verwendete Micro-USB-Anschluss täuscht Sie. Was ist mit den 2 richtigen USB-Anschlüssen? Mit einer Emulationssoftware ist es möglich, diesen USB-Stick an einen PC anzuschließen und Speicher zu emulieren, z. B. ein Android-Handy, wenn Sie den USB-Stick anschließen. - Aber es gibt keinen Grund dafür, weil Sie den Pi in Ihr Netzwerk einstecken, Ihren "Cloud" -Ordner über Samba oder was auch immer (WLAN oder LAN) freigeben - und gleichzeitig Ihre Cloud synchronisieren, was immer Sie wollen . LAN kann viele Anfragen an verschiedenen Ports bearbeiten
Piotr Kula

2
@ppumkin: Warum irre ich mich beim Micro-USB-Anschluss? Die Datenpins sind nicht verbunden, sodass Sie keine Daten darüber senden können. Die nachgeschalteten "richtigen" USB-Anschlüsse sind "Host" -Anschlüsse. Sie können also nicht an einen PC angeschlossen werden, ohne dass sich eine Art Konverter in der Mitte befindet. Die Software-Emulation reicht aufgrund der Funktionsweise des USB-Protokolls nicht aus. Sie denken vielleicht an Ethernet, wo Sie zwei beliebige Geräte miteinander verbinden können, aber USB funktioniert so nicht. Wenn Sie mir nicht glauben, lesen Sie die USB-Spezifikation, insbesondere die Teile über USB-Hosts und Peripheriegeräte.
Malvineous

1
Ich wollte nur hinzufügen, dass "Bit-Banging" USB keine Option ist. USB ist ein langer, langer Weg von etwas wie I2C entfernt, das bitweise bombardiert werden kann. Möglicherweise ist es am praktischsten, eines dieser AVR-Mikros mit integriertem USB-Geräteanschluss zu verwenden und dann über den seriellen Anschluss am Pi mit ihm zu kommunizieren. (zB olimex.com/Products/AVR/Proto/AVR-USB-162 )
Greggo

1
@Malvineous Bei 12 MHz oder nur 1,5? Die Taktperiode beträgt [83,33 +/- 0,2 us] für 12 MHz und [666,6 +/- 10 us] für 1,5 MHz. Denken Sie daran, dass Sie die Uhr beim Empfang wiederherstellen müssen, was vermutlich bedeutet, dass Sie mindestens das 5- bis 10-fache der Taktrate abtasten müssen. Ermöglichen diese Implementierungen Interrupts bei der Kommunikation mit USB-Geräten?
Greggo

8

Ausgehend von einer schnellen Durchsicht des BCM2835-Datenblattes (http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf) in Kapitel 15 wird USB OTG anscheinend unterstützt HW, also theoretisch könnte es nur eine Frage der SW sein, das vorgeschlagene Schema zu unterstützen. Ich bin kein Experte für USB-Protokolle (oder sogar ein Anfänger), aber es wäre ziemlich cool, diese Funktionalität zu haben.

Betrachtet man eine Beschreibung des BeagleBone (http://elinux.org/BeagleBone), so scheint es etwas Ähnliches zu unterstützen, obwohl ausdrücklich ein Connector erwähnt wird, der diesen Modus unterstützt. Es wäre bedauerlich, wenn der Raspberry Pi nur aufgrund der Auswahl der Anschlüsse eingeschränkt wäre.

Hoffe das ist hilfreich.


2
Selbst wenn der SOC dies unterstützt, kann das LAN9512-Hub-Gerät eines Modells B den USB-Anschluss im Gerätemodus möglicherweise nicht "rückwärts" betreiben. Auf einem Modell A (oder wenn Sie das entfernen und R37 & R38 installieren) könnten Sie den SOCs-USB-Anschluss an die externe Buchse anschließen - aber dann hätten Sie kein Ethernet und hätten nur die SD-Karte als potenziellen Speicher.
Chris Stratton


4

Leider scheint dies so einfach wie ich es beurteilen kann, aber es wurde nicht getan. Weitere Informationen finden Sie in diesem Thread und in der ausführlichen Antwort

https://unix.stackexchange.com/questions/2683/serve-files-over-usb

Und eine Pi-spezifische Antwort hier: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=8&t=4938


1
Danke für die Links. Es sieht so aus, als ob dieses Gerät einen Teil dessen macht, was ich möchte, aber es ist proprietär und funktioniert nur in eine Richtung (virtueller schreibgeschützter USB-Speicher).
Jakob

3

Wenn Sie nicht besonders auf Leistung bedacht sind, könnten Sie wahrscheinlich einen USB-fähigen Mikrocontroller mit USB-Massenspeichercode erwerben (Sie könnten beispielsweise die STM32F103-Debug-Schnittstelle auf einem STM32F0-Discovery-Evaluierungsmodul für 10 US-Dollar neu programmieren). Schließen Sie diesen vorsichtig an den seriellen Pi-Port an als Back-End und laufen mit mehreren hundert Kilobaud.

Eine bessere Leistung würde wahrscheinlich durch die Anbindung an den Client-PC über Ethernet erzielt werden. Dies würde jedoch einen benutzerdefinierten Treiber oder eine andere Präsentation für das Host-Betriebssystem erfordern - dh, Sie wären ein an das Netzwerk angeschlossenes Speichergerät oder ein gemeinsamer Server.

Standard-Dateitransferkabel wurden, wie ich glaube, bereits erwähnt, aber das würde eine geeignete Software für den Client-PC und Linux-Treiberunterstützung auf Quellenebene für das pi-Ende erfordern.



3

Ich fand heraus, dass Arduino ein USB-Gerät emulieren kann, das Arduino Leonardo sogar von Anfang an. Der LUFA USB-Stack kann auf Arduino verwendet werden und implementiert einen USB-Massenspeichergerätetreiber (siehe dieses Tutorial ). Dieses Setup kann verwendet werden, um USB-SCSI-Befehlen zuzuordnen , wie sie vom SD-Kartenleser verstanden werden. Ich weiß nicht genug über SCSI, aber es sieht so aus, als könnten die SD-Karte auf dem Raspberry Pi und das USB-via-Arduino zusammen auf demselben Bus verwendet werden. Sicher ist diese Idee keine vollständige Lösung ...


-1 Da geht es um den Raspberry Pi und nicht um Arduino.

1
Ich weiß, diese Antwort ist keine vollständige Lösung! Ich hoffe, dass diese Fragen zu Raspberry Pi als Werkzeug und nicht als Selbstzweck aktuell sind und eine Erweiterung des Blickwinkels auf verwandte Projekte hilfreich ist. In diesem Fall habe ich dieses Tutorial gefunden, wie man eine SD-Karte als USB-Massenspeichergerät verwendet. Vielleicht könnte man ein Arduino oder ein anderes ATMEGA32U4 verwenden, um USB an den SIP-Bus zu bringen, der auch auf dem Raspberry Pi verfügbar ist?
Jakob

2
Nein, Sie können den Zugriff auf die SD-Karte nur durch elektrisches Schalten freigeben. Es kann jeweils nur ein Host ein bestimmtes Dateisystem "mounten" (für die auf Karten verwendeten Dateisystemtypen - Netzwerk-Dateisysteme unterscheiden sich in dieser Hinsicht).
Chris Stratton

1

Dies hängt davon ab, wie USB funktioniert. Sie sehen, wann immer zwei Dinge mit USB verbunden sind, es gibt alle Möglichkeiten, wie ein USB-Host und ein USB-Gerät und niemals der Twain den Ort wechseln soll. Ein USB-Host kann alle Arten von Dingen ausführen, die USB-Geräte meist nicht ausführen können, um die Datenübertragung zwischen allen an den USB-Bus angeschlossenen Geräten zu synchronisieren. Weitere Informationen finden Sie auf der USB-Wikipedia-Seite .

Sie müssen zwei USB-Hosts (den Raspberry Pi und einen Computer) zur Kommunikation zwingen, was vom USB-Standard leider nicht unterstützt wird. Es gibt einige Geräte, die eine Datenübertragung zwischen zwei USB-Hosts vortäuschen können, aber wie Malvineous bereits erwähnt hat, ist es besser, wenn Sie Ethernet verwenden.

In Ihrer Frage wird speziell die Verwendung des Raspberry Pi zum Emulieren eines USB-Speichers erwähnt. Haben Sie jedoch darüber nachgedacht, den Raspberry Pi als NAS einzurichten? Wenn Sie den Raspberry Pi als NAS-Box verwenden, tun Sie im Grunde genau das, wonach Sie gefragt haben, aber anstatt USB zu verwenden, wird Ihr Netzwerk verwendet. Hier finden Sie eine Anleitung, wie Sie dies tun können, wenn Sie interessiert sind.


Danke für die Hinweise. Meine Fragen beziehen sich daher auf die Implementierung eines USB-Geräts mit einem Raspberry Pi. Ein NAS ist jedoch keine Antwort auf diese Frage.
Jakob

3
Wenn Sie möchten, dass der Raspberry Pi ein USB-Gerät sein kann, empfehlen wir Ihnen, die Produkte auf ftdichip.com zu untersuchen. Mit großer Wahrscheinlichkeit können Sie ein Board verkabeln , das die GPIO-Pins des Pi als Schnittstelle für einen FTDI-Chip verwendet und das gibt Ihnen USB-Gerätefunktionen. Sie müssen wahrscheinlich auch einen Treiber schreiben, um mit dem FTDI-Gerät zu kommunizieren.
Dan B

Außer, dass "die Twain die Plätze tauschen sollen", wenn es sich um USB-OTG-Geräte handelt ...
Chris Stratton

1

Ich kann es mit meinem alten Nokia N900 Telefon tun, indem ich den USB-Gadget-Treiber verwende, der im Nokia-Kernel enthalten ist. Das emulierte Gerät verhält sich genauso wie ein echtes, Sie können sogar einen PC davon booten.


1
Können Sie uns einige Details mitteilen? Sie reden nicht nur davon, den Speicher auf Ihrem Telefon über USB bereitzustellen, wie es die meisten anderen Smartphones können, oder? Soweit ich weiß, stellt ein USB-Gadget-Treiber nur eine Zuordnung von SCSI zu USB bereit , sodass SCSI immer noch einer Cloud-Speicher-API zugeordnet werden muss.
Jakob,

1

Pi Zero und Pi Zero W sind jetzt verfügbar und unterstützen die Gadget-Oberfläche ( Kernal.org , linux-sunxi.org ), die verschiedene Profile ermöglicht, einschließlich USB-Massenspeicher und virtuelles Netzwerk.

Die Lösung, die der Anforderung des OP am nächsten kommt, besteht darin, ein Netzwerkprotokoll zwischen dem Pi und dem Host-PC und dann eine andere Form des Netzwerkprotokolls vom Pi zum Cloud- / Netzwerkanbieter zu verwenden. Das Pi Zero W verfügt über integriertes WLAN, sodass sogar eine direkte Verbindung zum Cloud- / Netzwerkanbieter hergestellt werden kann. Die Vernetzung dieser beiden Links ist der einfachste Weg, um die Arbeit zu erledigen. Es stehen viele Netzwerkprotokolle und Cloud-Anbieter zur Verfügung.

Der Versuch, USB-Massenspeicher zu verwenden, wäre eine schlechte Idee. Sie müssten eine Anpassung auf Treiberebene zwischen dem USB-Massenspeicher und dem Pi schreiben oder neu schreiben. Sie würden entweder mit MTP beginnen oder mit etwas Ähnlichem enden. MTP weist schwerwiegende Leistungsprobleme auf ( Reddit , XDA , HowToGeek , Reddit ), daher schlage ich den Netzwerkansatz vor.

Es sollte viele Programme und Projekte in diese Richtung geben. Aus der Sicht von Pi verhält es sich einfach wie ein Fileserver / Sync-Server, sodass Sie mit einem ähnlichen Tutorial sofort loslegen sollten. Ein Blick auf Dinge wie Pi-basierte Seafile- , Syncthing- , SugarSync- und OwnCloud- Server sollte Ihnen den Einstieg erleichtern .

Einige nützliche Anleitungen zum Pi Zero als USB-Gadget:


0

Die USB-Standards basieren auf Hosts. Das bedeutet, dass ein Gerät die gesamte Kommunikation mit den angeschlossenen Geräten steuern muss. Clients können ein einfaches Gerät oder ein Hub sein. Der Hub ist ein Host-Proxy für die mit dem Hub verbundenen Clients und kommuniziert mit dem Host (oder Hub), mit dem er verbunden ist.

Wie das ursprüngliche Design von USB aussieht, können Sie nicht zwei Hosts miteinander verbinden (Ihren PC und das RPi).

Es gibt jedoch Erweiterungen, nämlich USB On-The-Go , mit denen eine USB-Verbindung feststellen kann, ob sie mit einem Host oder einem Client verbunden ist, und deren Rolle entsprechend anpassen kann. Damit dies funktioniert, muss die Hardware unterstützt werden. Ich glaube nicht, dass das RPi dafür ausgelegt ist.

Weitere Informationen finden Sie unter http://www.usb.org/home oder http://en.wikipedia.org/wiki/Universal_Serial_Bus

Kurz gesagt, ich glaube nicht, dass dies möglich ist.


Eine andere Antwort widerspricht Ihrem fehlenden OTG-Support.
Alex Chamberlain

1
@Alex, sieh dir die Datumsstempel an. Anders hat dies 2012 gepostet, bevor Pi Zero oder A + verfügbar waren.
YetAnotherRandomUser

@YetAnotherRandomUser, sehen Sie sich die Datumsstempel an. Ich habe meine Antwort am Tag nach Anders 'Kommentar gepostet.
Alex Chamberlain

@AlexChamberlain und im Jahr 2012 gab es keine Unterstützung für Raspberry und Rasbperian (oder eine andere mir bekannte Software). Also ja, in DIESEM Zeitrahmen hatte ich recht. Das RPi Zero kam viele Jahre später ... Jetzt haben wir Unterstützung für das RPi Zero, das, wie Sie geschrieben haben, in einem anderen Beitrag erwähnt wird.
Anders
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.