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 -ysudo 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-configHinweise
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=1ergänzt was bei bestimmten NVMe SSD's zu Bootproblemen führen kann.
3) Die Bootloader Konfig kann man sich auch mitsudo rpi-eeprom-confignur anzeigen lassen.
Um von NVMe booten zu können, müssen die Bootloader Parameter angepasst werden:
sudo rpi-eeprom-config --editBOOT_ORDER muss auf 0xf416 geändert werden: BOOT_ORDER=0xf416PCIE_PROBE=1STRG+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 rebootHinweis
Die NVMe wurde trotz fehlendem Eintrag erkannt mit der letzten Firmware.
sudo nano /boot/firmware/config.txtdtparam=pciex1STRG+X, dann Y und Enter verlassen sudo rebootdmesg 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.txtdtparam=pciex1_gen=3STRG+X, dann Y und Enter verlassen sudo rebootdmesg |grep brcm-pcie |grep linkpi@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 -v0000:01:00.0 Non-Volatile memory controller: Samsung Electronics Co Ltd NVMe SSD Controller 980 (prog-if 02 [NVM Express])export XAUTHORITY=~/.Xauthoritysudo gnome-diskssudo gpartedEs gibt durchaus verschiedene Szenarien zur Einrichtung und Verwendung einer NVMe SSD.
config.txt editieren. Folgenden Inhalt einfügen: dtparam=pciex1 dtparam=pciex1_gen=3sudo nano /boot/config.txt und folgenden Inhalt einfügen: dtparam=pciex1 dtparam=pciex1_gen=3STRG+x dann Y und dann Enterpiclone)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 poweroffsudo 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 /nvmesudo chown pi:pi /nvmesudo nano /etc/fstab PARTUUID=a8380a80-01 /nvme auto rw,relatime,nofail 0 0STRG+x dann Y dann Entersudo reboot/nvme kann man das folgendermaßen analysieren sudo mount -asudo apt update -y && sudo apt upgrade -y && sudo apt install fio gparted -ycd ~ && 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.shlsblk -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 /mountdirsudo mount /dev/nvme0n1p1 /mountdir/sudo ~/chkspeed.sh /mountdir 1GB getestet werdensudo umount /dev/nvme0n1p1sudo apt install libreofficelibreofficesudo apt install smartmontools nvme-cli -ysudo 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/nvme0n1Diese 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