usb
FSCK für Loop Device
root@ofen:/# fsck /dev/loop0 fsck from util-linux 2.36.1 fsck.fat 4.2 (2021-01-31) FATs differ but appear to be intact. 1) Use first FAT 2) Use second FAT [12?q]? 1 Free cluster summary wrong (521468 vs. really 517407) 1) Correct 2) Don't correct [12?q]? 1 *** Filesystem was changed *** The changes have not yet been written, you can still choose to leave the filesystem unmodified: 1) Write changes 2) Leave filesystem unchanged [12?q]? 1 /dev/loop0: 31 files, 4065/521472 clusters
Raspberry Pi 4 als USB Stick
Ich suche mindestens seit 2016, Solarfocus Bedienteil, nach einem Gerät, dass sich auf der einen Seite wie ein USB Stick verhält und auf der anderen Seite Daten ins Netzwerk schicken kann. Idealerweise über WLAN.
c’t 2020, Heft 10, S.136ff, Voll aufgebohrt, USB-C-Anschluss des Raspberry Pi 4 ausnutzen, präsentiert die Lösung für das Problem.
Man braucht zuerst einen Raspberry Pi 4 mit Raspbian buster.
# /boot/config.txt # Device Tree Overlay laden # im Abschnitt [pi4] dtoverlay=dwc2
# /etc/modules # Eröffnet die Konfiguration via SysFS # Am Ende anhängen libcomposite
Pi neu starten.
Es wird ein Image von einem USB Stick mit vFAT Dateisystem benötigt. Am einfachsten in Windows formatieren und ein Image mit Win32DiskImager erstellen. 2 GB sollten reichen. Ablegen am Pi unter /media/usbdisk.img.
Die Details kommen aus dem Script initgadget der c’t (Download Link oben!).
Ich habe es soweit gekürzt, dass nur der USB Stick emuliert wird. Zu Beginn wird noch das Image vom USB Stick zum Mounten auf der Pi-Seite vorbereitet. Der Teil muss passieren, bevor ein Lock durch die Gegenstelle passiert.
# /usr/local/sbin/initgadget losetup -o 32256 /dev/loop0 /media/usbdisk.img cd /sys/kernel/config/usb_gadget/ mkdir -p pi4 cd pi4 echo 0x1d6b > idVendor echo 0x0104 > idProduct echo 0x0100 > bcdDevice echo 0x0200 > bcdUSB echo 0xEF > bDeviceClass echo 0x02 > bDeviceSubClass echo 0x01 > bDeviceProtocol mkdir -p strings/0x409 cat /sys/firmware/devicetree/base/serial-number > strings/0x409/serialnumber echo "Raspberry Pi Foundation" > strings/0x409/manufacturer echo "Raspberry Pi 4" > strings/0x409/product mkdir -p configs/c.1/strings/0x409 echo 250 > configs/c.1/MaxPower echo "Config 1: USB Gadget" > configs/c.1/strings/0x409/configuration mkdir -p functions/mass_storage.usb0 echo 1 > functions/mass_storage.usb0/stall echo 0 > functions/mass_storage.usb0/lun.0/removable echo 0 > functions/mass_storage.usb0/lun.0/cdrom echo 0 > functions/mass_storage.usb0/lun.0/ro echo 0 > functions/mass_storage.usb0/lun.0/nofua echo /media/usbdisk.img > functions/mass_storage.usb0/lun.0/file ln -s functions/mass_storage.usb0 configs/c.1/ udevadm settle -t 5 || : ls /sys/class/udc > UDC
# Die Initialisierung als Service aktivieren /etc/systemd/system/initgadget.service [Unit] Description=Raspi 4 USB Gadget DefaultDependencies=yes [Service] Type=simple ExecStart=/usr/local/sbin/initgadget [Install] WantedBy=local-fs.target #---- cp initgadget.service /etc/systemd/system/ systemctl enable initgadget.service systemctl start initgadget.service
Jetzt kann man das ausprobieren, indem man den Pi an einen Windows Rechner hängt.
Der „USB Stick“ taucht im Device Manager auf. Man kann ein Test File anlegen.
Dann am Pi mounten
/bin/mount -o ro /dev/loop0 /mnt
Und die Daten auslesen
Es sei darauf hingewiesen, dass man am Pi jetzt besser nichts zurückschreibt ins Image. FAT ist kein Dateisystem dass für gleichzeitige Zugriffe von verschiedenen Rechnern ausgelegt ist. Daher würde ich am Pi nur Read-only mounten. Und immer wenn man die aktuellen Daten verwenden will, neu mounten.