Booting Raspberry Pi 3 Model B from SSD
Source: Dev.to
Introduction
Hey everyone! In this post I’m going to share my experience USB‑booting the Raspberry Pi 3 Model B from an SSD. I did this almost a year ago, but finally decided to write it up (sorry for the delay — xD).
If you spot anything I missed, please let me know. Feedback is appreciated!
What I used
| Item | Quantity |
|---|---|
| Raspberry Pi 3 Model B | 4 |
| Raspberry Pi 3 Model B+ | 1 |
| Power supplies (proper voltage & amperage) | 5 |
| Solid‑State Drives (SSD) | 5 |
| USB‑to‑SATA adapters | 5 |
Booting from SSD
There are many blog posts, forum threads, and even LLM‑generated guides that explain how to USB‑boot a Pi 3 Model B. Below is a concise summary of the steps that worked for me.
1. Update the OS on an SD card
sudo apt update -y && sudo apt full-upgrade -y
2. Check whether USB boot is enabled
vcgencmd otp_dump | grep 17
Possible outputs
17:1020000a # USB boot disabled
17:3020000a # USB boot enabled
3. Enable USB boot (if needed)
Add the following lines to /boot/firmware/config.txt.
(Older tutorials refer to /boot/config.txt; that location is now outdated.)
program_usb_boot_mode=1
program_usb_boot_timeout=1
4. Clone the SD‑card image onto the SSD
# /dev/mmcblk0 → SD card (in my case)
# /dev/sdb → SSD connected via USB
sudo dd if=/dev/mmcblk0 of=/dev/sdb status=progress bs=4M conv=fsync
Note: Adjust the device names (
mmcblk0,sdb) to match your system.
5. Boot from the SSD
- Power off the Pi.
- Remove the SD card.
- Connect the SSD via the USB‑to‑SATA adapter.
- Power the Pi back on.
If everything went well, the Pi should boot from the SSD. You can now resize partitions, run benchmarks, etc.
Result: This worked on the Pi 3 Model B+ but failed on 4 of my 5 Raspberry Pi 3 Model B units. The next sections explain why.
The difference between Pi 3 Model B and Pi 3 Model B+
I performed the steps above on a Pi 3 Model B+ first, and it booted flawlessly. Repeating the same procedure on four Pi 3 Model B boards gave the same “no USB boot” result, even after adding program_usb_boot_timeout=1 to /boot/firmware/config.txt.
This led me to conclude that, despite being the same family, the Model B and Model B+ have subtle boot‑related differences.
My solution (a fluke)
After many failed attempts, one of the Model B boards finally booted from the SSD. I verified it in the terminal and ran I/O speed tests—everything confirmed that the OS was running off the SSD.
What changed?
I realized that I had left the SD card inserted while the SSD was also connected. The Pi still needed the SD card to start the boot process, even though the root filesystem lived on the USB SSD.
Verifying the hypothesis
- Format the SD card (any filesystem will do).
- Copy the contents of the SSD’s
/boot/directory onto the freshly formatted SD card.
The two/bootdirectories must be identical.
After doing this, the Pi booted again from the SSD, confirming that the Model B requires an SD card to initiate the boot, regardless of where the OS resides.
Important details
- Do not copy the
/boot/firmwaredirectory from one SSD to all SD cards. - Each SSD has a unique UUID referenced in
/boot/firmware/cmdline.txt. - Either copy the matching
/boot/firmwarefrom each SSD to its corresponding SD card, or editcmdline.txtso thePARTUUID=points to the correct disk.
Example cmdline.txt (single line, no line breaks):
console=serial0,115200 console=tty1 root=PARTUUID=e000a75d-02 rootfstype=ext4 fsck.repair=yes rootwait cfg80211.ieee80211_regdom=US cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory
Upgrading the operating system
All the steps above were performed when the latest Raspberry Pi OS was based on Debian 12 (bookworm). The current Raspberry Pi OS now ships with Debian 13 (trixie). Rather than re‑formatting and starting from scratch, I performed an in‑place major upgrade.
Upgrade steps
-
Edit the APT source lists
sudo nano /etc/apt/sources.list sudo nano /etc/apt/sources.list.d/raspi.listReplace every occurrence of
bookwormwithtrixie. -
Update package information and perform the upgrade
sudo apt update sudo apt full-upgrade -y -
Reboot
sudo reboot
After the reboot the system runs the newer Debian 13‑based Raspberry Pi OS while still booting from the SSD (with the SD card present as described above).
Update the System
-
Refresh the package indexes
sudo apt update -
Install the latest version of the package manager
sudo apt install -y apt dpkg -
Upgrade without pulling in new dependencies
sudo apt upgrade --without-new-pkgsMake sure everything looks fine.
-
Perform a full upgrade
sudo apt full-upgrade -
Reboot
sudo reboot
These steps are sufficient on any setup (they work on the Raspberry Pi 3 Model B+). However, because we boot from the SD card first and not the SSD, a few extra steps are required.
Adjust the Boot Partition After an Upgrade
The Linux kernel image resides in the /boot directory. Since the Pi boots from the SD card, the boot files from the previous installation are still present. After the upgrade, the kernel remained at version 6.1 instead of the expected 6.12 (the version shipped with Debian 13).
To make the upgrade 100 % ready, repeat the steps you used to make the Pi boot from the SSD:
-
Mount the SD‑card boot partition
sudo mount /dev/mmcblk0p1 /mnt/sdboot/ -
Copy the firmware from the SSD to the SD card
sudo cp -r /boot/firmware/* /mnt/sdboot/ -
Reboot
sudo reboot
After completing these steps, the system boots with the new kernel and the upgrade is fully functional.
Using Containers
If you plan to run containers (e.g., Docker) or a container orchestrator such as K3s, ensure the following kernel parameters are present in /boot/firmware/cmdline.txt:
cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory
These options enable the required cgroup features for container runtimes.
References
- Official Raspberry Pi documentation – USB boot on Pi 3
- Various community blog posts and forum threads (links omitted for brevity)