Wichtig
Die folgende Anleitung bezieht sich nur auf den Raspberry Pi 5!
PCI Express (PCIe) ist ein serielles Hochgeschwindigkeitsübertragungsprotokoll für die Datenübertragung zwischen Hauptplatinen und Peripheriegeräten. Es verwendet differenzielle Signalpaare und Punkt-zu-Punkt-Verbindungen, wodurch höhere Datenraten im Vergleich zu älteren parallelen Busstandards wie PCI ermöglicht werden. PCIe bietet mehrere Lanes (Datenspurgruppen), wodurch die Bandbreite je nach Anforderungen skaliert werden kann. Diese Lanes können in verschiedenen Konfigurationen wie x1, x4, x8 und x16 vorliegen. Durch seine Flexibilität und hohe Leistungsfähigkeit wird PCIe weitläufig für Grafikkarten, SSDs, Netzwerkkarten und andere Hochleistungsperipheriegeräte eingesetzt.
Hinweis
NVMe ist nicht SSD mSATA !
NVMe (Non-Volatile Memory Express) ist ein Protokoll, das speziell für den Zugriff auf NAND-basierten Flash-Speicher optimiert ist, wie er in modernen Solid-State-Drives (SSDs) verwendet wird. NVMe ermöglicht eine effiziente und parallele Datenübertragung zwischen dem Host (CPU) und der SSD über den PCIe-Bus. Im Gegensatz zu älteren Protokollen wie AHCI reduziert NVMe Latenzen und maximiert die Bandbreite, was zu deutlich schnelleren Lese- und Schreibgeschwindigkeiten führt. NVMe-SSDs werden zunehmend in Hochleistungsrechnern und Datenspeicherlösungen eingesetzt, um die Leistungsfähigkeit von Flash-Speicher optimal zu nutzen.
M.2 (= NGFF = Next Generation Form Factor) ist ein Formfaktor und Schnittstellenstandard für kompakte, kleine Erweiterungskarten, die in M.2-Steckplätzen auf Hauptplatinen eingesteckt werden. M.2-Steckplätze unterstützen verschiedene Schnittstellen, darunter SATA und PCIe, wodurch sie vielseitig für den Anschluss von SSDs, WLAN-Karten und anderen Erweiterungen sind. Der M.2-Formfaktor ermöglicht es, Platz zu sparen und die Verbindung von Hochleistungsgeräten wie NVMe-SSDs direkt über den PCIe-Bus für schnelle Datenübertragungen zu unterstützen.
“M Key” ist eine Bezeichnung für einen der physischen Schlüssel (Keying) in M.2-Steckplätzen. Der M.2-Steckplatz selbst kann verschiedene Schlüssel oder Buchsen haben, um die Kompatibilität mit unterschiedlichen Arten von M.2-Modulen sicherzustellen. In einem M.2-Steckplatz mit einem M Key ist der Schlitz so gestaltet, dass er speziell für M.2-Module mit einem M Key passt. M-Key-Module können verschiedene Arten von Schnittstellen verwenden, einschließlich PCIe (PCI Express) und SATA, und werden häufig für Hochleistungsgeräte wie NVMe-SSDs verwendet.
Für den Betrieb am Pi wird ein NVMe Adapter benötigt, der an den PCIe Port angeschlossen wird. Der USB auf NVMe Adapter dient vornehmlich zum Bespielen einer NVMe unter Windows. Er funktioniert aber auch mit einem Raspberry Pi - allerdings mit Geschwindigkeitseinbußen. Und er wird behandelt wie ein USB-Stick.
TBD
Solche Adapter gibt es bei eBay / Amazon für 10-15€. Zu finden unter der Bezeichnung USB NVMe Adapter.
Achtung
Ohne aktuelle Firmware (Bootloader) wird die NVMe erst gar nicht erkannt!
Hinweis
Der Bootloader wird auf dem Board selber geflasht. Also selbst bei einem Wechsel von SD / USB / NVMe bleibt er in seiner Version erhalten!
sudo apt update -y && sudo apt upgrade -y && sudo apt install fio gparted piclone -y
sudo rpi-eeprom-update
pi@Pi5Test:~ $ sudo rpi-eeprom-update *** UPDATE AVAILABLE *** BOOTLOADER: update available CURRENT: Wed 13 Sep 10:37:06 UTC 2023 (1694601426) LATEST: Wed 6 Dec 18:29:25 UTC 2023 (1701887365) RELEASE: default (/lib/firmware/raspberrypi/bootloader-2712/default) Use raspi-config to change the release.
sudo rpi-eeprom-update -a
sudo reboot
Alternativ kann die Firmware auch über sudo raspi-config
auf den aktuellen Stand gebracht werden:
sudo raspi-config
Hinweise
1) Die Bootreihenfolge kann generell wie hier beschrieben eingestellt werden. Kann von NVMe nicht gebootet werden fällt der Pi auf SD-Karte oder USB-Stick zurück.
2) Die Bootreihenfolge lässt sich auch mitsudo raspi-config
(6 Advanced Options → A4 Boot Order) anpassen. Allerdings wird dabei nicht der EintragPCIE_PROBE=1
ergänzt was bei bestimmten NVMe SSD's zu Bootproblemen führen kann.
3) Die Bootloader Konfig kann man sich auch mitsudo rpi-eeprom-config
nur anzeigen lassen.
Um von NVMe booten zu können, müssen die Bootloader Parameter angepasst werden:
sudo rpi-eeprom-config --edit
BOOT_ORDER
muss auf 0xf416 geändert werden: BOOT_ORDER=0xf416
PCIE_PROBE=1
STRG+x
dann Y
und Enter
das Editieren beendenUpdating bootloader EEPROM .... CURRENT: Fri 5 Jan 15:57:40 UTC 2024 (1704470260) UPDATE: Fri 5 Jan 15:57:40 UTC 2024 (1704470260) BOOTFS: /boot/firmware '/tmp/tmp.adUegKWjEM' -> '/boot/firmware/pieeprom.upd' Copying recovery.bin to /boot/firmware for EEPROM update EEPROM updates pending. Please reboot to apply the update. To cancel a pending update run "sudo rpi-eeprom-update -r".
sudo reboot
Hinweis
Die NVMe wurde trotz fehlendem Eintrag erkannt mit der letzten Firmware.
sudo nano /boot/firmware/config.txt
dtparam=pciex1
STRG+X
, dann Y
und Enter
verlassen sudo reboot
dmesg
pi@Pi5Test:~ $ pi@Pi5Test:~ $ dmesg |grep brcm-pcie |grep 'PCI host bridge' [ 0.410070] brcm-pcie 1000110000.pcie: PCI host bridge to bus 0000:00 [ 0.530924] brcm-pcie 1000120000.pcie: PCI host bridge to bus 0001:00
lspci
pi@Pi5Test:~ $ lspci 0000:00:00.0 PCI bridge: Broadcom Inc. and subsidiaries Device 2712 (rev 21) 0000:01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980 0001:00:00.0 PCI bridge: Broadcom Inc. and subsidiaries Device 2712 (rev 21) 0001:01:00.0 Ethernet controller: Device 1de4:0001
Offiziell unterstützt der Raspberry Pi 5 nur PCIe 2 - der Bus würde als mit 5GB/s arbeiten. Es ist allerdings möglich den PCIe Bus auf die Version 3 einzustellen. In dem Fall arbeitet der Bus mit 10GB/s.
sudo nano /boot/firmware/config.txt
dtparam=pciex1_gen=3
STRG+X
, dann Y
und Enter
verlassen sudo reboot
dmesg |grep brcm-pcie |grep link
pi@Pi5Test:~ $ dmesg |grep brcm-pcie |grep link [ 0.613326] brcm-pcie 1000110000.pcie: link up, 8.0 GT/s PCIe x1 (!SSC) [ 0.733329] brcm-pcie 1000120000.pcie: link up, 5.0 GT/s PCIe x4 (!SSC)
pi@Pi5Test:~ $ dmesg |grep brcm-pcie |grep link [ 0.517003] brcm-pcie 1000110000.pcie: link up, 5.0 GT/s PCIe x1 (!SSC) [ 0.637007] brcm-pcie 1000120000.pcie: link up, 5.0 GT/s PCIe x4 (!SSC)
Was ist GT/s?
Dazu gibt es hier ein paar Erklärungen :
https://de.wikipedia.org/wiki/Transfers_pro_Sekunde
https://3roam.com/pcie-bandwidth-calculator/
https://forum.huawei.com/enterprise/en/pcie-transfer-rate-and-available-bandwidth/thread/667265205186478081-667213852955258880
dmesg |grep nvme
pi@Pi5Test:~ $ dmesg |grep nvme [ 0.633625] nvme nvme0: pci function 0000:01:00.0 [ 0.633663] nvme 0000:01:00.0: enabling device (0000 -> 0002) [ 0.637575] nvme nvme0: Shutdown timeout set to 8 seconds [ 0.646457] nvme nvme0: allocated 64 MiB host memory buffer. [ 1.150493] nvme nvme0: 4/0/0 default/read/poll queues [ 1.581354] nvme0n1: p1 [ 4.906692] EXT4-fs (nvme0n1p1): mounted filesystem with ordered data mode. Quota mode: none.
lsblk
pi@Pi5Test:~ $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sdb 8:16 1 28.6G 0 disk ├─sdb1 8:17 1 512M 0 part /boot/firmware └─sdb2 8:18 1 28.1G 0 part / nvme0n1 259:0 0 238.5G 0 disk └─nvme0n1p1 259:1 0 238.5G 0 part /nvme
lspci -v
0000:01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980 (prog-if 02 [NVM Express])
export XAUTHORITY=~/.Xauthority
sudo gnome-disks
sudo gparted
Es gibt durchaus verschiedene Szenarien zur Einrichtung und Verwendung einer NVMe SSD.
config.txt
editieren. Folgenden Inhalt einfügen: dtparam=pciex1
dtparam=pciex1_gen=3
sudo nano /boot/config.txt
und folgenden Inhalt einfügen: dtparam=pciex1
dtparam=pciex1_gen=3
STRG+x
dann Y
und dann Enter
piclone
)lsblk
prüfen, ob die NVMe auch erkannt wurde (nvme0..): pi@Pi5Test:~ $ lsblk NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 1 28.6G 0 disk ├─sda1 8:1 1 512M 0 part /boot/firmware └─sda2 8:2 1 28.1G 0 part / nvme0n1 259:0 0 238.5G 0 disk ├─nvme0n1p1 259:1 0 512M 0 part └─nvme0n1p2 259:2 0 238G 0 part
New Partition UUIDs
kann man im Normalfall anhakensudo poweroff
sudo blkid
pi@Pi5Test:~ $ sudo blkid /dev/nvme0n1p1: UUID="077d58d3-7ea8-4eba-88f6-49472da6ba98" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="a8380a80-01" /dev/sda2: LABEL="rootfs" UUID="4aa56689-dcb4-4759-90e6-179beae559ac" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="6b2f5983-02" /dev/sda1: LABEL_FATBOOT="bootfs" LABEL="bootfs" UUID="EF6E-C078" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="6b2f5983-01"
Hier ist es dann aus der nvme Zeile das a8380a80-01
sudo mkdir /nvme
sudo chown pi:pi /nvme
sudo nano /etc/fstab
PARTUUID=a8380a80-01 /nvme auto rw,relatime,nofail 0 0
STRG+x
dann Y
dann Enter
sudo reboot
/nvme
kann man das folgendermaßen analysieren sudo mount -a
sudo apt update -y && sudo apt upgrade -y && sudo apt install fio gparted -y
cd ~ && nano chkspeed.sh
#!/bin/bash echo "Testing Sequential READ" rm -rf $1/random_read.fio fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=$1/random_read.fio --bs=64k --iodepth=64 --size=$2 --readwrite=read |grep READ echo "Testing Random READ" rm -rf $1/random_read.fio fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=$1/random_read.fio --bs=64k --iodepth=64 --size=$2 --readwrite=randread |grep READ echo "Testing Sequential WRITE" rm -rf $1/random_read.fio fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=$1/random_read.fio --bs=64k --iodepth=64 --size=$2 --readwrite=write |grep WRITE echo "Testing Random WRITE" rm -rf $1/random_read.fio fio --randrepeat=1 --ioengine=libaio --direct=1 --gtod_reduce=1 --name=test --filename=$1/random_read.fio --bs=64k --iodepth=64 --size=$2 --readwrite=randwrite |grep WRITE rm -rf $1/random_read.fio
chmod +x chkspeed.sh
lsblk -f
: pi@Pi5Test:~ $ lsblk -f NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS nvme0n1 ├─nvme0n1p1 vfat FAT32 bootfs EF6E-C078 438.1M 14% /boot/firmware └─nvme0n1p2 ext4 1.0 rootfs 4aa56689-dcb4-4759-90e6-179beae559ac 209.5G 5% /
sudo ~/chkspeed.sh ~ 1GB
pi@Pi5Test:~ $ sudo ~/chkspeed.sh ~ 1GB Testing Sequential READ READ: bw=785MiB/s (823MB/s), 785MiB/s-785MiB/s (823MB/s-823MB/s), io=1024MiB (1074MB), run=1305-1305msec Testing Random READ READ: bw=799MiB/s (838MB/s), 799MiB/s-799MiB/s (838MB/s-838MB/s), io=1024MiB (1074MB), run=1281-1281msec Testing Sequential WRITE WRITE: bw=671MiB/s (704MB/s), 671MiB/s-671MiB/s (704MB/s-704MB/s), io=1024MiB (1074MB), run=1526-1526msec Testing Random WRITE WRITE: bw=698MiB/s (731MB/s), 698MiB/s-698MiB/s (731MB/s-731MB/s), io=1024MiB (1074MB), run=1468-1468msec
pi@Pi5Test:~ $ lsblk -f NAME FSTYPE FSVER LABEL UUID FSAVAIL FSUSE% MOUNTPOINTS sda ├─sda1 vfat FAT32 bootfs EF6E-C078 437.6M 14% /media/pi/bootfs └─sda2 ext4 1.0 rootfs 4aa56689-dcb4-4759-90e6-179beae559ac 14.9G 42% /media/pi/rootfs mmcblk0 ├─mmcblk0p1 vfat FAT32 bootfs EF6E-C078 435.5M 15% /media/pi/bootfs1 └─mmcblk0p2 ext4 1.0 rootfs 4aa56689-dcb4-4759-90e6-179beae559ac 50.2G 8% /media/pi/rootfs1 nvme0n1 ├─nvme0n1p1 vfat FAT32 bootfs EF6E-C078 438.1M 14% /boot/firmware └─nvme0n1p2 ext4 1.0 rootfs 4aa56689-dcb4-4759-90e6-179beae559ac 209.5G 5% /
sudo mkdir /mountdir
sudo mount /dev/nvme0n1p1 /mountdir/
sudo ~/chkspeed.sh /mountdir 1GB
getestet werdensudo umount /dev/nvme0n1p1
sudo apt install libreoffice
libreoffice
sudo apt install smartmontools nvme-cli -y
sudo smartctl -a /dev/nvme0
sudo smartctl -l error /dev/nvme0
pi@Pi5Test:~ $ sudo smartctl -l error /dev/nvme0 smartctl 7.3 2022-02-28 r5338 [aarch64-linux-6.1.0-rpi7-rpi-2712] (local build) Copyright (C) 2002-22, Bruce Allen, Christian Franke, www.smartmontools.org === START OF SMART DATA SECTION === Error Information (NVMe Log 0x01, 16 of 16 entries) Num ErrCount SQId CmdId Status PELoc LBA NSID VS 0 1358 0 0x1002 0x4213 0x028 0 0 - 1 1357 0 0x1000 0x4213 0x028 0 0 - 2 1356 0 0x3007 0x4005 0x028 0 0 -
sudo smartctl -H /dev/nvme0
pi@Pi5Test:~ $ sudo smartctl -H /dev/nvme0 smartctl 7.3 2022-02-28 r5338 [aarch64-linux-6.1.0-rpi7-rpi-2712] (local build) Copyright (C) 2002-22, Bruce Allen, Christian Franke, www.smartmontools.org === START OF SMART DATA SECTION === SMART overall-health self-assessment test result: PASSED
sudo nvme list
pi@Pi5Test:~ $ sudo nvme list Node Generic SN Model Namespace Usage Format FW Rev --------------------- --------------------- -------------------- ---------------------------------------- --------- -------------------------- ---------------- -------- /dev/nvme0n1 /dev/ng0n1 SN195108904273 GIGABYTE GP-GSM2NE3256GNTD 1 256.06 GB / 256.06 GB 512 B + 0 B EDFM00.2
sudo nvme –smart-log /dev/nvme0n1
pi@Pi5Test:~ $ sudo nvme --smart-log /dev/nvme0n1 Smart Log for NVME device:nvme0n1 namespace-id:ffffffff critical_warning : 0 temperature : 6°C (279 Kelvin) available_spare : 100% available_spare_threshold : 5% percentage_used : 1% endurance group critical warning summary: 0 Data Units Read : 1,697,108 (868.92 GB) Data Units Written : 3,901,500 (2.00 TB) host_read_commands : 15,448,378 host_write_commands : 42,856,162 controller_busy_time : 1,107 power_cycles : 986 power_on_hours : 17,079 unsafe_shutdowns : 160 media_errors : 0 num_err_log_entries : 1,358 Warning Temperature Time : 0 Critical Composite Temperature Time : 0 Thermal Management T1 Trans Count : 0 Thermal Management T2 Trans Count : 0 Thermal Management T1 Total Time : 0 Thermal Management T2 Total Time : 0
sudo nvme error-log /dev/nvme0n1
Diese Punkte sind normal nicht Bestandteil vom YT Video!
Warnung
Nur wichtig für Tests!
sudo rpi-eeprom-update -d -f /lib/firmware/raspberrypi/bootloader-2712/default/pieeprom-2023-12-06.bin
/lib/firmware/raspberrypi/bootloader-2712/default