It just so happened that recently the USB booting feature for the RPi4 coming out of Beta and Amazon Prime day coincided around the same time. I took this as a sign to beef up my main RPi daily machine with some external storage which would be faster and also less prone to corruption as I experienced with an overworked SD card previously. While I could have gone with a normal Solid State Drive (SSD) inside a USB caddy, I wanted to geek-out, so went with a Non-Volatile Memory Express (NVMe) M.2 card and associated M.2 enclosure. My budget wasn’t great but found a good deal on a 250GB Kingston A2000 and also a highly rated M.2 enclosure.

I’m lucky in the fact that I power my RPi4’s with POE which leaves the USB-C port free, so could have attached there, but as the RPi4 USB-C port is only 3.1 Gen 1 there wouldn’t have been any benefit in doing this over one of the USB3.0 ports, there is also a bit of work to force the USB-C port to become a host port, discussion here
After doing a complete distribution update of the Raspberry Pi OS (64-bit) and updating the bootloader, I could then configure the Pi to boot from USB. Full Instructions here
After plugging in my new NVMe enclosure into a USB 3.0 port, and checking that it could be seen in the /dev directory, I then used the SD card copier tool that is pre-installed with the Raspberry Pi OS to copy the SD card I was currently booted from to the NVMe drive.

After this has completed successfully, I shut the Pi down and removed the MicroSD card, leaving the NVMe enclosure still connected. Powering back on, the Pi booted as if nothing had happened, as you would expect, but running from NVMe M.2 card.
While still running on the MicroSD card (a Sandisk Ultra 32GB A1 Class) I took some basic stats using the pre-installed SD Card checking tool. I ran the same tests after migrating to NVMe and the difference is quite amazing, even running over USB 3.0.
MicroSD Card | NVMe USB 3.0 | Increase | |
rand-4k-write | 3.23 MB/sec | 74.47 MB/sec | 23x |
rand-4k-read | 9.17 MB/sec | 91.4 MB/sec | 10x |
Sequential write | 17.28 MB/sec | 316.59 MB/sec | 18x |
Random write | 809 IOPS | 18618 IOPS | 23x |
Random read | 2293 IOPS | 22850 IOPS | 10x |
Definitely a worthwhile upgrade, probably overkill for the RPi as it cannot use the full bandwidth performance of NVMe, but it makes me happy, and that’s all that counts.