Làm thế nào Raspberry Pi có thể mô phỏng thiết bị lưu trữ USB?


46

Các thiết bị lưu trữ USB, chẳng hạn như thẻ nhớ USB và ổ cứng, thường dùng để gắn bộ nhớ ngoài vào bất kỳ loại máy tính nào. Làm thế nào Raspberry Pi có thể mô phỏng bộ lưu trữ USB? Ứng dụng đơn giản nhất là truy cập trực tiếp vào thẻ SD qua USB, nhưng người ta cũng có thể cung cấp truy cập cho các tệp qua Ethernet. Tôi đã nghĩ về cách bố trí sau đây cho " thanh đám mây USB ":

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

Máy tính chỉ nên nhìn thấy một thanh USB bình thường để đọc và ghi tệp từ đó. Raspberry Pi sẽ hoạt động như một cây cầu lập trình để liệt kê danh sách thư mục và truy cập tệp để yêu cầu lưu trữ đám mây. Bạn có thể truy cập máy chủ lưu trữ đám mây với bất kỳ máy tính nào (bao gồm cả trình phát phương tiện hộp đen) qua USB mà không phải cài đặt bất kỳ phần mềm bổ sung nào trên máy tính. Cầu USB Raspberry Pi cũng có thể mã hóa / giải mã các tệp một cách nhanh chóng, do đó người ta có thể lưu trữ các tệp được mã hóa trên đám mây và truy cập chúng trên bất kỳ thiết bị nào như ổ USB thông thường.

Chỉnh sửa: Các sản phẩm hiện có với chức năng tương tự nhưng có giới hạn bao gồm Wireless Media StickUSB-Over-Network . Có thể truy cập vào các tệp trong đám mây bằng cách gắn bộ lưu trữ ảo bằng ổ đĩa đám mây hoặc phần mềm tương tự và mã hóa bằng TrueCrypt hoặc EncFS - mật khẩu sẽ chỉ được lưu trên thẻ SD của Raspberry Pi nhưng người ta có thể truy cập vào bộ lưu trữ bằng bất kỳ máy tính nào mà không cần phải gõ cụm mật khẩu trên máy không tin cậy.


1
Tôi nghĩ những gì anh ấy muốn là có một phân vùng hoặc thư mục chia sẻ trên Pi của anh ấy có thể gắn kết qua USB trên các máy khác. Ý tưởng là bạn có thể cắm raspi vào bất kỳ máy tính nào và thư mục / phần đó hoạt động như một ổ đĩa flash và có thể được ghi vào mà không cần bất kỳ phần mềm bổ sung nào.
wmarbut

3
Pi chỉ nên đóng vai trò là cổng kết nối giữa bất kỳ máy tính nào , bao gồm cả hộp đen và ví dụ như đám mây Amazon. Cổng cũng có thể mã hóa các tập tin một cách nhanh chóng.
Jakob

1
Phế liệu đó - điều này sẽ là hoàn hảo!
Alex Chamberlain

1
@AlexChamberlain - không, bạn không thể. Các thiết bị lưu trữ USB có một giao thức cụ thể được hỗ trợ bởi hệ điều hành máy chủ. Tất nhiên, bạn có thể tạo trình điều khiển để biến một thứ khác trông giống như một loại thiết bị lưu trữ cho một hệ điều hành cụ thể, nhưng nó sẽ không phải là thiết bị "USB Mass Storage" mà là "thiết bị lưu trữ tùy chỉnh được kết nối qua USB"
Chris Stratton

1
@ppumkin: Vì "ánh xạ ổ đĩa trong" hoặc "cắm vào mạng LAN" yêu cầu phải định cấu hình PC (hoặc trình phát phương tiện). Chỉ cần cắm vào cổng USB không yêu cầu quản trị và người ta không cần tiết lộ bất kỳ mật khẩu nào cho PC. Lưu ý rằng tôi muốn chia sẻ bộ nhớ từ ổ đĩa đám mây, vốn luôn yêu cầu mật khẩu hoặc thậm chí cài đặt phần mềm máy khách.
Jakob

Câu trả lời:


12

Vấn đề là kết nối USB của Pi với PC không có các chân dữ liệu được kết nối - chỉ có các chân nguồn. Vì vậy, bạn không thể sử dụng điều này để nói USB vì nó không có dây.

Tùy chọn duy nhất của bạn với Pi sẽ là 'bit bang' USB bằng các chân GPIO, nhưng điều này rất chậm và có khả năng không đáng tin cậy. Tôi nghi ngờ bạn chỉ thực sự có thể giả lập bàn phím hoặc chuột - bất cứ điều gì băng thông cao hơn có thể là quá nhiều để CPU có thể đối phó, với các yêu cầu chặt chẽ về thời gian của việc đập một cái gì đó như USB.

Một cách khác là tìm một thiết bị cho phép bạn kết nối hai máy tính với nhau qua USB, để tạo ra một loại mạng. Nhưng sau đó, bạn cũng có thể sử dụng kết nối Ethernet ...


1
Trước đây tôi đã chơi với GP32 có thể hoạt động như một máy chủ ngay cả khi cắm vào một trung tâm như một máy khách. Nếu Raspberry có thể hoạt động giống như một máy chủ lưu trữ trên các cổng USB (không phải nguồn điện) thì cũng có thể có một mẹo tương tự. Có lẽ USB-to-go có thể làm điều đó?
Thorbjørn Ravn Andersen

2
Huh? Bạn bị nhầm bởi cổng micro usb được sử dụng cho bộ điều hợp nguồn. Còn 2 cổng USB thích hợp thì sao? Với một số phần mềm mô phỏng, có thể cắm usb đó vào PC và giả lập Storage - ví dụ: điện thoại Android khi bạn cắm usb. - Nhưng không có lý do nào cho điều đó bởi vì bạn cắm Pi vào mạng của mình, chia sẻ thư mục "đám mây" của bạn qua samba hoặc bất cứ điều gì (wifi hoặc lan) - và đồng thời thực hiện đồng bộ đám mây của bạn bất cứ điều gì bạn muốn làm . LAN có thể xử lý nhiều yêu cầu trên các cổng khác nhau
Piotr Kula

2
@ppumkin: Tại sao tôi bị nhầm bởi cổng micro USB? Các chân dữ liệu không được kết nối, vì vậy bạn không thể gửi dữ liệu qua nó. Các cổng USB "thích hợp" xuôi dòng là cổng 'máy chủ', do đó không thể cắm chúng vào PC mà không có một loại thiết bị chuyển đổi nào ở giữa. Giả lập phần mềm là không đủ, vì cách thức hoạt động của giao thức USB. Bạn có thể nghĩ về Ethernet, nơi bạn có thể cắm bất kỳ hai thiết bị nào với nhau, nhưng USB không hoạt động như thế này. Nếu bạn không tin tôi, hãy đọc thông số kỹ thuật USB, đặc biệt là các phần về máy chủ USB so với thiết bị ngoại vi.
Malvineous

1
Chỉ muốn thêm rằng USB "Bit-banging" không phải là một tùy chọn. USB là một chặng đường dài từ một thứ như I2C có thể bị đập một chút. Có thể cách tiếp cận thực tế nhất là sử dụng một trong những micrô AVR có cổng thiết bị USB được tích hợp trong đó, sau đó giao tiếp với nó thông qua cổng nối tiếp trên Pi. (ví dụ: olimex.com/ Products/AVR/Proto/AVR-USB-162 )
greggo

1
@Malvineous Ở 12 MHz hay chỉ 1.5? Thời gian đồng hồ là [83,33 +/- 0,2 us] cho 12 Mhz và [666.6 +/- 10 us] cho 1,5 MHz. Hãy nhớ rằng bạn cần khôi phục đồng hồ khi nhận, điều đó có nghĩa là lấy mẫu ít nhất 5 - 10 lần tốc độ đồng hồ. Những triển khai này có cho phép ngắt trong khi nói chuyện với các thiết bị USB không?
greggo

8

Dựa trên sự hỗ trợ nhanh chóng của bảng dữ liệu BCM2835 (http://www.raspberrypi.org/wp-content/uploads/2012/02/BCM2835-ARM-Perodesals.pdf) chương 15, có vẻ như USB OTG được hỗ trợ trong Về mặt lý thuyết, CTNH có thể chỉ là vấn đề của SW để hỗ trợ cho kế hoạch đề xuất. Tôi không phải là một chuyên gia về giao thức USB (hoặc thậm chí là người mới, thực sự), nhưng sẽ rất tuyệt nếu có chức năng này.

Nhìn vào một mô tả về BeagleBone (http://elinux.org/BeagleBone), nó dường như hỗ trợ một cái gì đó tương tự, mặc dù có đề cập cụ thể về một trình kết nối hỗ trợ chế độ này. Sẽ thật đáng tiếc nếu Raspberry Pi bị giới hạn chỉ do lựa chọn đầu nối.

Hy vọng điều này là hữu ích.


2
Ngay cả khi SOC hỗ trợ nó, thiết bị trung tâm LAN9512 trên model B có thể cản trở việc chạy cổng USB "ngược" ở chế độ thiết bị. Trên mô hình A (hoặc nếu bạn loại bỏ điều đó và cài đặt R37 & R38), bạn có thể đưa cổng USB SOC sang giắc cắm bên ngoài - nhưng sau đó bạn sẽ không có ethernet và sẽ chỉ có thẻ sdcard để lưu trữ tiềm năng.
Chris Stratton

6

Điều này bây giờ dường như có thể sử dụng PiZero - xem http://pi.gbaman.info/?p=699 để biết thêm.


1
Chào mừng đến với Raspberry Pi! Trong khi về mặt lý thuyết có thể trả lời câu hỏi, tốt hơn là nên bao gồm các phần thiết yếu của câu trả lời ở đây và cung cấp liên kết để tham khảo.
Ghanima

4

Thật không may, mặc dù điều này có vẻ đơn giản, tốt nhất như tôi có thể nói, nó đã không được thực hiện. Xem chủ đề này và câu trả lời rất chi tiết để biết thêm chi tiết

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

Và một câu trả lời cụ thể về Pi tại đây: http://www.raspberrypi.org/phpBB3/viewtopic.php?f=8&t=4938


1
Cảm ơn các liên kết. Có vẻ như thiết bị này có thể thực hiện một phần những gì tôi muốn, nhưng nó độc quyền và chỉ hoạt động theo một hướng (bộ lưu trữ USB chỉ đọc ảo).
Jakob

3

Nếu bạn không đặc biệt quan tâm đến hiệu suất, có lẽ bạn có thể có một bộ vi điều khiển có khả năng USB với mã lưu trữ dung lượng lớn USB (ví dụ bạn có thể lập trình lại giao diện gỡ lỗi STM32F103 trên mô-đun eval khám phá STM32F0 $ 10), cẩn thận kết nối nó với cổng nối tiếp của pi như một kết thúc trở lại, và chạy ở vài trăm kilobaud.

Hiệu suất tốt hơn có thể có bằng cách giao tiếp với PC khách qua ethernet, nhưng điều đó sẽ yêu cầu trình điều khiển tùy chỉnh hoặc bản trình bày khác cho hệ điều hành máy chủ - tức là, bạn sẽ là thiết bị lưu trữ gắn mạng hoặc máy chủ chia sẻ.

Tôi tin rằng đã được đề cập đến cáp chuyển tập tin, nhưng điều đó sẽ yêu cầu phần mềm thích hợp cho PC khách và hỗ trợ trình điều khiển linux cấp nguồn cho đầu cuối pi.



3

Tôi phát hiện ra rằng Arduino có thể mô phỏng một thiết bị USB, Arduino Leonardo thậm chí còn ra khỏi hộp. Các LUFA USB stack có thể được sử dụng trên Arduino và nó thực hiện một trình điều khiển USB thiết bị lưu trữ hàng loạt (xem hướng dẫn này ). Thiết lập này có thể được sử dụng để ánh xạ các lệnh USB sang SCSI, như được đọc bởi đầu đọc thẻ SD. Tôi không biết đủ về SCSI nhưng có vẻ như thẻ SD trên Raspberry Pi và USB-via-Arduino có thể được sử dụng cùng nhau trên cùng một xe buýt. Chắc chắn ý tưởng này không phải là một giải pháp đầy đủ ...


-1 Vì chủ đề là về Raspberry Pi chứ không phải Arduino.

1
Tôi biết, câu trả lời này là không có giải pháp đầy đủ! Tôi hy vọng rằng các câu hỏi về Raspberry Pi như một công cụ thay vì kết thúc chính nó là chủ đề và mở rộng quan điểm cho dự án liên quan sẽ giúp ích. Trong trường hợp này, tôi đã tìm thấy hướng dẫn này cách sử dụng thẻ SD làm thiết bị lưu trữ dung lượng lớn USB. Có lẽ ai đó có thể sử dụng Arduino hoặc ATMEGA32U4 khác để đưa USB vào bus SIP cũng có sẵn trên Raspberry Pi?
Jakob

2
Không, bạn thực sự không thể chia sẻ quyền truy cập vào sdcard, ngoài việc chuyển đổi điện. Mỗi lần chỉ có một máy chủ có thể "gắn kết" một hệ thống tệp nhất định (đối với các loại hệ thống tệp được sử dụng trên thẻ - hệ thống tệp mạng khác nhau về mặt này).
Chris Stratton

1

Điều này nói về cách thức hoạt động của USB, bạn sẽ thấy bất cứ khi nào hai thứ được kết nối với USB, có tất cả các cách một máy chủ USB và thiết bị USB và không bao giờ có thể chuyển đổi vị trí. Máy chủ USB thực hiện tất cả các loại mà thiết bị USB không thể thực hiện chủ yếu để đồng bộ hóa truyền dữ liệu giữa tất cả các thiết bị được kết nối với bus USB. Kiểm tra trang wikipedia USB để biết thêm thông tin .

Những gì bạn đang nói là làm cho hai máy chủ USB (Raspberry Pi và máy tính) liên lạc với nhau, điều không may là không được hỗ trợ bởi tiêu chuẩn USB. Có một số thiết bị có thể giả mạo truyền dữ liệu giữa hai máy chủ USB nhưng như Malvineous đã đề cập, bạn nên sử dụng ethernet tốt hơn.

Câu hỏi của bạn đề cập cụ thể đến việc sử dụng Raspberry Pi để mô phỏng bộ lưu trữ USB nhưng bạn đã xem xét việc thiết lập Raspberry Pi như một NAS chưa? Sử dụng Raspberry Pi làm hộp NAS về cơ bản thực hiện chính xác những gì bạn yêu cầu nhưng thay vì sử dụng USB, nó sẽ sử dụng mạng của bạn. Dưới đây là những hướng dẫn tuyệt vời về cách làm điều này nếu bạn quan tâm.


Cảm ơn các con trỏ. Vì vậy, câu hỏi của tôi là về cách triển khai thiết bị USB bằng Raspberry Pi. Một NAS, tuy nhiên không phải là một câu trả lời cho câu hỏi này.
Jakob

3
Nếu bạn muốn Raspberry Pi có khả năng trở thành thiết bị USB, tôi khuyên bạn nên điều tra các sản phẩm tại ftdichip.com nhiều khả năng bạn sẽ có thể kết nối một bảng sử dụng chân GPIO của Pi để giao tiếp với chip FTDI và điều đó sẽ cung cấp cho bạn khả năng thiết bị USB. Có lẽ bạn cũng cần phải viết trình điều khiển để liên lạc với thiết bị FTDI.
Dan B

Ngoại trừ việc "twain sẽ chuyển đổi địa điểm" nếu chúng là thiết bị OTG USB ...
Chris Stratton

1

Tôi có thể làm điều đó với Điện thoại Nokia N900 cũ của mình bằng trình điều khiển tiện ích usb đi kèm với hạt nhân Nokia. Thiết bị mô phỏng hoạt động chính xác như một thiết bị thực, thậm chí bạn có thể khởi động PC từ nó.


1
Bạn có thể cung cấp một số chi tiết? Bạn không nói về việc chỉ cung cấp bộ nhớ trong điện thoại của mình qua USB như hầu hết các điện thoại thông minh khác có thể làm được, phải không? Theo tôi hiểu, trình điều khiển tiện ích USB chỉ cung cấp ánh xạ từ SCSI sang USB , do đó, người ta vẫn cần ánh xạ SCSI sang một số API lưu trữ đám mây.
Jakob

1

Hiện tại Pi Zero và Pi Zero W đã có sẵn và hỗ trợ giao diện Tiện ích ( Kernal.org , linux-sunxi.org ) cho phép một số cấu hình khác nhau, bao gồm USB Mass Storage và mạng ảo.

Giải pháp gần nhất cho yêu cầu của OP là sử dụng giao thức kết nối mạng giữa Pi và PC chủ, sau đó là một dạng giao thức mạng khác từ Pi đến nhà cung cấp đám mây / mạng. Pi Zero W đã tích hợp Wi-Fi, do đó thậm chí có thể kết nối trực tiếp với nhà cung cấp đám mây / mạng. Kết nối cả hai liên kết đó sẽ là cách dễ nhất để hoàn thành công việc. Có nhiều giao thức mạng và nhà cung cấp đám mây có sẵn.

Cố gắng sử dụng USB Mass Storage sẽ là một ý tưởng tồi; bạn sẽ phải viết hoặc viết lại một bản điều chỉnh ở cấp trình điều khiển giữa USB Mass Storage và Pi. Bạn sẽ bắt đầu với MTP hoặc kết thúc với một cái gì đó tương tự. MTP có vấn đề về hiệu năng nghiêm trọng ( Reddit , XDA , HowToGeek , Reddit ) vì vậy tôi đề xuất phương pháp kết nối mạng.

Cần có rất nhiều chương trình và dự án theo hướng đó. Từ quan điểm của Pi, nó chỉ hoạt động như một máy chủ / máy chủ đồng bộ hóa, vì vậy mọi hướng dẫn tương tự sẽ giúp bạn bắt đầu. Nhìn vào những thứ như máy chủ Seafile , Syncthing , SugarSyncownCloud dựa trên Pi sẽ giúp bạn bắt đầu.

Một vài hướng dẫn hữu ích trên Pi Zero dưới dạng tiện ích USB:


0

Các tiêu chuẩn USB là dựa trên máy chủ. Điều đó có nghĩa là một thiết bị phải điều khiển mọi giao tiếp với các thiết bị được kết nối. Khách hàng có thể là một thiết bị đơn giản hoặc một trung tâm. Hub là proxy máy chủ cho các máy khách được kết nối với hub và liên lạc với máy chủ (hoặc hub) mà nó được kết nối.

Như thiết kế ban đầu của USB, bạn không thể kết nối hai máy chủ với nhau (PC và RPi).

Mặc dù vậy, vẫn có nhiều mức độ, USB On-The-Go , cho phép kết nối USB để xem nó có được kết nối với máy chủ hoặc máy khách hay không và điều chỉnh vai trò của nó tùy thuộc vào điều đó. Để làm việc này, bạn phải có hỗ trợ trong phần cứng. Tôi không tin RPi được thiết kế để làm điều đó.

Để biết thêm thông tin, hãy xem att http://www.usb.org/home hoặc thậm chí http://en.wikipedia.org/wiki/Universal_Serial_Bus

Nói tóm lại, tôi không tin rằng nó có thể được thực hiện.


Một câu trả lời khác mâu thuẫn với việc bạn thiếu nhận xét hỗ trợ OTG.
Alex Chamberlain

1
@Alex, nhìn vào tem ngày. Anders đã đăng bài này vào năm 2012, trước khi Pi Zero hoặc A + có sẵn.
YetAnotherRandomUser

@YetAnotherRandomUser, nhìn vào tem ngày. Tôi đã đăng phản hồi của mình một ngày sau khi Anders viết bình luận của mình.
Alex Chamberlain

@AlexChamberlain và vào năm 2012, không có hỗ trợ nào cho Raspberry và Rasbperian (hoặc bất kỳ phần mềm nào khác mà tôi biết). Vì vậy, có, trong khung thời gian đó, tôi đã đúng. RPi Zero xuất hiện nhiều năm sau đó ... Bây giờ chúng tôi có hỗ trợ cho RPi Zero, được đề cập trong một bài đăng khác, như bạn đã viết.
Anders
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.