Migrating Pi 5 from microSD to USB3 Samsung 870 EVO SSD, and Pitfalls
Since I use Raspberry Pi 5 as a virtual machine (VM) host for Home Assistant OS (HAOS) in KVM, I want a system that is simple, stable, and reliable.
After repeated microSD drawbacks, I selected the Samsung 870 EVO SSD 500GB via USB3 over my previous Raspberry Pi 128GB microSD U2 for system storage.
Performance Comparison: microSD vs USB3 SSD
To quantify the improvement, I used:
curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash
Results
| Test | microSD Card | Samsung 870 EVO SSD | Improvement |
|---|---|---|---|
| HDParm Disk Read | 87.11 MB/sec | 362.74 MB/sec | 4.2x faster |
| HDParm Cached Disk Read | 83.74 MB/sec | 352.69 MB/sec | 4.2x faster |
| DD Disk Write | 71.0 MB/sec | 306 MB/sec | 4.3x faster |
| FIO 4k Random Read | 7,322 IOPS | 40,156 IOPS | 5.5x faster |
| FIO 4k Random Write | 4,070 IOPS | 35,679 IOPS | 8.8x faster |
| IOZone 4k Read | 22,064 KB/sec | 45,015 KB/sec | 2x faster |
| IOZone 4k Write | 10,453 KB/sec | 44,799 KB/sec | 4.3x faster |
| IOZone 4k Rand Read | 22,012 KB/sec | 23,832 KB/sec | 1.1x faster |
| IOZone 4k Rand Write | 14,664 KB/sec | 44,969 KB/sec | 3.1x faster |
| Overall PiBenchmarks Score | 4098 | 14655 | +3.6x higher |
Summary:
The USB3 SSD is consistently at least 4x faster for sequential reads/writes, and up to 9x faster for random IO operations. This means faster boot times, quicker VM performance, and far more reliability for Home Assistant and other hosted services.
Step-by-Step Migration Guide
Below are the essential steps I used to switch storage (with comments for each):
1. Update Your System (SSD NOT connected yet)
sudo apt update \&\& sudo apt full-upgrade
sudo rpi-eeprom-update -a
sudo reboot
2. Check Current Boot Order (SSD NOT connected yet)
sudo rpi-eeprom-config
Read hexadecimal right to left: SD card (1) → NVMe/PCIe (6) → USB (4) → repeat (f)
INSERT SSD HERE
Connect Samsung SSD to a blue USB3 port for optimal speed.
3. Verify SSD Detection
lsblk
You should see output like:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
loop0 7:0 0 2G 0 loop
sda 8:0 0 465.8G 0 disk
mmcblk0 179:0 0 117G 0 disk
└─mmcblk0p1 179:1 0 512M 0 part /boot/firmware
└─mmcblk0p2 179:2 0 116.5G 0 part /
zram0 254:0 0 2G 0 disk [SWAP]
4. Clone System to SSD
sudo rpi-clone sda \# Use your actual SSD device
sudo df -h
5. Set USB-first Boot Order
sudo rpi-eeprom-config --edit
Change BOOT_ORDER=0xf41 to BOOT_ORDER=0xf164
(this tells Pi to try USB first, then NVMe, then SD, then repeat)
6. Shutdown and Remove microSD
sudo shutdown -h now
Remove microSD card, leave only SSD on blue USB3 port.
Troubleshooting Note
Root Cause:
The Pi firmware successfully tries to boot from SSD, but if the OS configuration (cmdline.txt) still points to the missing SD card root partition, the system hangs at boot unable to find its root filesystem.
Fix:
Update the root= line in SSD’s /boot/firmware/cmdline.txt to your SSD’s actual PARTUUID (find with sudo blkid /dev/sda2).
Comment:
This is a common pitfall after disk cloning—boot files may still reference the old SD device instead of the new SSD.
Always check and update cmdline.txt (and sometimes /etc/fstab) to match your new SSD’s partition info.
You can use blkid to find the real UUID/PARTUUID values for your disk.
Final Takeaways
- Migrating to a USB3 SSD on Pi 5 yields huge performance and reliability gains—worth the time investment.
- Use PiBenchmarks before/after to see real hardware improvements.
- Always double-check boot config files after cloning!