Selecting a microSD card, and to a lesser extent an SSD, for your Raspberry Pi may feel like walking through a landmine field with fake microSD cards that may perform poorly and severely impact the performance and/or reliability of your Raspberry Pi, and you’ll find plenty of articles helping you select a good microSD card for your Raspberry Pi.
That’s probably why Raspberry Pi Holdings decided to launch its own Raspberry Pi-branded class A2 microSD cards and NVMe SSDs, so users can be sure they got a certified storage device that should perform as advertised as long as they purchase those from some authorized resellers. The company sent me 32GB and 64GB Raspberry Pi microSD cards and a 256GB Raspberry Pi SSD kit for testing, so I’ll test those in this review and compare them against other SSDs and microSD cards I’m currently using.
Since we’ve not covered the new Raspberry Pi storage yet, let’s start with the specifications:
Raspberry Pi SSD specifications
Two models are available with different capacities and performance metrics:
- 256GB NVMe
- 40k IOPS (4kB random reads)
- 70k IOPS (4kB random writes)
- 512GB NVMe
- 50k IOPS (4kB random reads)
- 90k IOPS (4kB random writes)
- Standards
- PCIe Gen 3 interfaces
- NVMe 1.4 register interface and command set
- Dimensions – M.2 2230 form factor
Since none of the Raspberry Pi SBCs comes with an M.2 socket so far, you’d need a Raspberry Pi 5-compatible M.2 adapter, such as the Raspberry Pi M.2 HAT+, or third-party M.2 HAT+ boards from Waveshare, Geekworm, Pineboards, etc… For this review, I received a Raspberry Pi SSD Kit that combines the official M.2 HAT+ with a 256GB Raspberry Pi SSD.
Raspberry Pi likely did not disclose sequential write/read speeds for the SSDs because the PCIe Gen3 x1 interface limits that to around 800MB/s, but the SSD modules themselves can achieve several thousand MB/s with the right host computer. A few more details may be found on the product page.
Raspberry Pi SD card specifications
Three models are available with the following specifications:
- Capacity – 32GB, 64GB, or 128GB
- A2 microSD cards with support for DDR50 and SDR104 bus speeds and command queueing (CQ) extension
- Speed Class: C10, U3, V30, A2
- Random 4KB read performance: 3,200 IOPS (Raspberry Pi 4, DDR50) 5,000 IOPS (Raspberry Pi 5, SDR104)
- Random 4K write performance: 1,200 IOPS (Raspberry Pi 4, DDR50) 2,000 IOPS (Raspberry Pi 5, SDR104)
- Shock-proof, X-ray–proof, and magnet-proof
- Compatible with microSDHC- and microSDXC-supporting host devices
The microSD cards are available unprogrammed or pre-programmed with Raspberry Pi OS. I received 32GB and 64GB microSD cards for review each with an SD adapter for compatibility with a wider range of hosts. Additional information may be found on the product page.
Raspberry Pi has been busy in the last few months, and November will also be busy with even more announcements on the way. So I received a package with the Touch Display 2, some AI devices, and more, but here, I’ll focus on the storage device with one 256GB Raspberry Pi SSD Kit, and two Raspberry Pi SD cards.
The SSD kit ships with the Raspberry Pi M.2 HAT+ M-Key with a 256GB Raspberry Pi SSD inserted into the M.2 socket, a 40-pin header, and plastic standoffs and screws for assembly. I personally prefer copper standoffs and metal screws offered with some third-party kits, but I suppose plastic part are cheaper.
Another small issue was the way the SSD card was installed on the M.2 HAT+ board. I don’t think it’s supposed to be that way with the SSD awkwardly bending…
So I remove the screws and put it back into place as it should be. The SSD still works as expected so no harm done.
The bottom side of the M.2 HAT+ expansion board has nothing much which makes it suitable for mounting on top of the active cooler.
There’s no indication of the microSD cards’ capacity on the packages, but I opened both and it’s clearly marked on the microSD cards themselves, and I got one 32GB Class A2 card, and one 64GB Class A2 card. All good.
Getting started with the Raspberry Pi SSD kit
We first need to assemble the Raspberry Pi SSD kit on the Raspberry Pi 5. We’ll start with the four standoffs and the 40-pin expansion header.
I then placed the M.2 HAT+ on top are secured it with four screws, before finally inserting the FFC cable into the PCIe connector on the Pi 5. I struggled a bit for the last part, and it’s probably easier to instead the FFC cable to the Pi 5 before mounting the M.2 HAT+ on the standoffs.
When I first tried to boot the Raspberry Pi 5 with the SSD kit, I just added an Ethernet cable and the power supply, but I got no link, so I ended up connecting a display, and it was stuck in a boot loop…
A Samsung MZ9LQ256HBJD-00BVL drive (the actual part name of the 256GB Raspberry Pi SSD) also known as one of the “Samsung PM991a” SSDs, was indeed detected, but it looks like Raspberry Pi OS was not pre-installed. I must have been spoiled by the Cytron MAKERDISK SSDs which work out of the box with Raspberry Pi OS pre-installed (provided the bootloader is up to date), and I was expecting the official Raspberry Pi SSD to be the same but apparently not.
So now I had to think of a method to install Raspberry Pi OS on the SSD, but sadly the official SSD documentation has nothing about that. I kind of remembered Raspberry Pi announced network install supports a few years ago, so somehow there was no such option… It’s only after I inserted RF dongles for a wireless keyboard and mouse combo that the “net install” option magically showed up on the display…
So I pressed the SHIFT key to download the net install utility from the Internet.
After a few minutes, I was presented with an RPI-imager-like interface, where I could select the Raspberry Pi 5 board, Raspberry Pi OS 64-bit (Desktop), and the Samsung MZ9LQ256HBJD-00BVL storage for installation.
Everything went smoothly and after several minutes, I reached the Raspberry Pi OS desktop.
Benchmarking storage on Raspberry Pi 5
Now that we have the system up and running, I’ll benchmark the three Raspberry Pi-branded storage devices using iozone3 and compare the results to others including Cytron MAKERDISK SSDs and a Samsung Class A1 microSD card. I’ll have a comparison at the end of this section.
Let’s start with the default configuration (PCIe Gen2 x1):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
pi@raspberrypi:~ $ iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 Iozone: Performance Test of File I/O Version $Revision: 3.489 $ Compiled for 64 bit mode. Build: linux random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 142053 164504 181635 182273 58477 165305 102400 16 258189 277494 306902 307433 159040 273310 102400 512 384669 385453 424690 424790 397219 384641 102400 1024 387709 391367 427739 427805 413931 388071 102400 16384 390976 391853 440835 440851 439929 397684 iozone test complete. |
Note that I ran iozone3 twice for all tests to make sure the results were similar. Let’s switch to the unofficial PCIe Gen3 mode by adding the following line to /boot/firmware/config.txt before the [cm4] section:
1 |
dtparam=pciex1_gen=3 |
and reboot the system. Let’s check the link is set to 8GT/s (PCIe Gen3 x1):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
pi@raspberrypi:~ $ sudo lspci -vv -s 01:00.0 0000:01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980 (prog-if 02 [NVM Express]) Subsystem: Samsung Electronics Co Ltd NVMe SSD Controller 980 (DRAM-less) Control: I/O- Mem+ BusMaster+ SpecCycle- MemWINV- VGASnoop- ParErr- Stepping- SERR- FastB2B- DisINTx+ Status: Cap+ 66MHz- UDF- FastB2B- ParErr- DEVSEL=fast >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx- Latency: 0 Interrupt: pin A routed to IRQ 38 Region 0: Memory at 1b80000000 (64-bit, non-prefetchable) [size=16K] Capabilities: [40] Power Management version 3 Flags: PMEClk- DSI- D1- D2- AuxCurrent=0mA PME(D0-,D1-,D2-,D3hot-,D3cold-) Status: D0 NoSoftRst+ PME-Enable- DSel=0 DScale=0 PME- Capabilities: [50] MSI: Enable- Count=1/32 Maskable- 64bit+ Address: 0000000000000000 Data: 0000 Capabilities: [70] Express (v2) Endpoint, MSI 00 DevCap: MaxPayload 256 bytes, PhantFunc 0, Latency L0s unlimited, L1 unlimited ExtTag- AttnBtn- AttnInd- PwrInd- RBE+ FLReset+ SlotPowerLimit 0W DevCtl: CorrErr+ NonFatalErr+ FatalErr+ UnsupReq+ RlxdOrd+ ExtTag- PhantFunc- AuxPwr- NoSnoop+ FLReset- MaxPayload 256 bytes, MaxReadReq 512 bytes DevSta: CorrErr- NonFatalErr- FatalErr- UnsupReq- AuxPwr- TransPend- LnkCap: Port #0, Speed 8GT/s, Width x4, ASPM L1, Exit Latency L1 <64us ClockPM+ Surprise- LLActRep- BwNot- ASPMOptComp+ LnkCtl: ASPM L1 Enabled; RCB 64 bytes, Disabled- CommClk+ ExtSynch- ClockPM+ AutWidDis- BWInt- AutBWInt- LnkSta: Speed 8GT/s, Width x1 (downgraded) TrErr- Train- SlotClk+ DLActive- BWMgmt- ABWMgmt- |
All good, we can run the benchmark again:
1 2 3 4 5 6 7 8 9 10 |
pi@raspberrypi:~ $ iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 169424 207900 223355 223317 62231 209284 102400 16 400883 446525 484396 474782 192879 415318 102400 512 730661 706703 785148 788511 710277 704118 102400 1024 717936 743467 802758 802734 765441 710455 102400 16384 739594 741637 861605 861258 859669 754755 iozone test complete. |
Both write and read results are as expected for the PCIe Gen2 and Gen3 interfaces used.
I also measured boot time from power off three times: 24.08 seconds, 23.47 seconds, and 24.20 seconds for an average of 23.92 seconds from pressing the power button until the top bar shows up.
Now the plan is to turn off the Raspberry Pi 5, and install Raspberry Pi OS on the two Raspberry Pi Class A2 microSD cards before disconnecting the PCIe FFC cable, and inserting the SD card for testing. So I installed the RPI-imager utility on my Ubuntu laptop only to see boot and rootfs partitions pop up when I inserted the microSD card into my laptop… That means that contrary to the SSD which comes blank, Raspberry Pi OS is already installed on the microSD cards. Awesome!
So I just inserted the 64GB Raspberry Pi microSD into my Raspberry Pi 5 and went through the setup and OS update wizard which took a few minutes. I could then run iozone3 again:
1 2 3 4 5 6 7 8 |
pi@raspberrypi:~ $ iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 11110 11181 26694 26663 26655 15862 102400 16 19897 20268 48230 49161 49074 41893 102400 512 58357 59906 87240 87158 86930 73375 102400 1024 69445 72518 90424 90334 90458 79276 102400 16384 72909 74490 91769 91510 91656 74538 |
I powered cycle the Raspberry Pi 5 three times to check the boot time: 21.8s, 21.58s, and 21.85s, or 21.74s on average. That’s very odd as the boot time is faster than with the SSD…
Let’s investigate… I was asked to switch to LabWC completing the setup wizard. Let’s check some system information:
1 2 3 4 5 6 7 8 9 10 11 12 |
pi@raspberrypi:~ $ sudo inxi -GS System: Host: raspberrypi Kernel: 6.6.51+rpt-rpi-2712 arch: aarch64 bits: 64 Console: pty pts/1 Distro: Debian GNU/Linux 12 (bookworm) Graphics: Device-1: bcm2712-hdmi0 driver: vc4_hdmi v: N/A Device-2: bcm2712-hdmi1 driver: vc4_hdmi v: N/A Display: wayland server: X.org v: 1.21.1.7 with: Xwayland v: 22.1.9 compositor: LabWC driver: gpu: vc4-drm,vc4_crtc,vc4_dpi,vc4_dsi,vc4_firmware_kms,vc4_hdmi,vc4_hvs,vc4_txp,vc4_v3d,vc4_vec tty: 80x42 resolution: 1920x1080 API: EGL/GBM Message: No known Wayland EGL/GBM data sources. |
But I was never asked after installing Raspberry Pi OS on the SSD. Here’s the output of the same command after I switched back to the Raspberry Pi SSD:
1 2 3 4 5 6 7 8 9 10 11 12 |
pi@raspberrypi:~ $ sudo inxi -GS System: Host: raspberrypi Kernel: 6.6.51+rpt-rpi-2712 arch: aarch64 bits: 64 Console: pty pts/1 Distro: Debian GNU/Linux 12 (bookworm) Graphics: Device-1: bcm2712-hdmi0 driver: vc4_hdmi v: N/A Device-2: bcm2712-hdmi1 driver: vc4_hdmi v: N/A Display: wayland server: X.org v: 1.21.1.7 with: Xwayland v: 22.1.9 compositor: LabWC driver: gpu: vc4-drm,vc4_crtc,vc4_dpi,vc4_dsi,vc4_firmware_kms,vc4_hdmi,vc4_hvs,vc4_txp,vc4_v3d,vc4_vec tty: 80x42 resolution: 1920x1080 API: EGL/GBM Message: No known Wayland EGL/GBM data sources. |
It’s exactly the same… So despite having lower benchmark performance, the microSD card can boot faster. Maybe it’s because the bootloader searches for the microSD card first, before switching to the NVMe SSD if it can not find it.
Let’s try to change that. Here’s the bootloader configuration on the Raspberry Pi 5:
1 2 3 4 5 6 |
pi@raspberrypi:~ $ rpi-eeprom-config [all] BOOT_UART=1 POWER_OFF_ON_HALT=1 BOOT_ORDER=0xf461 WAKE_ON_GPIO=0 |
The important part is BOOT_ORDER:
- 1 is to try the microSD card first
- 6 is to try the NVMe second
- 4 is to try USB-MD if neither microSD or NVMe cards are detected.
- f is to continuously loop to try to boot from any of the storage devices above in the defined order.
Let’s change that to try to boot from the NVMe SSD first by setting BOOT_ORDER to 0xf416 using the command:
1 |
sudo -E rpi-eeprom-config --edit |
Let’s shut down the machine and try to boot three times: 22.86s, 22.85s, 22.85s. That’s about 22.85s on average and a small improvement of about one second, but still slower than the 64GB microSD card.
If I change the boot time measurement method and stop the watch when the wallpaper appears (as opposed to the top bar when the user can actually interact with the system), the boot time is about 21.4s with the 64GB microSD card and 18.24s with the SSD. So something slows down boot time with the SSD during that time. It’s out of the scope of this review, but it could be looked into in more detail with systemd-analyzer. But at least, that’s an easy method to switch between SSD and microSD boot without having to touch the hardware.
Let’s revert to the previous boot sequence and switch to the 32GB microSD card to see how it performs.
1 2 3 4 5 6 7 8 |
pi@raspberrypi:~ $ iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 3308 3339 24732 24428 16133 6104 102400 16 10830 10769 57805 58365 45166 25064 102400 512 31634 31695 89397 91265 89607 57454 102400 1024 39901 42139 91977 91782 91335 54798 102400 16384 40226 64717 93180 91987 92569 43402 |
It’s almost the same, so the boot time should also be similar. Let’s go through three boots: 22.67s, 22.77s, and 22.70s for an average of about 22.71s. Still in the same range as the 64GB microSD and 256GB SSD.
I also used systemd-analyze to have another take on boot time:
- 32GB microSD card:
1 2 3 |
pi@raspberrypi:~ $ systemd-analyze Startup finished in 3.526s (kernel) + 8.968s (userspace) = 12.495s graphical.target reached after 8.954s in userspace. |
- 64GB microSD card:
1 2 3 |
pi@raspberrypi:~ $ systemd-analyze Startup finished in 3.555s (kernel) + 8.860s (userspace) = 12.416s graphical.target reached after 8.850s in userspace. |
- 256GB SSD:
1 2 3 |
pi@raspberrypi:~ $ systemd-analyze Startup finished in 3.413s (kernel) + 8.709s (userspace) = 12.123s graphical.target reached after 8.692s in userspace. |
It’s more in line with expectations, although I was expecting a bigger delta between the microSD cards and the NVMe SSD for boot times. There’s even no point in making a chart here…
It did a final iozone3 test with a 32GB Sandisk Edge Class A1 microSD card:
1 2 3 4 5 6 7 8 9 |
pi@raspberrypi:~ $ iozone -e -I -a -s 100M -r 4k -r 16k -r 512k -r 1024k -r 16384k -i 0 -i 1 -i 2 random random bkwd record stride kB reclen write rewrite read reread read write read rewrite read fwrite frewrite fread freread 102400 4 4510 4520 14371 14358 12051 2439 102400 16 5993 9235 37024 37011 29817 5922 102400 512 16666 18933 89656 89614 88775 18858 102400 1024 21353 19886 79933 89390 88472 18404 102400 16384 20146 19250 89501 89517 86241 18942 |
Here’s a summary of iozone results for Raspberry Pi SSD, microSD cards, and Cytron MAKERDISK SSD. I also added a line using the Rock5 SBC with an M.2 Gen3 x4 socket using the 512GB MAKERDISK SSD for reference.
Storage device | SBC - Interface | Read | Write | Random Read (4K) | Random Write (4K) |
---|---|---|---|---|---|
128GB MAKERDISK SSD | Pi 5 - PCIe Gen2 x1 | 434,707 KB/s | 395,667 KB/s | 53,712 KB/s | 194,819 KB/s |
128GB MAKERDISK SSD | Pi 5 - PCIe Gen3 x1 | 855,845 KB/s | 761,527 KB/s | 58,080 KB/s | 290,993 KB/s |
256GB MAKERDISK SSD | Pi 5 - PCIe Gen2 x1 | 433,655 KB/s | 399,095 KB/s | 54,679 KB/s | 191,177 KB/s |
256GB MAKERDISK SSD | Pi 5 - PCIe Gen3 x1 | 846,389 KB/s | 759,437 KB/s | 58,135 KB/s | 276,242 KB/s |
512GB MAKERDISK SSD | Pi 5 - PCIe Gen2 x1 | 436,125 KB/s | 400,709 KB/s | 55,116 KB/s | 196,694 KB/s |
512GB MAKERDISK SSD | Pi 5 - PCIe Gen3 x1 | 843,413 KB/s | 771,841 KB/s | 58,657 KB/s | 291,082 KB/s |
512GB MAKERDISK SSD | Rock 5 - PCIe Gen3 x4 | 1,747,128 KB/s | 213,432 KB/s | 36,004 KB/s | 87,266 KB/s |
256GB Raspberry Pi SSD | Pi 5 - PCIe Gen2 x1 | 440,835 KB/s | 390,976 KB/s | 58,477 KB/s | 165,305 KB/s |
256GB Raspberry Pi SSD | Pi 5 - PCIe Gen3 x1 | 861,605 KB/s | 739,594 KB/s | 62,231 KB/s | 209,284 KB/s |
32GB Raspberry Pi microSD | Pi 5 - microSD slot | 93,180 KB/s | 40,226 KB/s | 16,133 KB/s | 6,104 KB/s |
32GB Raspberry Pi microSD | Pi 5 - microSD slot | 91,769 KB/s | 72,909 KB/s | 26,655 KB/s | 15,862 KB/s |
32GB Sandisk Class A1 microSD | Pi 5 - microSD slot | 89,501 KB/s | 20,146 KB/s | 12,051 KB/s | 2,439 KB/s |
We can clearly see the read and write speeds are limited by the PCIe Gen2 x1 to about 440MBs and the PCIe Gen3 x1 to around 860MB/s for both the Raspberry Pi and MAKERDISK SSDs, as the ROCK 5B SBC delivers a much higher read speed. The same can not be said of write speed, and random I/O on the Rockchip board, but it may be due to software configuration/optimization issues. The most important for the user experience are random I/Os and they are quite similar on the MAKERDISK and Raspberry Pi SSD.
The Raspberry Pi SD cards are high-performance Class A2 microSD cards, but as expected, they can’t quite keep up with NVMe SSDs in all metrics, although as we’ve seen with boot time, it may not always matter. The biggest impact will be on workloads with plenty of small writes, where the SSDs will be levels of magnitude faster than microSD cards. Reliability may be better with SSDs since I’ve seen many microSD card fails over the years.
Price-wise, the 256GB and 512GB Raspberry Pi SSD are sold for respectively $30 and $45. For reference, you can find 256GB NVMe SSDs on Amazon for about $20, so I’m not sure the value proposition is there especially since Raspberry Pi OS is not preinstalled. I think the Raspberry Pi microSD cards are more interesting since they come preinstalled with Raspberry Pi OS saving some time, and you greatly lower the risk of purchasing a slow microSD card that will likely die within a few months… The 32GB and 64GB microSD cards are sold for about $10 and $12 respectively. The 128GB model is harder to find and I could only locate it on Pimoroni at this time.
Jean-Luc started CNX Software in 2010 as a part-time endeavor, before quitting his job as a software engineering manager, and starting to write daily news, and reviews full time later in 2011.
Support CNX Software! Donate via cryptocurrencies, become a Patron on Patreon, or purchase goods on Amazon or Aliexpress