Comment le Raspberry Pi peut-il émuler un périphérique de stockage USB?

46

Les périphériques de stockage USB, tels que les clés USB et les disques durs, permettent généralement de connecter un stockage externe à tout type d'ordinateur. Comment le Raspberry Pi peut-il émuler un stockage USB? L’application la plus simple était d’accéder directement à la carte SD via USB, mais on pouvait également accéder aux fichiers via Ethernet. J'ai pensé à la disposition suivante pour une " clé USB en nuage ":

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

L'ordinateur ne devrait voir qu'une clé USB normale pour lire et écrire des fichiers. Le Raspberry Pi agirait comme un pont programmable qui mapperait les listes de répertoires et les accès aux fichiers à demander à un stockage en nuage. Vous pouvez accéder aux hôtes de stockage en nuage avec n'importe quel ordinateur (y compris les lecteurs multimédias de type boîte noire) via USB sans avoir à installer de logiciel supplémentaire sur l'ordinateur. Le pont USB Raspberry Pi devrait également être en mesure de chiffrer / déchiffrer des fichiers à la volée afin de pouvoir stocker des fichiers chiffrés dans le nuage et y accéder sur n’importe quel périphérique, comme un lecteur USB normal.

Modifier: les produits existants dotés de fonctionnalités similaires mais limitées incluent Wireless Media Stick et USB sur réseau . L'accès aux fichiers dans le cloud peut être possible en montant un stockage virtuel avec un lecteur cloud ou un logiciel similaire et un cryptage avec TrueCrypt ou EncFS - les mots de passe seront stockés sur la carte SD de Raspberry Pi uniquement, mais un seul pourrait accéder au stockage avec n'importe quel ordinateur sans avoir à le faire. tapez une phrase secrète sur une machine non fiable.

Jakob
la source
1
Je pense qu'il veut avoir sur son Pi une partition ou un dossier partagé pouvant être monté via USB sur d'autres machines. L'idée est que vous pouvez brancher le Raspi sur n'importe quel ordinateur et que le dossier / la partition se comporte comme un lecteur flash et que vous pouvez y écrire sans aucun logiciel supplémentaire.
Wmarbut
3
Le Pi ne doit servir que de passerelle entre n'importe quel ordinateur, y compris les boîtes noires, et par exemple le cloud Amazon. La passerelle pourrait également chiffrer les fichiers à la volée.
Jakob
1
Scrap ça - ce serait parfait!
Alex Chamberlain
1
@AlexChamberlain - non, vous ne pouvez pas. Les périphériques de stockage de masse USB ont un protocole particulier pris en charge par le système d'exploitation hôte. Vous pouvez bien sûr créer un pilote pour que quelque chose d'autre ressemble à une sorte de périphérique de stockage pour un système d'exploitation particulier, mais ce ne serait pas un périphérique "USB Mass Storage", mais plutôt un "périphérique de stockage personnalisé connecté via USB"
Chris Stratton
1
@ppumkin: Parce que "mapper le lecteur" ou "se connecter au réseau local" nécessite de configurer le PC (ou le lecteur multimédia). Le simple branchement sur un port USB ne nécessite aucune administration et il n'est pas nécessaire de révéler de mot de passe au PC. Notez que je souhaite partager le stockage à partir d'un lecteur cloud, qui requiert toujours des mots de passe ou même l'installation du logiciel client.
Jakob

Réponses:

12

Le problème est que la connexion USB du Pi au PC n'a pas les broches de données connectées - seulement les broches d'alimentation. Donc, vous ne pouvez pas utiliser cela pour parler USB parce que ce n'est pas câblé.

Votre seule option avec le Pi serait de «mordre» l’USB en utilisant les broches GPIO, mais c’est très lent et potentiellement peu fiable. Je pense que vous ne pourrez vraiment émuler qu'un clavier ou une souris - une bande passante plus élevée serait probablement trop difficile à gérer pour le processeur, étant donné les contraintes de temps très strictes associées à une connexion USB.

Une autre solution consisterait à trouver un périphérique permettant de connecter deux ordinateurs ensemble via USB, afin de créer une sorte de réseau. Mais alors vous pouvez aussi bien utiliser la connexion Ethernet ...

Malvineux
la source
1
J'ai déjà joué avec un GP32 qui peut se comporter comme un hôte même lorsqu'il est connecté à un concentrateur en tant que client. Si le Raspberry peut se comporter comme un hôte sur les ports USB (et non sur celui de puissance), une astuce similaire devrait également être possible. Peut-être que USB-to-go peut le faire?
Thorbjørn Ravn Andersen
2
Hein? Vous vous trompez avec le port micro USB utilisé pour l’adaptateur secteur. Qu'en est-il des 2 ports USB appropriés? Avec certains logiciels d’émulation, il serait possible de connecter cet usb à un PC et d’émuler le stockage - par exemple - un téléphone Android lorsque vous branchez un usb. - Mais il n'y a pas de raison à cela parce que vous branchez le Pi sur votre réseau, partagez votre dossier "cloud" via samba ou autre (wifi ou lan) - et faites en même temps votre cloud synchroniser ce que vous voulez faire. . Le réseau local peut traiter de nombreuses demandes sur différents ports
Piotr Kula
2
@ppumkin: Pourquoi suis-je confondu avec le port micro USB? Les broches de données ne sont pas connectées, vous ne pouvez donc pas envoyer de données. Les ports USB "appropriés" en aval sont des ports "hôtes". Il n'est donc pas possible de les brancher sur un PC sans une sorte de convertisseur au milieu. L'émulation logicielle ne suffit pas, à cause du fonctionnement du protocole USB. Vous pensez peut-être à Ethernet où vous pouvez brancher deux périphériques ensemble, mais l'USB ne fonctionne pas comme cela. Si vous ne me croyez pas, lisez attentivement la spécification USB, en particulier les parties concernant les hôtes USB contre les périphériques.
Malvineous
1
Je voulais juste ajouter que le "bit-bang" USB n'est pas une option. L'USB est très loin de quelque chose comme I2C qui peut être bit-banged. L’approche la plus pratique consiste peut-être à utiliser l’un de ces micros d’AVR doté d’un port de périphérique USB intégré, puis à lui communiquer via le port série du Pi. (par exemple, olimex.com/Products/AVR/Proto/AVR-USB-162 )
greggo le
1
@Malvineous À 12 MHz ou juste 1,5? La période d'horloge est de [83,33 +/- 0,2 us] pour 12 MHz et de [666,6 +/- 10 us] pour 1,5 MHz. N'oubliez pas que vous devez récupérer l'horloge à la réception, ce qui signifie vraisemblablement que vous devez échantillonner au moins 5 à 10 fois la fréquence d'horloge. Ces implémentations autorisent-elles les interruptions lorsque vous parlez à des périphériques USB?
greggo
8

D'après une analyse rapide de la fiche technique du BCM2835 (http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf) au chapitre 15, il semble que l'USB OTG soit pris en charge dans HW, théoriquement, le soutien du système proposé pourrait donc être une simple affaire de SW. Je ne suis pas un expert en protocole USB (ni même novice, vraiment), mais ce serait plutôt cool d'avoir cette fonctionnalité.

En regardant une description du BeagleBone (http://elinux.org/BeagleBone), il semble prendre en charge quelque chose de similaire, bien qu'il soit spécifiquement mentionné qu'un connecteur prend en charge ce mode. Il serait regrettable que le Raspberry Pi soit limité uniquement à la sélection du connecteur.

J'espère que c'est utile.

Don Christensen
la source
2
Même si le SOC le prend en charge, le périphérique concentrateur LAN9512 sur un modèle B empêche probablement le port "en arrière" d’exécuter le port USB en mode périphérique. Sur un modèle A (ou si vous supprimez cela et installez R37 & R38), vous pouvez connecter le port USB du SOC à la prise externe - mais dans ce cas, vous n’auriez pas d’Ethernet et n’auriez que la carte SD pour un stockage potentiel.
Chris Stratton le
6

Cela semble maintenant possible avec un PiZero - voir http://pi.gbaman.info/?p=699 pour plus d'informations.

David Walters
la source
1
Bienvenue sur Raspberry Pi! Bien que cela puisse théoriquement répondre à la question, il serait préférable d’inclure ici les parties essentielles de la réponse et de fournir le lien à titre de référence.
Ghanima
4

Malheureusement, bien que cela semble simple, autant que je sache, cela n’a pas été fait. Voir ce fil et réponse très détaillée pour plus de détails

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

Et une réponse spécifique à Pi ici: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=8&t=4938

wmarbut
la source
1
Merci pour les liens. On dirait que cet appareil peut faire partie de ce que je veux, mais il est propriétaire et ne fonctionne que dans un sens (stockage USB en lecture seule virtuelle).
Jakob
3

Si vous n'êtes pas particulièrement préoccupé par les performances, vous pouvez probablement vous procurer un microcontrôleur compatible USB avec un code de stockage de masse USB (vous pouvez par exemple reprogrammer l'interface de débogage STM32F103 sur un module d'évaluation de découverte STM32F0 à 10 $), connectez-le soigneusement au port série du pi. comme back-end, et courir à plusieurs centaines de kilobauds.

Les performances seraient probablement meilleures si vous vous connectiez au PC client via Ethernet, mais cela nécessiterait un pilote personnalisé ou une présentation différente pour le système d'exploitation hôte, par exemple, vous seriez un périphérique de stockage connecté au réseau ou un serveur partagé.

Je crois que les câbles de transfert de fichiers disponibles dans le commerce ont déjà été mentionnés, mais cela nécessiterait un logiciel approprié pour le PC client et la prise en charge du pilote linux au niveau source pour la fin pi.

Chris Stratton
la source
Ouaip. Voir aussi olimex.com/Products/AVR/Proto/AVR-USB-162
greggo le
3

J'ai découvert qu'Arduino peut émuler un périphérique USB, l' Arduino Leonardo même hors de la boîte. La pile USB LUFA peut être utilisée sur Arduino et implémente un pilote de périphérique de stockage de masse USB (voir ce tutoriel ). Cette configuration pourrait être utilisée pour mapper des commandes USB à SCSI telles que comprises par le lecteur de carte SD. Je ne connais pas suffisamment le système SCSI, mais il semble que la carte SD de Raspberry Pi et l’USB-via-Arduino puissent être utilisés ensemble sur le même bus. Bien sûr, cette idée n'est pas une solution complète ...

Jakob
la source
-1 Puisque le sujet concerne le Raspberry Pi et non l'Arduino.
1
Je sais, cette réponse n'est pas une solution complète! J'espère que les questions sur Raspberry Pi en tant qu'outil plutôt que comme une fin en soi sont abordées et que l'élargissement de la vue aux projets connexes aide. Dans ce cas, j'ai trouvé ce tutoriel sur l'utilisation d'une carte SD en tant que périphérique de stockage de masse USB. Peut-être pourrait-on utiliser un Arduino ou un autre ATMEGA32U4 pour connecter USB au bus SIP, également disponible sur Raspberry Pi?
Jakob
2
Non, vous ne pouvez pas vraiment partager l'accès à la carte SD autrement que par commutation électrique. Un seul hôte peut "monter" un système de fichiers donné à la fois (pour les types de systèmes de fichiers utilisés sur les cartes, les systèmes de fichiers réseau sont différents à cet égard).
Chris Stratton
1

Cela revient à la façon dont fonctionne l'USB. Vous voyez que chaque fois que deux choses sont connectées à l'USB, il y a tous les moyens par un hôte USB et un périphérique USB et jamais le twain ne doit changer de place. Un hôte USB fait toutes sortes de choses que les périphériques USB ne peuvent pas faire pour synchroniser le transfert de données entre tous les périphériques connectés au bus USB. Consultez la page wikipedia USB pour plus d'informations .

Vous parlez de forcer deux hôtes USB (le Raspberry Pi et un ordinateur) à communiquer, ce qui n’est malheureusement pas pris en charge par le standard USB. Certains appareils peuvent simuler un transfert de données entre deux hôtes USB, mais comme Malvineous l’a mentionné, il serait préférable d’utiliser Ethernet.

Votre question mentionne spécifiquement l'utilisation du Raspberry Pi pour émuler le stockage USB, mais avez-vous envisagé de configurer le Raspberry Pi en tant que NAS? En utilisant le Raspberry Pi comme boîtier NAS, vous faites exactement ce que vous avez demandé, mais au lieu d’utiliser une clé USB, ce serait d’utiliser votre réseau. Voici d'excellentes instructions sur la façon de procéder si cela vous intéresse.

Dan B
la source
Merci pour les pointeurs. Mes questions portent donc sur la mise en œuvre d'un périphérique USB à l' aide d'un Raspberry Pi. Un NAS, cependant, n'est pas une réponse à cette question.
Jakob
3
Si vous voulez que le Raspberry Pi puisse être un périphérique USB, je vous suggère de rechercher les produits sur ftdichip.com plus que probablement, vous serez en mesure de câbler une carte utilisant les broches GPIO du Pi pour assurer l'interface avec une puce FTDI. et cela vous donnera une capacité de périphérique USB. Vous devrez probablement également écrire un pilote pour communiquer avec le périphérique FTDI.
Dan B
Sauf que "le twain doit changer de place" s'il s'agit d'un périphérique USB OTG ...
Chris Stratton le
1

Je peux le faire avec mon ancien téléphone Nokia N900 à l’aide du pilote de gadget USB fourni avec le noyau Nokia. Le périphérique émulé se comporte exactement comme un vrai, vous pouvez même démarrer un PC à partir de celui-ci.

Nyg
la source
1
Pourriez-vous donner quelques détails? Vous ne parlez pas simplement de fournir le stockage sur votre téléphone via USB comme le font la plupart des autres smartphones, n'est-ce pas? Autant que je sache, un pilote de gadget USB fournit uniquement un mappage de SCSI à USB . Il est donc nécessaire de mapper SCSI à une API de stockage dans le cloud.
Jakob
1

Les modèles Pi Zero et Pi Zero W sont maintenant disponibles et prennent en charge l'interface de gadget ( Kernal.org , linux-sunxi.org ) permettant plusieurs profils, y compris le stockage de masse USB et la mise en réseau virtuelle.

La solution la plus proche de la demande de l'OP consiste à utiliser un protocole réseau entre le Pi et le PC hôte, puis une autre forme de protocole réseau du Pi au fournisseur de cloud / réseau. Le Pi Zero W a le Wi-Fi intégré, il peut donc même se connecter directement au fournisseur de cloud / réseau. La mise en réseau de ces deux liens sera le moyen le plus simple de faire le travail. Il existe de nombreux protocoles de réseau et fournisseurs de cloud disponibles.

Essayer d'utiliser le stockage de masse USB serait une mauvaise idée. vous devez écrire ou réécrire une adaptation au niveau du pilote entre le stockage de masse USB et le Pi. Vous pouvez commencer par MTP ou finir avec quelque chose de similaire. MTP a de graves problèmes de performances ( Reddit , XDA , HowToGeek , Reddit ) et je suggère donc l'approche réseau.

Il devrait y avoir beaucoup de programmes et de projets dans cette direction. Du point de vue du Pi, il agit simplement comme un serveur de fichiers / serveur de synchronisation, donc tout tutoriel similaire devrait vous aider à démarrer. Explorer des éléments tels que les serveurs Seafile , Syncthing , SugarSync et OwnCloud basés sur Pi devrait vous aider à démarrer.

Quelques guides utiles sur le Pi Zero en tant que gadget USB:

EncoreAnotherRandomUser
la source
0

La norme USB est basée sur l'hôte. Cela signifie qu'un appareil doit contrôler toutes les communications avec les appareils connectés. Les clients peuvent être un simple périphérique ou un concentrateur. Le concentrateur est un proxy hôte pour les clients connectés au concentrateur et communique avec l'hôte (ou le concentrateur) auquel il est connecté.

Comme le design original de l'USB, vous ne pouvez pas connecter deux hôtes ensemble (votre PC et le RPi).

Il existe cependant des extensions, USB On-The-Go , qui permettent à une connexion USB de voir si elle est connectée à un hôte ou à un client, et d'ajuster son rôle en fonction de cela. Pour que cela fonctionne, vous devez avoir un support dans le matériel. Je ne crois pas que le RPi est conçu pour le faire.

Pour plus d'informations, consultez http://www.usb.org/home ou même http://en.wikipedia.org/wiki/Universal_Serial_Bus

En bref, je ne crois pas que cela puisse être fait.

Anders
la source
Une autre réponse contredit votre remarque sur le manque de soutien d’OTG.
Alex Chamberlain
1
@ Alex, regarde les timbres à date. Anders a posté ceci en 2012, avant que les Pi Zero ou A + soient disponibles.
YetAnotherRandomUser
@YetAnotherRandomUser, regardez les timbres à date. J'ai posté ma réponse le lendemain du jour où Anders a écrit son commentaire.
Alex Chamberlain
@AlexChamberlain et en 2012, il n'y avait pas de support pour cela pour Raspberry et Rasbperian (ou tout autre logiciel que je connaisse). Donc oui, dans CE laps de temps, j'avais raison. Le RPi Zero est arrivé de nombreuses années plus tard ... Nous avons maintenant un support pour le RPi Zero, qui est mentionné dans un autre post, comme vous l'avez écrit.
Anders