Raspberry PiはどのようにUSBストレージデバイスをエミュレートできますか?


46

USBスティックやハードドライブなどのUSBストレージデバイスは、外部ストレージをあらゆる種類のコンピューターに接続するために一般的です。Raspberry PiはどのようにUSBストレージをエミュレートできますか?最も簡単なアプリケーションは、USB経由でSDカードに直接アクセスすることでしたが、イーサネット経由でファイルにアクセスすることもできます。「USBクラウドスティック」の次のレイアウトについて考えました。

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

コンピューターには、ファイルの読み取りと書き込みを行うための通常のUSBスティックしか表示されません。Raspberry Piは、ディレクトリリストとファイルアクセスをマップしてクラウドストレージに要求するプログラム可能なブリッジとして機能します。コンピューターに追加のソフトウェアをインストールしなくても、USB経由で任意のコンピューター(ブラックボックスメディアプレーヤーを含む)でクラウドストレージホスティングにアクセスできます。Raspberry Pi USBブリッジは、ファイルをオンザフライで暗号化/復号化できるため、暗号化されたファイルをクラウドに保存し、通常のUSBドライブなどのデバイスでアクセスできます。

編集:機能は似ていますが機能が制限されいる既存の製品には、ワイヤレスメディアスティックUSB-over-Networkが含まれます。クラウドドライブまたは同様のソフトウェアで仮想ストレージをマウントし、TrueCryptまたはEncFSで暗号化することにより、クラウド内のファイルにアクセスできる場合があります-パスワードはRaspberry PiのSDカードにのみ保存されますが、コンピューターを使用せずにストレージにアクセスできます信頼できないマシンでパスフレーズを入力します。


1
彼が望んでいるのは、他のマシンのUSB経由でマウント可能なパーティションまたは共有フォルダーをPiに持っていることです。raspiを任意のコンピューターに接続でき、そのフォルダー/パーティションはフラッシュドライブのように機能し、追加のソフトウェアなしで書き込みできるという考えです。
wmarbut

3
Piは、ブラックボックスを含む任意のコンピューターと、たとえばAmazonクラウドとの間のゲートウェイとしてのみ機能します。ゲートウェイは、オンザフライでファイルを暗号化することもできます。
ヤコブ

1
それをスクラップ- これは完璧だろう!
アレックスチェンバレン

1
@AlexChamberlain-いいえ、できません。USB大容量記憶装置には、ホストオペレーティングシステムでサポートされている特定のプロトコルがあります。あなたはもちろん、特定のオペレーティングシステムに何か他のストレージデバイスの一種のような外観を作るためにドライバを作成することができますが、それは「USBマスストレージ」デバイスではなく、「USB経由で接続されているカスタム・ストレージ・デバイス」ではないでしょう
クリス・ストラットン

1
@ppumkin:「ドライブのマッピング」または「LANへの接続」では、PC(またはメディアプレーヤー)を構成する必要があるためです。USBポートに差し込むだけで管理は不要で、PCにパスワードを公開する必要もありません。クラウドドライブからストレージを共有したいことに注意してください。クラウドドライブでは、常にパスワード必要です。クライアントソフトウェアのインストールも必要です。
ヤコブ

回答:


12

問題は、PiのPCへのUSB接続にはデータピンが接続されておらず、電源ピンだけが接続されていることです。だから、これは有線ではないので、これを使ってUSBを話すことはできません。

Piでの唯一のオプションは、GPIOピンを使用してUSBを「ビットバン」することですが、これは非常に遅く、信頼性の低い可能性があります。キーボードまたはマウスをエミュレートできるのは実際にしかないと思います-USBのようなビットバンギングの厳しいタイミング要件を考えると、帯域幅が大きいとCPUが対処するには多すぎます。

もう1つの方法は、USBを介して2台のコンピューターを接続して、一種のネットワークを作成できるデバイスを見つけることです。ただし、イーサネット接続を使用することもできます...


1
以前は、ハブをクライアントとして接続した場合でもホストのように動作するGP32を使用しました。RaspberryがUSBポート(電源ポートではない)上のホストのように動作できる場合は、同様のトリックも可能です。おそらくUSB-to-goでできるのでしょうか?
トールビョーンラヴンアンデルセン

2
え?電源アダプタに使用されているマイクロUSBポートと間違われています。2つの適切なUSBポートはどうですか?一部のエミュレーションソフトウェアを使用すると、USBをPCに接続してストレージをエミュレートできます。-しかし、Piをネットワークに接続し、「クラウド」フォルダーをsambaまたは何でも(wifiまたはlan)で共有し、同時にクラウドを同期したいので、その理由はありません。 。LANはさまざまなポートで多くのリクエストを処理できます
Piotr Kula

2
@ppumkin:なぜマイクロUSBポートと間違われるのですか?データピンは接続されていないため、データを送信できません。ダウンストリームの「適切な」USBポートは「ホスト」ポートであるため、途中に何らかの種類のコンバーターデバイスがなければPCに接続することはできません。USBプロトコルの動作方法のため、ソフトウェアエミュレーションでは不十分です。2つのデバイスを接続できるイーサネットを考えているかもしれませんが、USBはこのようには機能しません。信じられない場合は、USB仕様、特にUSBホストと周辺機器に関する部分を読んでください。
Malvineous

1
「ビットバンギング」USBはオプションではないことを付け加えたかっただけです。USBはI2Cのようなビットバンギング可能なものからの長い道のりです。おそらく最も実用的なアプローチは、USBデバイスポートが組み込まれたAVRマイクロの1つを使用し、Piのシリアルポートを介して通信することです。(例えばolimex.com/Products/AVR/Proto/AVR-USB-162
greggo

1
@Malvineous 12 MHzまたは1.5だけですか?クロック周期は、12 MHzの場合[83.33 +/- 0.2 us]、1.5 MHzの場合[666.6 +/- 10 us]です。受信時にクロックを回復する必要があることに注意してください。これは、おそらくクロックレートの少なくとも5〜10倍のサンプリングを意味します。これらの実装は、USBデバイスとの通信中に割り込みを許可しますか?
グレゴ

8

BCM2835データシート(http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Peripherals.pdf)の第15章をざっと読んでみると、USB OTGはHW、したがって理論的には、提案されたスキームをサポートするのはSWの問題かもしれません。私はUSBプロトコルの専門家ではありません(実際には初心者ですらありません)が、この機能を持つことはかなりクールです。

BeagleBone(http://elinux.org/BeagleBone)の説明を見ると、似たようなものをサポートしているように見えますが、このモードをサポートするコネクタの具体的な言及があります。Raspberry Piがコネクタの選択だけのために制限されている場合は残念です。

これが役に立てば幸いです。


2
SOCでサポートされている場合でも、モデルBのLAN9512ハブデバイスは、デバイスモードでUSBポートを「後方」に実行することを妨げます。モデルA(またはそれを取り外してR37およびR38をインストールした場合)では、SOC USBポートを外部ジャックに接続できますが、イーサネットはなく、潜在的なストレージ用のSDカードしかありません。
クリスストラットン


4

残念ながら、これは単純なように思えますが、私が知る限りでは、まだ完了していません。詳細については、このスレッドと非常に詳細な回答を参照してください

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

そして、ここにPi固有の答えhttp//www.raspberrypi.org/phpBB3/viewtopic.php?f = 8t = 4938


1
リンクをありがとう。このデバイスは私が望むものの一部を実行するように見えますが、その所有権があり、一方向でのみ動作します(仮想読み取り専用USBストレージ)。
ヤコブ

3

パフォーマンスに特に関心がない場合は、USB大容量ストレージコードを備えたUSB対応マイクロコントローラーを入手できます(たとえば、10ドルのSTM32F0ディスカバリー評価モジュールでSTM32F103デバッグインターフェイスを再プログラムできます)。それをpiのシリアルポートに慎重に接続します。バックエンドとして、数百キロボーで実行します。

イーサネットを介してクライアントPCに接続することでパフォーマンスが向上する可能性がありますが、ホストオペレーティングシステムへのカスタムドライバーまたは別のプレゼンテーションが必要になります。つまり、ネットワーク接続ストレージデバイスまたは共有サーバーになります。

既製のファイル転送ケーブルはすでに述べたと思いますが、それにはクライアントPCの適切なソフトウェアと、piエンドのソースレベルのLinuxドライバーのサポートが必要です。



3

私はArduinoのUSBデバイス、エミュレートできることを発見したArduinoのレオナルドをしても箱から出して。LUFAのUSBスタックは、 Arduinoの上で使用することができ、USBマスストレージデバイスドライバを(参照実装このチュートリアル)。このセットアップは、USBを SDカードリーダーで認識されるようなSCSIコマンドにマッピングするために使用できます。SCSIについては十分に知りませんが、Raspberry PiのSDカードとArduino経由のUSBを同じバスで一緒に使用できるようです。確かにこのアイデアは完全な解決策ではありません...


-1トピックはArduinoではなくRaspberry Piについてであるため。

1
私は知っています、この答えは完全な解決策ではありません!Raspberry Pi自体が目的ではなくツールであるという質問が話題になり、関連するプロジェクトへの視野が広がることを願っています。この場合、USBマスストレージデバイスとしてSDカードを使用する方法をこのチュートリアルで見つけました。Arduinoまたは別のATMEGA32U4を使用して、Raspberry Piでも使用可能なSIPバスにUSBを接続できますか?
ヤコブ

2
いいえ、電気的な切り替え以外では、SDカードへのアクセスを実際に共有することはできません。一度に1つのホストのみが特定のファイルシステムを「マウント」できます(カードで使用されるファイルシステムのタイプの場合-ネットワークファイルシステムはこの点で異なります)。
クリスストラットン

1

これは、USBの仕組みに由来します。2つのものがUSBで接続されるたびに、USBホストとUSBデバイスが存在し、トウェインが場所を切り替えることはありません。USBホストは、USBバスに接続されたすべてのデバイス間でデータ転送を同期するために、USBデバイスがほとんど実行できないあらゆる種類の処理を行います。詳細については、USBウィキペディアのページをご覧ください

あなたが話しているのは、2つのUSBホスト(Raspberry Piとコンピューター)に強制的に通信させることです。残念ながら、これはUSB標準ではサポートされていません。2つのUSBホスト間のデータ転送を偽装できるデバイスがいくつかありますが、Malvineousが述べたように、イーサネットを使用した方が良いでしょう。

あなたの質問は、Raspberry Piを使用してUSBストレージをエミュレートすることについて具体的に言及していますが、Raspberry PiをNASとしてセットアップすることを検討しましたか?Raspberry PiをNASボックスとして使用することは、基本的には要求どおりに機能しますが、USBを使用する代わりにネットワークを使用することになります。 興味をお持ちの場合、これを行う方法に関する優れた手順を以下に示します。


ポインタをありがとう。したがって、私の質問は、Raspberry Piを使用してUSBデバイス実装する方法についてです。ただし、NASはこの質問に対する答えではありません。
ヤコブ

3
Raspberry PiをUSBデバイスにしたい場合は、ftdichip.comで製品を調査することをお勧めします。PiのGPIOピンを使用してFTDIチップとインターフェイスするボードを配線できる可能性が高いです。そしてそれはあなたにUSBデバイス機能を提供します。また、おそらくFTDIデバイスと通信するためのドライバーを作成する必要があります。
ダンB

USB OTGデバイスの場合、「トウェインは場所を切り替える」ことを除いて...
クリスストラットン

1

ストックNokiaカーネルに含まれているusbガジェットドライバーを使用して、古いNokia N900 Phoneで実行できます。エミュレートされたデバイスは実際のデバイスとまったく同じように動作し、そこからPCを起動することもできます。


1
詳細を教えてください。他のほとんどのスマートフォンができるように、USBを介して携帯電話にストレージを提供するだけの話ではありませんか?私の知る限り、USBガジェットドライバーはSCSIからUSBへのマッピングのみを提供するため、SCSIをクラウドストレージAPIにマッピングする必要があります。
ヤコブ

1

Pi ZeroとPi Zero Wが利用可能になり、Gadgetインターフェース(Kernal.orglinux-sunxi.org)をサポートするようになり、USB大容量記憶装置や仮想ネットワークを含むいくつかの異なるプロファイルが可能になりました。

OPの要求に対する最も近い解決策は、PiとホストPCの間でネットワークプロトコルを使用し、Piからクラウド/ネットワークプロバイダーへの他の形式のネットワークプロトコルを使用することです。Pi Zero WにはWi-Fiが組み込まれているため、クラウド/ネットワークプロバイダーに直接接続することもできます。両方のリンクをネットワーク化することが、仕事を成し遂げるための最も簡単な方法です。多くのネットワークプロトコルとクラウドプロバイダーが利用可能です。

USB大容量記憶装置を使用しようとするのは悪い考えです。USB大容量記憶装置とPiの間のドライバーレベルの適応を記述または書き換える必要があります。MTPで開始するか、同様の結果になります。MTPには重大なパフォーマンスの問題(RedditXDAHowToGeekReddit)があるため、ネットワークアプローチをお勧めします。

その方向に多くのプログラムとプロジェクトがあるはずです。Piの観点からは、ファイルサーバー/同期サーバーのように機能しているだけなので、同様のチュートリアルを開始する必要があります。PiベースのSeafileSyncthingSugarSync、およびOwnCloudサーバーのようなものに目を向ければ、あなたは始められるはずです。

USBガジェットとしてのPi Zeroに関する便利なガイド:


0

USB規格はホストベースです。つまり、1つのデバイスが、接続されたデバイスとのすべての通信を制御する必要があります。クライアントは、単純なデバイスまたはハブにすることができます。ハブは、ハブに接続されているクライアントのホストプロキシであり、接続先のホスト(またはハブ)と通信します。

USBの元の設計のように、2つのホスト(PCとRPi)を一緒に接続することはできません。

ただし、USB接続でホストまたはクライアントに接続されているかどうかを確認し、それに応じて役割を調整できるようにする拡張機能USB On-The-Goがあります。これが機能するためには、ハードウェアのサポートが必要です。RPiがそのように設計されているとは信じていません。

詳細については、http: //www.usb.org/home またはhttp://en.wikipedia.org/wiki/Universal_Serial_Busをご覧ください

要するに、私はそれができると信じていません。


別の答えは、OTGサポート発言がないことと矛盾しています。
アレックスチェンバレン

1
@Alex、日付スタンプを見てください。Andersは、Pi ZeroまたはA +が利用可能になる前の2012年にこれを投稿しました。
YetAnotherRandomUser

@YetAnotherRandomUser、日付スタンプを見てください。Andersがコメントを書いた翌日に回答を投稿しました。
アレックスチェンバレン

@AlexChamberlainおよび2012年には、RaspberryおよびRasbperian(または私が知っている他のソフトウェア)に対するサポートはありませんでした。そう、その時間枠で、私は正しかった。RPi Zeroは何年も後に登場しました...今、RPi Zeroのサポートがあります。これは、あなたが書いたように、別の投稿で言及されています。
アンデルス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.