Boot from 4TB NVMe #

The Raspberry PI Imager creates max 2TB partitions as MBR type. If you want to use a 4TB SSD as boot device you need this instructions.

Approach in short

  1. Install Raspberry PI OS on SD Card
  2. Use GPT table on NVMe and create same type of partitions on NVMe like on SD card
  3. copy over both partitions data
  4. switch boot order

1. Prepare SDF Card#

I will use terminal only, so I use lite version: Raspberry Pi Imager > Raspberry PI OS (Other) > Raspberry PI OS Lite (64-bit)

2. Prepare NVMe#

We create same partitions like in SD-Card, check out SD-Card first:
> sudo fdisk --list
	[...]
	Device           Start        End    Sectors  Size Type
	/dev/nvme0n1p1    8192    1056767    1048576  512M Microsoft LDM metadata
	/dev/nvme0n1p2 1056768 7814035455 7812978688  3.6T Linux filesystem

	Device         Boot   Start      End  Sectors  Size Id Type
	/dev/mmcblk0p1         8192  1056767  1048576  512M  c W95 FAT32 (LBA)
	/dev/mmcblk0p2      1056768 15597567 14540800  6.9G 83 Linux

Create

> sudo fdisk /dev/nvme0n1 
create GPT first, this enables us to use MORE than 2TB !
> g 
create first partition: 512MiB boot partition. 4MiB before partition. fat32. Label as ‘bootfs’
> n  (new partition)
Partition type
   p   primary (0 primary, 0 extended, 4 free)
   e   extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1):
USE exact size from former SD-card (see >sudo fdisk --list<), e.g. 8192 - 1056767

> t (change partition type)
> 11 = Microsoft basic data !!! - "efi system partition" should work too(?)

create second partition ext4 partition
> n
> primary
> (defaults)
note: partition type "Linux" = ext4

> w         # write/execute all settings, do not forget!
Validate again 3. check
> sudo fdisk /dev/nvme0n1
> p
Disk /dev/nvme0n1: 3.64 TiB, 4000787030016 bytes, 7814037168 sectors
Disk model: Samsung SSD 990 PRO 4TB
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 328DEADB-7020-B14F-BB7C-760218A70054

Device           Start        End    Sectors  Size Type
/dev/nvme0n1p1    8192    1056767    1048576  512M Microsoft LDM metadata
/dev/nvme0n1p2 1056768 7814035455 7812978688  3.6T Linux filesystem

3. create file systems#

> sudo mkfs -t vfat /dev/nvme0n1p1
> sudo mkfs -t ext4 /dev/nvme0n1p2

4. change label#

> sudo fatlabel /dev/nvme0n1p1 bootfs
> sudo e2label /dev/nvme0n1p2 rootfs

5. check#

> lsblk -f  # FINAL
NAME        FSTYPE FSVER LABEL  UUID                                 FSAVAIL FSUSE% MOUNTPOINTS
mmcblk0
├─mmcblk0p1 vfat   FAT32 bootfs 4C33-F302                             446.2M    13% /boot/firmware
└─mmcblk0p2 ext4   1.0   rootfs 3b445224-0aeb-4897-9108-009ed4211fb4    4.3G    31% /
nvme0n1
├─nvme0n1p1 vfat   FAT16 bootfs 7432-7D47
└─nvme0n1p2 ext4   1.0   rootfs 148a2332-36f1-40fa-9347-0ef42e25452d    3.4T     0% /media/markus/rootfs

6. Copy first partition#

> sudo dd if=/dev/mmcblk0p1 of=/dev/nvme0n1p1 bs=1M status=progress

Mount
> sudo mkdir /media/markus/rootfs
> sudo vi /etc/fstab 
	m2 part1 > /media/markus/bootfs
	m2 part2 > /media/markus/rootfs

> sudo rsync -avPAHXx --numeric-ids / /media/markus/rootfs
(> sudo umount /dev/nvme0n1p2)

7 Prepare m2 to boot#

Get UUIDs
> sudo blkid
/dev/nvme0n1p1: LABEL_FATBOOT="bootfs" LABEL="bootfs" UUID="4C33-F302" BLOCK_SIZE="512" TYPE="vfat" 
	PARTUUID="45e773bc-3db4-9f47-bf68-298a18c04083"
/dev/mmcblk0p1: LABEL_FATBOOT="bootfs" LABEL="bootfs" UUID="4C33-F302" BLOCK_SIZE="512" TYPE="vfat" 
	PARTUUID="890595ad-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="3b445224-0aeb-4897-9108-009ed4211fb4" BLOCK_SIZE="4096" TYPE="ext4" 
	PARTUUID="890595ad-02"
/dev/nvme0n1p2: LABEL="rootfs" UUID="7d8d2d84-14bc-497b-bb86-e86e02c3eb7a" BLOCK_SIZE="4096" TYPE="ext4" 
	PARTUUID="cce223b0-1be4-4f4e-9fe2-6449e5e4ec86"
Exchange mount point from SD card with SSD
> sudo vi /media/markus/rootfs/etc/fstab
change PARTUUID for SD partitions with m2 partitions

> sudo vi /media/markus/bootfs/cmdline.txt

Change boot order
> sudo raspi-config
check boot order
> sudo rpi-eeprom-config
order is from right to left
1 = Check SD card
6 = Check PCIe NVME
4 = Check USB drive
f = Start again
see https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#BOOT_ORDER

Issues#

If it is not booting from m2, check community.volumio.com
> sudo vcgencmd bootloader_version
> sudo vi /etc/default/rpi-eeprom-update

> dmesg

https://www.jeffgeerling.com/blog/2023/nvme-ssd-boot-raspberry-pi-5

sudo vi /boot/firmware/config.txt

# Add to bottom of /boot/firmware/config.txt
dtparam=pciex1

# Note: You could also just add the following (it is an alias to the above line)
# dtparam=nvme

# Optionally, you can control the PCIe lane speed using this parameter
# dtparam=pciex1_gen=3

Wipe disk#

wipe all disk partitions before cloning
> sudo umount /dev/nvme0n1p?
> sudo wipefs --all --force /dev/nvme0n1p?
> sudo wipefs --all --force /dev/nvme0n1
> sudo dd if=/dev/zero of=/dev/nvme0n1 bs=1024 count=1