Leider finden sich über diese Variante nicht so viele Informationen im Netz beziehungsweise die meisten Artikel sind schon älter...
Hintergrund:
Der SoC aller (bisherigen) Pi's hat intern einen einzigen USB Port, einen sog. USB-OTG den man in Master- oder Slave-Modus versetzen kann. Bei den "normalen" RaspberryPi's ist an diesen einen USB-Port vom SoC ein USB-Hub-Controller angeschlossen, der wiederum die weiteren USB-Ports sowie LAN zur Verfügung stellt. Leider kann man dann den USB-OTG nicht mehr derart nutzen..
Bei den RaspberryPi Modellen A, A+ und Zero hat man aber glücklicherweise auf den USB-Hub-Controller verzichtet und den USB-OTG-Port der SoC direkt herausgeführt. Dadurch hat man dann zwar auch nur einen einzigen USB-Port, der sich aber wie gesagt auch in den Slave-Modus versetzen lässt. Genau das macht man sich hier zu nutze.
Es gibt viele verschiedene USB-Gadget-Modes, ich möchte hier aber nur auf einen eingehen: g_mass_storage
Mit einem PiZeroW kann man dadurch einen WLAN-Fähigen-Datenträger realisieren, auf den man zB via Samba zugreifen kann.
Denkbare Einsatzmöglichkeiten wäre, den PiZeroW an ein Bilderrahmen oder TV anzuschließen - sobald sich der Inhalt verändert kann ein aushängen und neu einstecken des "FlashDrives" hervorgerufen werden etc.. Möglichkeiten gäbe es viele
Ziel ist es aber nicht Platzhirsche wie KODI den Rang streitig zu machen. Gestreamt o.ä. werden soll nichts, der Pi selbst spielt nichts ab. Das sollte nicht verwechselt werden.
Grob umschrieben:
Auf dem Pi wird ein extra Datenträger angelegt - eine Image-Datei.
Der Pi wird via USB an ein Gerät angeschlossen, auf dem dann ein "Wechseldatenträger" verfügbar ist.
Die Dateien liegen auf dem Pi, in besagter Image-Datei. Nur mit dem PiZeroW kommt zusätzlich noch WLAN hinzu.
Sofern das Gerät an ist kann man auf den Pi zugreifen - und zum Beispiel einrichten via Samba auf den extra Datenträger zuzugreifen...
Der Pi behält ansonsten seine normale Funktionalität.
Nötige Voraussetzung:
Außerdem funktioniert das Unterfangen auf dem Pi erst ab Kernel 4.4
Derzeit scheint es auch noch Probleme mit Raspbian Stretch zu geben - ich konnte es bisher nur mit Jessie zum laufen bringen, genauer gesagt hiermit (letztes Raspbian-Lite Image das raus kam).
Man kann nicht die gesamte SD Karte als "FlashDrive" freigeben, sondern muss dafür ein gesondertes/extra Device einrichten - in diesem Fall eine Image-Datei die wir aber erst erzeugen müssen... Es funktioniert aber auch eine extra Partition auf der SD...
Es wird eine 2 GB große Datei erzeugt.
Anschließend ist es wichtig das auf dieser großen Datenträger-Datei auch eine Partition eingerichtet wird:
(
echo x # switch to eXpert mode
echo s # set sectors/track
echo 8 # g_mass_storage uses a sector size of 512 bytes, so 8 sectors/track will give us 4096 bytes per track
echo h # set number of heads
echo 16
echo c # set number of cylinders
echo 32768 # 2GB = 2097152 kb / 64 tracks = 32768 cylinders
echo r # return to normal mode
echo n # new partition
echo p # primary
echo 1
echo # accept default
echo # accept default
echo t # new partition is created by default as a Linux partition. Since you want to use the gadget with a Windows host, you should change the partition type to FAT32
echo b
echo a # partition should be set as active or USB drive will not be attached to the file-system when plugged in.
echo p # print new partition table to verify..
echo w # Write changes
) | sudo fdisk /usbdisk.img
Display More
...via copy&paste alles auf einmal in die Konsole einfügen...
Die Größe der cylinders müsst ihr der von euch gewählten Datenträger-Datei anpassen.
Die Berechnung solltet ihr hierüber machen: http://www.unitconversion.org/unit_converter/data-storage.html
Nun müsste man eigentlich noch eine Formatierung durchführen, aber das kann auch Windows machen sobald der Datenträger erkannt wurde
...ansonsten geht das aber natürlich auch über Linux...
losetup -o $((2048*512)) /dev/loop0 /usbdisk.img
mkfs -t vfat -v /dev/loop0 -n usbdisk
losetup -d /dev/loop0
mit "-n" wird das Label gesetzt.
Das Offset richtet sich nach dem "Start" Wert der euch über "fdisk -lu /usbdisk.img" angezeigt wird:
root@raspberrypi:~# fdisk -lu /usbdisk.img
Disk /usbdisk.img: 2 GiB, 2097152000 bytes, 4096000 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x70c92968
Device Boot Start End Sectors Size Id Type
/usbdisk.img1 * 2048 4095999 4093952 2G 6 FAT16
root@raspberrypi:~#
Display More
Jetzt folgt der erste Test ob das ganze überhaupt funktioniert - wir laden das Kernel Module:
...natürlich solltet ihr den PiZero(W) längst über USB, und natürlich auch der USB Buchse am Pi, mit eurem PC verbunden haben... BTW: die PWR Buchse des Pi's hat keine Datenleitungen.
Alle verfügbaren Optionen lassen sich wie folgt abrufen:
Theoretisch müsste auch folgendes gehen:
sudo modprobe g_mass_storage file=/usbdisk.img stall=0 removable=1 idVendor=0x0781 idProduct=0x5572 bcdDevice=0x011a iManufacturer="SanDisk" iProduct="Cruzer Switch" iSerialNumber=1234567890
Zum überprüfen ob das fehlerfrei funktionierte:
Man kann auch so tun als würde man den "USB-Stick" wieder raus ziehen, indem man einfach das Kernel Module entfernt:
Wenn man nun unter Linux, also auf dem PiZeroW, auf die Datenträger-Datei zugreifen möchte, muss man diese besonders mounten. Wichtig hierbei ist aber auch das die Datei gerade nicht vom Gadget verwendet wird sonst riskiert ihr eine Beschädigung!
FILE=/usbdisk.img
mkdir -p ${FILE/img/d}
mount -o loop,offset=$((2048*512)) -t vfat $FILE ${FILE/img/d}
Wer sich wundert, gemounted wird nach: /usbdisk.d/
Aushängen:
Wichtig:
Ihr könnt den PiZero(W) problemlos über den USB-Port mit Strom versorgen. Falls ihr den Pi aber permanent laufen lassen wollt und eine separate Stromzufuhr über PWR-IN anschließen wollt, solltet ihr unbedingt das USB-Port Kabel modifizieren und die rote Ader durchtrennen - es ist riskant den Pi über 2 unterschiedliche Spannungsversorgungen zu betreiben!
Links:
https://github.com/raspberrypi/fi…overlays/README
http://www.linux-usb.org/gadget/file_storage.html
https://isojed.nl/blog/2017/03/13/raspberry-pi-zero-w/
https://www.raspberrypi.org/magpi-issues/MagPi60.pdf (ab Seite 54)
https://github.com/ckuethe/usbarmory/wiki/USB-Gadgets
https://www.kernel.org/doc/Documentat…et_configfs.txt
http://isticktoit.net/?p=1383