Як Raspberry Pi може імітувати USB-накопичувач?


46

USB-пристрої для зберігання даних, такі як USB-накопичувачі та жорсткі диски, звичайні для приєднання зовнішнього сховища до будь-якого типу комп'ютера. Як Raspberry Pi може імітувати USB-накопичувач? Найпростішим додатком було прямий доступ до SD-карти через USB, але можна також забезпечити доступ до файлів через Ethernet. Я подумав про наступний макет для " USB хмарової палички ":

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

Комп'ютер повинен бачити лише звичайний USB-накопичувач для читання та запису файлів. Raspberry Pi буде виконувати функцію програмованого моста, який відображає списки каталогів та доступ до файлів для запиту до хмарного сховища. Ви можете отримати доступ до хостерів для зберігання хмарних даних на будь-якому комп’ютері (включаючи мультимедійні плеєри) через USB, не встановлюючи на комп'ютері жодного додаткового програмного забезпечення . USB-міст Raspberry Pi також повинен мати можливість шифрувати / розшифровувати файли на льоту, щоб можна було зберігати файли, зашифровані в хмарі, та отримувати доступ до них на будь-якому пристрої, як звичайний USB-накопичувач.

Редагувати: Існуючі продукти з подібною, але обмеженою функціональністю включають Wireless Media Stick та USB-over-Network . Доступ до файлів у хмарі може бути можливим, встановивши віртуальний накопичувач із хмарним накопичувачем або подібним програмним забезпеченням та шифруючи за допомогою TrueCrypt або EncFS - паролі зберігатимуться на SD-картці Raspberry Pi, але можна отримати доступ до пам’яті на будь-якому комп’ютері без необхідності наберіть парольну фразу на ненадійній машині.


1
Я думаю, що він хоче - мати на своєму Pi розділ або загальну папку, які можна встановити через USB на інших машинах. Ідея полягає в тому, що ви можете підключити raspi до будь-якого комп'ютера, і ця папка / розділ діє як флешка, і до неї можна записувати без додаткового програмного забезпечення.
wmarbut

3
Pi повинен діяти лише як шлюз між будь-яким комп'ютером, включаючи чорні скриньки, і, наприклад, хмарою Amazon. Шлюз також міг зашифрувати файли на ходу.
Якоб

1
Ломайте це - це було б ідеально!
Алекс Чемберлен

1
@AlexChamberlain - ні, не можна. USB-пристрої масового зберігання мають певний протокол, який підтримується операційною системою хоста. Звичайно, ви можете створити драйвер, щоб зробити щось іншим схожим на певний пристрій зберігання даних для певної операційної системи, але це був би не пристрій "USB Mass Storage", а скоріше "спеціальний пристрій зберігання даних, підключений через USB"
Chris Stratton

1
@ppumkin: Оскільки для "відображення накопичувача" або "підключення до локальної мережі" потрібно налаштувати ПК (або медіаплеєр). Просто підключення до порту USB не вимагає адміністрації, і не потрібно виставляти паролі на ПК. Зауважте, що я хочу ділитися сховищем з хмарного диска, який завжди вимагає паролів або навіть встановлення клієнтського програмного забезпечення.
Якоб

Відповіді:


12

Проблема полягає в тому, що USB-з'єднання Pi до ПК не підключає шпильки даних - лише шнури живлення. Тому ви не можете використовувати це для розмови через USB, оскільки він не підключений до мережі.

Вашим єдиним варіантом з Pi буде те, щоб "покусати" USB за допомогою штифтів GPIO, але це дуже повільно і потенційно ненадійно. Я підозрюю, що ти зможеш наслідувати лише клавіатуру чи мишу - все, що більш висока пропускна здатність, ймовірно, буде занадто великим, щоб CPU впорався з цим, враховуючи жорсткі вимоги до часового розриву, наприклад, USB.

Іншою альтернативою було б знайти пристрій, який дозволяє з'єднати два комп’ютери разом через USB, щоб створити своєрідну мережу. Але тоді ви можете просто використовувати з'єднання Ethernet ...


1
Раніше я грав з GP32, який може вести себе як хост, навіть коли він підключається до хабу як клієнт. Якщо Raspberry може вести себе як хост на USB-портах (не силовому), то подібний трюк повинен бути можливий і там. Можливо, USB-to-go може це зробити?
Thorbjørn Ravn Andersen

2
Так? Ви помиляєтеся через мікро-порт USB, який використовується для адаптера живлення. Що з 2 належними портами USB? За допомогою певного програмного забезпечення для емуляції можна було б підключити цей usb до ПК та емулювати сховище, наприклад - телефон Android під час підключення usb. - Але в цьому немає причин, тому що ви підключаєте Pi у свою мережу, діліться папкою "хмара" через самбу чи що завгодно (wifi чи lan) - а також одночасно виконайте синхронізацію хмари, що б ви хотіли робити. . LAN може обробляти безліч запитів у різних портах
Piotr Kula

2
@ppumkin: Чому я помиляюся через порт USB USB? Штифти даних не підключені, тому ви не можете надсилати дані через них. Нижній "належний" порт USB - це "хост" порти, тому неможливо підключити їх до ПК без якогось пристрою перетворювача посередині. Емуляції програмного забезпечення недостатньо, тому що працює протокол USB. Ви можете думати про Ethernet, де ви можете підключити будь-які два пристрої разом, але USB не працює так. Якщо ви мені не вірите, прочитайте специфікацію USB, особливо частини про USB-хости та периферійні пристрої.
Malvineous

1
Просто хотів додати, що USB "Біт-бабінг" - це не варіант. USB - це довгий і довгий шлях від чогось подібного до I2C, який може бути розбитий. Можливо, найбільш практичним підходом є використання одного з тих мікроелементів AVR, у яких вбудований порт USB-пристрою, а потім спілкування з ним через послідовний порт на Pi. (наприклад, olimex.com/Products/AVR/Proto/AVR-USB-162 )
greggo

1
@Malvineous На 12 МГц або просто 1,5? Період тактової частоти становить [83,33 +/- 0,2 us] для 12 МГц, а [666,6 +/- 10 us] для 1,5 МГц. Майте на увазі, що вам потрібно відновити годинник при отриманні, що, ймовірно, означає вибірку принаймні в 5 - 10 разів більше тактової частоти. Чи дозволяють ці реалізації перервати час розмови з USB-пристроями?
greggo

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 підтримує його, пристрій концентратора LAN9512 на моделі B, ймовірно, перешкоджає роботі USB-порту «назад» в режимі пристрою. На моделі A (або, якщо ви її видалите та встановите R37 & R38), ви можете отримати USB-порт SOCs до зовнішнього гнізда - але тоді ви не мали б Ethernet, а матимете лише sdcard для потенційного зберігання.
Кріс Страттон

6

Зараз, здається, це можливо за допомогою PiZero - див. Http://pi.gbaman.info/?p=699 для отримання додаткової інформації.


1
Ласкаво просимо до Raspberry Pi! Хоча це теоретично може відповісти на питання, бажано було б сюди включити істотні частини відповіді та надати посилання для довідки.
Ghanima

4

На жаль, хоча це здається простим, як краще, наскільки я можу сказати, це не було зроблено. Дивіться цю тему та дуже детальну відповідь для отримання більш детальної інформації

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

А конкретна відповідь Pi тут: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=8&t=4938


1
Дякуємо за посилання. Схоже, цей пристрій може робити частину того, що я хочу, але він є власним і працює лише в одному напрямку (віртуальна пам'ять USB лише для читання).
Якоб

3

Якщо вас не особливо турбує продуктивність, ви, можливо, можете отримати мікроконтролер, здатний USB, з кодом масового зберігання USB (ви можете, наприклад, перепрограмувати інтерфейс налагодження STM32F103 на модулі виправлення eval $ 10 STM32F0), обережно підключіть його до послідовного порту pi як задній кінець, і бігати на кілька сотень кілобад.

Більш високу продуктивність, швидше за все, мали б взаємодії з клієнтським ПК через Ethernet, але це вимагало б користувальницького драйвера або іншої презентації на хост-операційній системі - тобто ви будете приєднаним до мережі пристроєм зберігання даних або спільним сервером.

Я вважаю, що вже не було згаданих кабелів для передачі файлів на полицях, але для цього потрібне відповідне програмне забезпечення для клієнтського ПК та підтримка драйверів Linux для драйвера на рівні джерела.


Так. Дивіться також olimex.com/Products/AVR/Proto/AVR-USB-162
greggo

3

Я дізнався, що Arduino може імітувати USB-пристрій, Arduino Leonardo навіть поза коробкою. Стек USB LUFA може бути використаний на Arduino і реалізує драйвера USB-накопичувача (див цей підручник ). Ця настройка може використовуватися для зіставлення USB-команд SCSI, таких як, зрозуміла зчитувача SD-карт. Я не знаю достатньо про SCSI, але схоже, що SD-карта на Raspberry Pi і USB-через-Arduino можуть використовуватися разом на одній шині. Звичайно, ця ідея не є повноцінним рішенням ...


-1 Оскільки тема стосується Raspberry Pi, а не Arduino.

1
Я знаю, ця відповідь не є повним рішенням! Я сподіваюся, що питання щодо Raspberry Pi як інструменту замість самоцілі є темою, а розширення погляду на пов'язаний проект допомагає. У цьому випадку я знайшов цей підручник, як використовувати SD-карту як USB-накопичувач. Може, можна скористатися Arduino або іншим ATMEGA32U4, щоб отримати USB до шини SIP, яка також доступна на Raspberry Pi?
Якоб

2
Ні, ви не можете дійсно ділити доступ до sdcard, крім електричного перемикання. Тільки один хост може одночасно «змонтувати» дану файлову систему (для типів файлових систем, які використовуються на картках - мережеві файлові системи в цьому відношенні різні).
Кріс Страттон

1

Це зводиться до того, як працює USB, ви бачите всякий раз, коли дві речі з'єднані з USB, є всі способи USB-хост і USB-пристрій, і ніколи не змінювати місця. USB-хост робить усі види речей, які USB-пристрої не можуть робити переважно для синхронізації передачі даних між усіма пристроями, підключеними до шини USB. Перегляньте сторінку Вікіпедії USB для отримання додаткової інформації .

Що ви говорите про те, щоб змусити два хости USB (Raspberry Pi і комп'ютер) спілкуватися, які, на жаль, просто не підтримуються стандартом USB. Є деякі пристрої, які можуть підробити передачу даних між двома USB-хостами, але, як згадував Malvineous, вам краще використовувати Ethernet.

У вашому питанні конкретно згадується використання Raspberry Pi для емуляції USB-пам’яті, але ви розглядали можливість створення Raspberry Pi як NAS? Використання Raspberry Pi в коробці NAS в основному робить саме те, що ви просили, але замість USB використовуйте вашу мережу. Ось чудові інструкції, як це зробити, якщо вас цікавить.


Дякую за покажчики Тому мої запитання стосуються того, як реалізувати USB-пристрій за допомогою Raspberry Pi. Однак NAS не є відповіддю на це питання.
Якоб

3
Якщо ви хочете, щоб Raspberry Pi мав можливість бути пристроєм USB, я пропоную вам вивчити продукти на ftdichip.com більш ніж ймовірно, ви зможете підключити дошку, яка використовує шпильки GPIO Pi для взаємодії з мікросхемою FTDI і це дасть вам можливість USB-пристрою. Можливо, вам також знадобиться написати драйвер для зв'язку з пристроєм FTDI.
Дан Б

За винятком того, що "твен перемкне місця", якщо вони є пристроями USB OTG ...
Chris Stratton

1

Я можу це зробити зі старим телефоном Nokia N900, використовуючи драйвер USB-гаджета, що входить до складу ядра Nokia. Емульований пристрій поводиться точно як справжній, з нього можна навіть завантажувати ПК.


1
Чи можете ви надати деякі деталі? Ви не говорите про те, щоб просто забезпечити сховище на телефоні через USB, як це можуть зробити більшість інших смартфонів, чи не так? Наскільки я розумію, драйвер USB-гаджетів забезпечує лише зіставлення зі SCSI на USB , тому все-таки потрібно буде зіставити SCSI з деяким хмарним API зберігання.
Якоб

1

Pi Zero і Pi Zero W тепер доступні та підтримують інтерфейс Gadget ( Kernal.org , linux-sunxi.org ), що дозволяє отримати декілька різних профілів, включаючи USB Mass Storage та віртуальну мережу.

Найближчим рішенням запиту ОП є використання мережевого протоколу між Pi та головним ПК, а потім деякою іншою формою мережевого протоколу від Pi до хмарного / мережевого провайдера. Pi Zero W має вбудований Wi-Fi, тому навіть може підключитися безпосередньо до хмарного / мережевого провайдера. Мережа обох цих посилань буде найпростішим способом зробити роботу. Доступно багато мережевих протоколів та хмарних провайдерів.

Спроба використовувати USB Mass Storage була б поганою ідеєю; вам доведеться написати або переписати адаптацію рівня драйвера між USB Mass Storage та Pi. Ви б або почали з MTP , або завершили щось подібне. MTP має серйозні проблеми з продуктивністю ( Reddit , XDA , HowToGeek , Reddit ), тому я пропоную підхід до мереж.

У цьому напрямку має бути багато програм та проектів. З точки зору Pi, він просто діє як сервер файлів / синхронізації, тому будь-який подібний підручник повинен розпочати роботу. Дивлячись на такі речі , як Pi на основі Seafile , Syncthing , SugarSync і OwnCloud сервери повинні отримати ви почали.

Кілька корисних посібників про Pi Zero як USB-гаджет:


0

Стандарт USB - це хост. Це означає, що один пристрій повинен контролювати всю комунікацію з підключеними пристроями. Клієнти можуть бути простим пристроєм або хабом. Центр - це проксі-сервер для клієнтів, підключених до центру, і спілкується з хостом (або концентратором), до якого він підключений.

Як виглядає оригінальний дизайн USB, ви не можете з'єднати два хости разом (ваш ПК та RPi).

Однак є розширення USB On-The-Go , які дозволяють USB-з'єднанню бачити, чи підключено він до хоста чи клієнта, і регулюють його роль залежно від цього. Для цього вам потрібно мати підтримку обладнання. Я не вірю, що RPi призначений для цього.

Для отримання додаткової інформації дивіться на веб-сайті http://www.usb.org/home або навіть http://en.wikipedia.org/wiki/Universal_Serial_Bus

Словом, я не вірю, що це можна зробити.


Ще одна відповідь суперечить вашій відсутності зауваження щодо підтримки ОТГ.
Алекс Чемберлен

1
@ Алекс, подивися на позначки дати. Андерс розмістив це у 2012 році, перш ніж Pi Zero або A + були доступні.
YetAtherRandomUser

@YetATHERRandomUser, подивіться на позначки дати. Я опублікував свою відповідь наступного дня після того, як Андерс написав його коментар.
Алекс Чемберлен

@AlexChamberlain і в 2012 році не було підтримки для Raspberry і Rasbperian (або будь-якого іншого програмного забезпечення, яке я знаю). Так, так, у ЦІ часові рамки я мав рацію. RPI Zero з'явився через багато років ... Тепер ми маємо підтримку для RPi Zero, про яку згадується в іншому дописі, як ви писали.
Андерс
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.