Raspberry Pi 5 mit HatDrive M.2 SSD ausprobiert: So kommen RPI & SSD zusammen

Als Video ansehen
Bereitgestellt über YouTube

Raspberry Pi 5 mit HatDrive M.2 SSD ausprobiert: So kommen RPI & SSD zusammen

Durch die PCIe-Schnittstelle kann der Raspberry Pi 5 erstmals SSDs ohne Umweg über USB ansteuern. Ich habe den Pineberry HatDrive ausprobiert und zeige euch, wie man ihn montiert und das Raspberry Pi OS auf die neue SSD überträgt. Außerdem schauen wir uns ein paar potenzielle Fehler sowie Probleme an. Die aktiven Forumsleser werden bereits geahnt haben, dass ein solcher Beitrag kommen wird: Ich hatte dort ein Bild des angekommenen HatDrive gepostet. Dieser wurde im Dezember 2023 als erstes Zubehör dieser Art vorgestellt.

Zwei M.2 Adapter von Pineberry

Da der Raspberry Pi 5 keinen M.2 Slot besitzt, wie man es von X86 Mainboards her kennt, muss dieser über einen HAT nachgerüstet werden. Der HAT nutzt den neuen PCI Express Anschluss, um höhere Datenraten zu erreichen. Ein offizieller ist als Zubehör für 2024 angekündigt, allerdings bislang nicht erschienen. Pineberry war schneller und hat bereits Ende 2023 sogar zwei M.2 HATs vorgestellt.

Der HatDrive! Top wird oben auf den Raspberry Pi gesteckt, unterstützt allerdings nur die kleinsten M.2 Formate 2230 und 2242. Sie sind kleiner, dafür allerdings weniger verbreitet und meist teurer. Das gilt auch für den HAT: Er kostete bei einem deutschen Händler 26,90€ (Stand: Februar 2024). Für die 2280 M.2 SSDs, die im X86 PC-Umfeld am verbreitetsten sind, benötigt man den HatDrive! Bottom. Ihn habe ich im Januar 2024 für 34,90€ bestellt. Im offiziellen Pineberry-Shop werden nur 25,99€ fällig. Allerdings schlägt der Versand aus Polen mit 10€ zu Buche, sodass eine Einzelbestellung sogar teurer wäre.

Mit der Bottom-Edition können alle M.2 SSDs mit Formatfaktor 2230, 2242 und 2280 betrieben werden. Dafür ist er etwas größer und muss an die Unterseite des Raspberry Pi gesteckt werden – eher unüblich, da Erweiterungskarten normalerweise oben auf den Pi gesteckt werden – wie ein Hut, auf den die etablierte Bezeichnung HAT anspielt. Er wird daher teilweise als Adapter bezeichnet. Das macht Sinn, um keine Verwirrung zu Stiften. Insbesondere beim Raspberry Pi 5 kann dieser Unterschied aufgrund des Kühlers durchaus wichtig sein.

Hier stellt sich die Frage, ob ein HAT zusätzlich auf den Kühler montiert werden kann – und wenn ja, dieser noch genug Platz dazwischen hat, um Luft ansaugen zu können. Generell sollte man beim Kauf von Erweiterungsplatinen bedenken, dass der Raspberry Pi damit nicht mehr in die meisten Gehäuse passt. Im Zweifel vorher in der Beschreibung prüfen oder nachfragen, ob das Gehäuse mit bestimmten Erweiterungskarten kompatibel ist.

Das brauchst du: So läuft die Montage ab

Ich habe mich für den HatDrive! Bottom entschieden: 2280 ist das gängigste Format, von dem ich noch SSDs habe. Diese kann man problemlos in X86 PCs einsetzen. Die kleineren Formate dagegen sind exotischer und werden höchstens in manchen Notebooks oder Mini-PCs verwendet.

Konkret benötigst du

  • Einen Raspberry Pi 5 mit Speicherkarte (siehe unten)
  • Einen kleinen Kreuzschlitz oder Schlitz-Schraubendreher
  • Die gewünschte M.2 SSD

Vor der Montage solltest du zwei Dinge wissen: Der Raspberry Pi 5 kann zwar von NVMe booten und damit die Speicherkarte vollständig durch die M.2 SSD ersetzen. Allerdings ist dies standardmäßig nicht aktiviert. Das direkte Überspielen des Raspberry Pi OS Abbildes auf die M.2 SSD dürfte zudem bei vielen an einem passenden externen Adapter scheitern. Theoretisch könnte man zwar ein X86 Board in eine GNU/Linux Live-Distribution booten und das Abbild händisch mit dd auf die M.2 SSD übertragen. Das dürfte für die Meisten jedoch ein umständlicher Weg sein, sofern man nicht gerade einen Test-PC dafür zur Hand hat.

Daher zeige ich im folgenden Artikel einen anderen Weg, der immer funktioniert: Wir übertragen das Raspberry Pi OS auf eine Micro-SD Speicherkarte. Anschließend wird die M.2 SSD aktiviert und die Raspberry Pi OS Installation von der Speicherkarte auf die SSD kopiert. Danach ist die Speicherkarte theoretisch nicht mehr nötig. Ich empfehle, sie vor dem Anschluss der M2 SSD in den Raspberry Pi einzustecken. Danach wird es fummelig, weil sie durch das kurze Kabel des Adapters nur mit Mühe gerade so in den Slot geschoben werden kann.

Vorbereitung zur Montage

Wir übertragen also zunächst das Raspberry Pi OS auf eine Speicherkarte – etwa über den offiziellen Imager, wie ich es schon in mehreren Beiträgen beschrieben habe. Anschließend wird die Karte in den Raspberry Pi eingesteckt und wir beginnen mit der Montage des M.2 Adapters. Eine Neuinstallation ist allerdings nicht zwingend erforderlich. Solltest du bereits eine bestehende Installation auf der Speicherkarte haben, kannst du mit dieser fortfahren.

Die im folgenden beschriebene Reihenfolge sollte eingehalten werden. Vergisst man etwas, müssen ansonsten Schrauben zu einem späteren Zeitpunkt nochmals gelöst werden.

Im Lieferumfang befindet sich ein kleiner Beutel mit 4x Abstandhalter, 9x Schrauben zur Montage des Boards (von denen werden nur 8 Stück benötigt), eine runde Fassung zur Fixierung der SSD und eine kleinere Schraube, mit der die Fassung an der Platine befestigt wird.

Ich würde die Schrauben in den Deckel eines Glases oder ein anderes Gefäß legen, in dem sie nicht weg rollen/herunter fallen können. So hat man eine bessere Übersicht und kann leichter die benötigten Teile heraus nehmen, als aus dem kleinen Beutel.

Die Seite der Platine mit der M.2 Fassung wird nach unten zeigen, während die gegenüberliegende Seite mit dem Anschlusskabel die Auflage für den Raspberry Pi bildet. Auf dem folgenden Bild wird also später der Raspberry Pi auf die Pineberry-Platine gelegt, sodass links die zwei LEDs leicht heraus ragen.

Montage: So finden M.2 Adapter und Raspberry Pi zueinander

Zuerst montierst du die vier Abstandshalter in Richtung Raspberry Pi auf die Platine von Pineberry. Dabei werden die (dickeren) Schrauben auf der Seite mit dem M.2-Schacht herein gesteckt und der Abstandhalter gegenüberliegend montiert. Auf dem folgenden Bild ist der M.2-Schacht links.

Anschließend hat die Platine vier Füße in Richtung Raspberry Pi, die auf der Seite mit M.2 Slot befestigt wurden.

Am besten ist es, nun die Platine neben den Raspberry Pi zu legen und das Kabel anzuschließen. Man kann es auch anders herum machen. In meinem Test war der Anschluss des Kabels dadurch jedoch schwieriger: Durch die geringe Länge kann man es nicht so leicht einstecken und muss es zudem vorher selbst biegen. In jedem Falle wird zuvor die braune Halterung des PCIe-Anschlusses (schräg links über dem USB C Stromanschluss an der Seite) vorsichtig geöffnet. Am besten funktioniert dies mit einem kleinen Schraubendreher oder alternativ Fingernagel bzw. den kleinen Haken an den Seiten. Man sollte behutsam vorgehen, um die Halterung nicht heraus zu brechen. Sie muss nur wenige Millimeter nach oben geschoben werden:

Das Anschlusskabel steckt man mit den Kontakten in Richtung Innenseite des Raspberry Pi hinein. Dabei verschwinden die sichtbaren Kontakte nicht vollständig im Stecker. Nun die graue Halterung wieder vorsichtig bis nach unten drücken, damit sie mit der Buchse eben ist.

Bevor wir mit den vier Schrauben den Raspberry Pi mit unseren zu Beginn montierten Bolzen verbinden, ist zunächst die M.2 SSD dran: Sie wird – wie man es von X86 Boards her kennt – richtig herum in den Schacht geschoben. Dafür sind die Kontakte in eine längere und kürzere Seite getrennt. Das runde Bauteil hat eine Einkärbung, wie auch die SSD gegenüber von den Anschlüssen in Form eines Halbkreises:

Es wird dort hinein geschoben, die längere Seite des runden Bauteils zeigt dabei nach unten.

Nun die SSD herunter drücken und auf der gegenüber liegenden Seite verschrauben. Achtung: Die Fassung ist etwas kleiner! Daher passen die 9 fach vorhandenen Schrauben zur Befestigung der Bolzen nicht. Hier ist die einzelne, etwas kleinere Schraube richtig. Damit wird auch klar: Möchte man die SSD lösen, müssen zuvor mindestens vier weitere Schrauben entfernt werden. Das direkte Herausziehen wie bei den Micro-SD Speicherkarten ist nicht mehr möglich.

Damit seid ihr fertig und könnt die Platine passend auf die Löcher in der Unterseite des Raspberry Pi legen. Sie wird mit vier von den größeren Schrauben befestigt, die wir anfangs für die Bolzen benutzt haben. In diese Bolzen folgen nun also die Schrauben von oben durch den Raspberry Pi hindurch, damit die Platine an ihm befestigt wird.

Dies wiederholen wir für alle vier Schrauben.

Achtung: Hier sind die Löcher mit gelbem Rand gemeint, von denen zwei in den Ecken des Raspberry Pi liegen. Nicht die daneben liegenden ohne farblichen Rand – diese sind für den Kühler und ohnehin bereits belegt, falls ihr diesen montiert habt. Folgendes Bild zeigt rechts die für HATs vorgesehenen und damit korrekten Löcher. Obwohl die Schraube bereits drin steckt, ist der Rand noch deutlich erkennbar.

Aktivieren der PCIe-Schnittstelle

Wenn wir den Raspberry Pi starten, wird er von der Speicherkarte booten – schließlich ist die SSD noch leer. Allerdings erkennt er die M.2 SSD überhaupt nicht. Selbst lsblk, welches alle Laufwerke (block devices) auflistet, zeigt weiterhin lediglich die 64 GB große Speicherkarte an. Von der 1 TB SSD hingegen keine Spur.

u-labs@pi5m2:~ $ lsblk
NAME        MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
mmcblk0     179:0    0 59.5G  0 disk 
├─mmcblk0p1 179:1    0  512M  0 part /boot/firmware
└─mmcblk0p2 179:2    0   59G  0 part /

Wie Anfangs bereits erwähnt liegt dies daran, dass die für M.2/NVMe verwendete PCIe-Schnittstelle standardmäßig nicht aktiv ist. Bei X86 PCs würde dies im BIOS geschehen. Der Raspberry Pi verwendet allerdings kein Standard BIOS/UEFI, sondern nutzt eine eigene Firmware. Deren Einstellungen liegen für das Raspberry Pi OS 12 und aktueller (erforderlich für den Raspberry Pi 5) in /boot/firmware/config.txt.1 Öffne sie als root mit einem Texteditor deiner Wahl, z.B. Nano:

sudo nano /boot/firmware/config.txt

An das Ende fügt ihr in die Gruppe [all] folgende Zeile ein:

dtparam=pciex1

Alternativ kann statt pciex1 auch nvme angegeben werden – nvme ist ein Alias für pciex1 und aktiviert ebenfalls PCIe. Zum Speichern in nano beispielsweise [STRG] + [O] drücken und mit [Enter] bestätigen. Abschließend den Editor mit [STRG] + [X] beenden. Damit die Änderungen wirksam werden, ist ein Neustart erforderlich. Auf der Konsole kann dies mit sudo reboot erfolgen. Danach erkennt das Raspberry Pi OS unsere SSD als nvme0n1:

u-labs@pi5m2:~ $ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
mmcblk0     179:0    0  59.5G  0 disk 
├─mmcblk0p1 179:1    0   512M  0 part /boot/firmware
└─mmcblk0p2 179:2    0    59G  0 part /
nvme0n1     259:0    0 931.5G  0 disk

Übertragen des Raspberry Pi OS: Grafisch

Das Partitionieren und Einhängen der SSD wäre nun theoretisch möglich. Damit wäre sie aber nur ein zusätzlicher Speicher, während das Betriebssystem mit den installierten Programmen weiterhin die SSD nutzt – außer wir würden dies explizit für bestimmte Verzeichnisse ändern. Sinnvoller ist die Nutzung der SSD als Systemlaufwerk, sodass die Speicherkarte verzichtbar wird. So braucht man sich keine Sorgen mehr über die Lebensdauer zu machen. SSDs sind für deutlich höhere Schreiblasten ausgelegt.

Dafür müssen wir zunächst unsere laufende Raspberry Pi OS Installation von der Karte auf die SSD kopieren. Die Desktop-Edition des Raspberry Pi OS stellt dafür das Hilfsprogramm piclone in der Kategorie Zubehör bereit:

Beim Quellaufwerk müssen wir unsere Karte angeben. Sind nur zwei Laufwerke (Karte + SSD) verbunden, lassen sie sich sehr einfach identifizieren: M.2 SSDs verwenden ein eigenes Namensschema für die Gerätedatei mit dem Präfix nvme gefolgt von Informationen über Anschluss & Gerätenummer – hier nvme0n1. Speicherkarten dagegen heißen mmcblk und werden durchnummeriert. Zur Sicherheit sollte man dies nochmals prüfen und weitere Laufwerke am besten zuvor trennen – Das Programm löscht sämtliche Daten des Ziellaufwerkes.

Achtung: Unbedingt per Haken aktivieren, dass die Partitionen neue UUIDs erhalten! Andernfalls kommt es zu Problemen, wenn nach dem Neustart beide Laufwerke eingebaut sind. Beispielsweise lässt sich die Startreihenfolge dann nicht mehr zurück zur SD-Karte ändern, sodass der RPI nur noch von der SSD startet.2 Möglicherweise hängt er dabei Partitionen von der Speicherkarte ein.

Schauen wir anschließend mit lsblk nach, hat nvme0n1 zwei Partitionen. Sie sind identisch mit denen der Speicherkarte mmcblk0. Piclone erkennt, wenn das Ziellaufwerk größer ist und vergrößert die Wurzel-Partition / auf die maximal verfügbare Größe. Hier sind es daher 931GB statt 59GB:

u-labs@pi5m2:~ $ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINTS
mmcblk0     179:0    0  59.5G  0 disk 
├─mmcblk0p1 179:1    0   512M  0 part /boot/firmware
└─mmcblk0p2 179:2    0    59G  0 part /
nvme0n1     259:0    0 931.5G  0 disk 
├─nvme0n1p1 259:3    0   512M  0 part 
└─nvme0n1p2 259:4    0   931G  0 part

Übertragen der Karte ohne grafische Oberfläche

Leider unterstützt piclone derzeit nur die grafische Oberfläche und kann nicht auf der Konsole ausgeführt werden. Vom direkten Kopieren mittels dd ist ohne weitere Anpassungen abzuraten, weil eine 1:1 Kopie Probleme machen kann. Insbesondere dann, wenn beide Laufwerke verbunden bleiben sollen. Mit rpi-clone hat die quelloffene Gemeinschaft ein Skript entwickelt, dass die notwendigen Vorarbeiten erledigt – darunter z.B. das Anpassen der UUIDs.3 Der ursprüngliche Entwickler hat dessen Weiterentwicklung eingestellt. Glücklicherweise ist das in der Open Source Community kein Problem: Jeder kann es mit einem Fork selbst in die Hand nehmen, wie es etwa Jeff Geerling getan hat.4

git clone https://github.com/geerlingguy/rpi-clone.git
cd rpi-clone

Sollte die SSD eingehängt sein, muss sie zuerst mit umount ausgehangen werden. Zu empfehlen ist zudem, alle Dateisysteme zu entfernen. Dementsprechend sollten sich auf dem Laufwerk keine ungesicherten Daten mehr befinden.

sudo umount /dev/nvme0n1*
sudo wipefs --all /dev/nvme0n1

Um das Klonen zu starten, muss der Gerätename (nicht der Partitionsname) an rpi-clone übergeben werden. Dieser kann z.B. mit lsblk ermittelt werden.

sudo ./rpi-clone nvme0n1

Ändern der Startreihenfolge: Von M.2 SSD booten

Nach einem Neustart würde der Raspberry Pi aber trotzdem von der Karte starten, weil sie in der Startreihenfolge standardmäßig an erster Stelle steht. Auch das kennt man von X86 Systemen, die dann z.B. nicht von einem USB Stick starten. Hierfür muss die Startreihenfolge im BIOS/UEFI angepasst und das gewünschte Medium an erster Stelle gesetzt werden. Wie zuvor erwähnt, nutzt der Raspberry Pi leider nicht das standardisierte UEFI, sondern eine selbst entwickelte Firmware. Diese können wir mit dem Werkzeug rpi-eeprom-config bearbeiten:

sudo rpi-eeprom-config --edit

Die Startreihenfolge wird in der Variable BOOT_ORDER angegeben. Standardmäßig steht diese auf 0xf41 – dadurch versucht der Raspberry Pi zunächst von SD-Karte zu starten, alternativ USB-Massenspeichern.

BOOT_ORDER=0xf41

Für den Raspberry Pi 5 (und das Compute Model 4) wurde 0x6 eingeführt, damit er von PCIe-SSDs startet. Somit müssen wir an die Variable nur eine „6“ anhängen. Darüber hinaus wird von Seiten des Raspberry Pi empfohlen, PCIE_PROBE=1 außer für HAT+ Geräte zu setzen.5 Was letztere genau macht, ist nicht offiziell dokumentiert. Laut anderen Quellen durchläuft der RPI dabei den gesamten PCIe Bus.6 In meinen Tests war dies für den Pineberry HatDrive Bottom nicht notwendig, möglicherweise ist dies für andere Erweiterungsboards der Fall.

BOOT_ORDER=0xf416
PCIE_PROBE=1

Welche Bedeutung die hexadezimalen Werte haben, steht in der Dokumentation.7 Man kann den Code damit von rechts nach links selbst aufschlüsseln8:

  • 6 = NVMe (wird zuerst versucht)
  • 1 = SD-Karte
  • 4 = USB-Massenspeicher
  • f = Diese Reihenfolge wiederholen, falls NVMe/SD/USB kein startfähiges Betriebssystem enthalten. Folgende Fehlermeldung zeigt dies beispielhaft, wenn nur die Speicherkarte aktiv ist und von ihr nicht gestartet werden kann.

Nach dem Speichern ist ein Neustart notwendig, damit unsere Änderungen angewendet werden. Da die Firmware die neue Startreihenfolge dabei direkt anwendet, wird von der SSD gebootet. Um das zu verifizieren, schauen wir mit df, wo das Wurzel-Dateisystem / eingehängt ist:

u-labs@pi5m2:~ $ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/nvme0n1p2  916G  4.4G  865G   1% /

Schon an der Größe erkennt man: Über 900GB muss die SSD sein, da die Karte nur 64GB fassen konnte. /dev/nvme0n1p2 ist die zweite Partition auf unserer NVMe-SSD. Zum Vergleich, vor der Änderung lag der Einhängepunkt / auf /dev/mmcblk0p2:

u-labs@pi5m2:~ $ df -h /
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk0p2   58G  4.4G   51G   8% /

Schwierigkeiten in der Handhabung

Wie im Abschnitt zur Montage erwähnt, sollte man die Speicherkarte möglichst vorher einstecken. Sobald das HatDrive montiert ist, wird sie vom Flachbandkabel zum Anschluss an die PCIe-Buchse nahezu komplett verdeckt. Selbst wenn man das Kabel löst, kann man sie mit den Fingern nicht mehr greifen – nun ist die Erweiterungsplatine im Weg. Kabel entfernen und die SSD mit einer Pinzette vorsichtig heraus ziehen ist die einzige Alternative zum Lösen der vier Schrauben. Beim Wechsel der SSD führt dagegen kein Weg dran vorbei.

Wer den Raspberry Pi höchstens beim Ende des Lebenszyklus der Debian-Version neu installiert, mag diesen Aufwand vielleicht noch verschmerzen. Für meine Beiträge und alle anderen, die damit viel ausprobieren, finde ich es umständlich. Zumal die Netzwerk-Installation derzeit nicht auf dem Raspberry Pi 5 läuft. Es führt daher kein Weg dran vorbei, Karte oder SSD zur Neuinstallation außerhalb zu befüllen. Insbesondere deswegen sollte zumindest die Speicherkarte ohne größere Umbauarbeiten leicht erreichbar sein. Ein Stück weit ist das dem Design des Raspberry Pi 5 geschuldet: Der PCIe-Anschluss befindet sich genau über dem Speicherkartenslot.

Pimoroni (Großbritannien) hat sich etwas einfallen lassen: Man hat die PCIe-Buchse auf dem eigenen Board etwas zur Seite verschoben.9 Das Kabel ist wie ein lang gezogenes „S“ gebogen, sodass der Zugang zur Speicherkarte scheinbar frei bleibt.

Fazit

Der Raspberry Pi 5 hat erstmals die Möglichkeit, per PCIe SSDs ohne Umwege ansprechen zu können. Selbst mit der zertifizierten Gen 2.0 erhöht das die Geschwindigkeit gegenüber schnellen Speicherkarten deutlich. Außerdem können so größere Datenmengen ohne externe Laufwerke robust gespeichert werden. Pineberry hat als erster passendes Zubehör auf den Markt gebracht. Das funktioniert, jedoch wird der Wechsel von SD-Karte und SSD beim HatDrive! Bottom erschwert. Das Top Modell dürfte diese Schwierigkeiten nicht haben, da das Kabel nach oben statt unten verläuft. Allerdings gibt es derzeit kein passendes Gehäuse. Durch die Platine wird der Raspberry Pi nicht nur höher, sondern im Falle des Bottom zudem um etwa 0,5cm länger.

Abgesehen von diesen Wermutstropfen fasst der HatDrive! Bottom alle gängigen SSDs. Vor allem dank dem gängigen 2280 Formatfaktor kann man auf eine große Auswahl zurück greifen. PCIe Gen 3.0 lief in meinem Test bisher ebenfalls stabil – wenngleich dies nicht offiziell unterstützt wird.

Quellen & weiterführende Informationen

  1. https://www.raspberrypi.com/documentation/computers/config_txt.html ↩︎
  2. https://forums.raspberrypi.com/viewtopic.php?t=364985 ↩︎
  3. https://github.com/billw2/rpi-clone ↩︎
  4. https://github.com/geerlingguy/rpi-clone ↩︎
  5. https://www.raspberrypi.com/documentation/computers/raspberry-pi-5.html#booting-from-pcie ↩︎
  6. https://docs.pineberrypi.com/tutorial-booting-from-nvme ↩︎
  7. https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#BOOT_ORDER ↩︎
  8. https://community.volumio.com/t/dev-rasspery-pi-4b-5-usb-or-nvme-m-2-boot/65032 ↩︎
  9. https://shop.pimoroni.com/products/nvme-base?variant=41219587178579 ↩︎

Leave a Reply