Turn a Raspberry Pi into a USB stick
In this guide I turn a Raspberry Pi Zero W into a USB mass storage device, or a "smart USB-memory stick" in other words.
That means you'll be able to plug a USB cable from one of the USB ports on the Raspberry Pi to any other device that can use USB storage like a PC for example, and use it like a USB-storage device to transfer files.
As far as I've read online only the Raspberry Pi Zero W can be used like this, the regular Raspberry Pi devices do not have the hardware capable to act as a USB mass storage device.
Why would you want to do this? There are some proprietary devices out there that share data by writing them to USB storage devices and having a Linux OS there to receive the data live can help with exporting that data to a more modern system like Prometheus and Grafana.
Install Raspberry Pi OS Lite
Download it here and use the Raspberry Pi Imager or follow their other instructions.
The rest are just basic steps for anyone who has setup a raspberry pi before, skip to Create a USB mass storage device if you're already familiar.
Pre-boot OS config
Before booting you should enable ssh. This and WiFi setup is done with the Raspberry Pi Imager, or you can mount the first volume of the SD card and do the following;
- Create an empty file called
ssh
in the root (/boot volume of the SD card) to enable SSH. - Create a file called
wpa_supplicant.conf
in the root, this will be copied into /etc at boot.
Example of wpa_supplicant.conf
This is an example for Sweden, you should use a different ISO3166 country code.
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=SE
network={
ssid="<your ssid here>"
psk="<your psk here>"
key_mgmt=WPA-PSK
}
Post-boot OS config
You can login to Raspberry Pi OS with the username pi
and the password raspberry
over SSH by default.
First run sudo raspi-config
and select Advanced to expand your storage so it fills the entire SD card.
Reboot for changes to take effect.
Then you should make sure you're fully upgraded by running sudo apt update && sudo apt upgrade
and reboot again.
Create a USB mass storage device
Edit the file /boot/config.txt and add the following line to the end of the file;
dtoverlay=dwc2
Edit the file /etc/modules
and add the following line to the end;
dwc2
Reboot for changes to take effect. This will enable the kernel module USB driver which provides "gadget mode".
Create and format a container file
This file will be the filesystem of your USB storage device. Change 1024 for a larger USB storage device.
sudo dd if=/dev/zero of=/piusb.bin bs=1M count=1024 status=progress conv=fsync
sudo mkdosfs /piusb.bin -F 32 -I
Enable the USB storage device
Every time you want to enable the USB storage device from inside the Raspberry Pi OS you run this command;
sudo modprobe g_mass_storage file=/piusb.bin stall=0 removable=1
And to disable it;
sudo modprobe -r g_mass_storage
Now you can plug it into a PC or any other device like a dehumidifier for example and it should act just like a normal USB storage device, all data will be written to the /piusb.bin
file we created earlier.
Mount the USB storage from inside Raspberry Pi OS
To see the data written to the USB storage we must mount it inside the Raspberry Pi OS, while it is mounted we cannot see any changes written to the data from the device where it is plugged in. So if you want to script this you should mount it, read the data, and unmount it immediately.
sudo mount -t vfat -o users,umask=000 /piusb.bin /mnt
Now you can read and write data, but you must unmount it for it to be visible to any other devices where you might plug the USB device in. So be careful about trying to write the same data from two devices.
sudo umount /mnt
Enable USB storage device on boot
To make it a USB storage device every time it boots you must create /etc/modprobe.d/g_mass_storage.conf
with the following content;
options g_mass_storage file=/piusb.bin stall=0 removable=1
And add the line g_mass_storage
to the file /etc/modules
.
g_mass_storage is deprecated
According to some sources the kernel module used here (g_mass_storage
) is actually deprecated and replaced by rpi-tools.