Upgrading My Raspberry Pi Webserver: From Pi 3 B+ to Pi 5 with NVMe Storage

Running a home webserver on a Raspberry Pi has been one of my most rewarding tech projects. Recently, I decided it was time for a major upgrade, moving from my trusty Raspberry Pi 3 B+ to the new Raspberry Pi 5 with 16GB of RAM, and ditching the SD card for blazing-fast NVMe storage. Here’s how I made the transition and the incredible performance gains I experienced.


Why Upgrade?

My Pi 3 B+ had served me well for years, hosting my personal website, development projects, and various web applications. However, I was starting to hit some limitations:

  • Limited RAM causing occasional memory pressure
  • SD card I/O bottlenecks during heavy traffic
  • Slower ARM Cortex-A53 processor struggling with modern web frameworks
  • USB 2.0 limitations for external storage

The Pi 5 promised to solve all these issues and then some.


Raspberry Pi 3 B+ vs Raspberry Pi 5: Side-by-Side Comparison

FeatureRaspberry Pi 3 B+Raspberry Pi 5 (16GB)
CPUQuad-core ARM Cortex-A53 @ 1.4GHzQuad-core ARM Cortex-A76 @ 2.4GHz
RAM1GB LPDDR216GB LPDDR4X
GPUVideoCore IVVideoCore VII
StorageMicroSD onlyMicroSD + M.2 NVMe support
USB Ports4x USB 2.02x USB 2.0, 2x USB 3.0
Ethernet300Mbps (shared with USB)Gigabit Ethernet (dedicated)
WiFI802.11ac 2.4/5GHz802.11ac 2.4/5GHz (improved antenna)
GPIO40-pin header40-pin header
Power5V/2.5A via micro USB5V/5A via USB-C
Boot OptionsSD card onlySD card, USB, NVMe, Network

The performance difference is substantial, the Pi 5 offers roughly 3x the CPU performance and 16x the RAM capacity.


The Migration Process

Step 1: Initial Boot with Existing SD Card

A nice thing of the Raspberry Pi ecosystem is its backward compatibility. I took the SD card from my Pi 3 B+ and inserted it directly into the Pi 5. To my delight, it booted successfully on the first try!

However, I needed to ensure all drivers and firmware were optimized for the new hardware.

Step 2: System Update and Optimization

Once booted, I immediately updated the system to ensure compatibility with the Pi 5’s hardware:

sudo apt update
sudo apt upgrade -y
sudo rpi-update
sudo reboot

This process took about 10-15 minutes and installed all the necessary firmware updates and drivers specific to the Pi 5. The system felt noticeably snappier even running from the same SD card.

Step 3: Setting Up NVMe Storage

Next came the exciting part, setting up the NVMe SSD. I installed a 256GB NVMe 2230 SSD onto the NVMe PCIe Board, which connects directly to the Raspberry Pi 5’s PCIe slot. This provides much faster performance than USB-based solutions and gives you true PCIe speeds.

First, I verified the drive was detected:

lsblk

The NVMe drive appeared as /dev/nvme0n1.

Step 4: Cloning SD Card to NVMe

For the migration, I used rpi-clone, a fantastic utility designed specifically for Raspberry Pi storage cloning:

sudo apt install rpi-clone -y
sudo rpi-clone nvme0n1

The rpi-clone utility is brilliant because it:

  • Automatically resizes partitions to fit the target drive
  • Handles the boot partition correctly
  • Excludes unnecessary files and directories
  • Provides a bootable clone without manual partition editing

Alternatively, you can use the dd command to copy the SD content to the NVMe:

sudo dd if=/dev/mmcblk0 of=/dev/nvme0n1 bs=4M status=progress

However, this is much slower because it’s a raw copy that copies every bit including empty space, and you’ll need to manually resize partitions afterward.

Step 5: Switching Boot to NVMe

With the NVMe drive cloned and ready, I needed to switch the boot sequence. I shut down the Pi:

sudo poweroff

Then I removed the SD card and powered on the Pi 5. It should now boot directly from the NVMe drive via the PCIe connection.

Option 2: Change Boot Order via raspi-config. Alternatively, you can change the Pi 5’s boot sequence to prioritize NVMe over SD card using:

sudo raspi-config

Navigate to:

  • Advanced OptionsBoot OrderNVMe/USB Boot

This sets the boot order to try NVMe/USB storage first before falling back to SD card. The Pi 5’s improved bootloader makes this process much more reliable than previous models.

I chose the physical method for a clean transition, but the raspi-config option is useful if you want to keep the SD card as a backup boot option.

To verify the system was running from NVMe:

df -h /
lsblk

The root filesystem now showed as mounted from /dev/nvme0n1p2 instead of /dev/mmcblk0p2.

Step 6: Expanding the Filesystem

Once booted from NVMe, I expanded the filesystem to use the full capacity of the 256GB drive:

sudo raspi-config

I navigated to:

  • Advanced OptionsExpand Filesystem

After expanding, I rebooted to ensure all changes took effect.


Network Configuration Update

With the hardware migration complete, I needed to update my network configuration. The Pi 5 received a new IP address from DHCP, so I had to:

Update Router Port Forwarding: Changed the forwarded IP from the old Pi 3 B+ address to the new Pi 5 address

Pro tip: Consider setting up a static IP reservation in your router for your Pi to avoid this step in future migrations.


Performance Improvements

The difference in performance has been night and day:

Boot Time

  • Pi 3 B+ (SD): ~45 seconds
  • Pi 5 (NVMe): ~12 seconds

Web Server Response

  • Apache benchmark (1000 requests):
    • Pi 3 B+: Average 850ms response time
    • Pi 5: Average 180ms response time

File Operations

  • Large file transfers: 5x faster
  • Database queries: 3x faster
  • Docker container startup: 4x faster

Lessons Learned

  1. Always backup before migrating – While rpi-clone is reliable, having a backup of your 128GB SD card image saved me from potential headaches.
  2. NVMe makes a huge difference – The storage upgrade provided more noticeable improvements than even the CPU upgrade in many scenarios.
  3. Power supply matters – The Pi 5 needs significantly more power. Using the official 27W USB-C adapter prevented any stability issues.
  4. Check your cooling – The Pi 5 runs hotter than the 3 B+. I added a small heatsink and fan to maintain optimal temperatures under load.

Final Thoughts

Upgrading from the Raspberry Pi 3 B+ to the Pi 5 with NVMe storage has transformed my home webserver experience. Page loads are snappy, deployments are faster, and I have room to grow with additional services and applications.

The migration process was surprisingly straightforward thanks to excellent tools like rpi-clone and the Pi 5’s flexible boot options. If you’re running any kind of server workload on an older Pi, I highly recommend making the jump – the performance gains are absolutely worth it.


Have you upgraded your Raspberry Pi setup recently? What performance improvements did you notice? Share your experience in the comments below!


Comments

Leave a Reply