Raspberry Pi von USB-Festplatte booten lassen

In Vorbereitung für einen remote Backup-Server habe ich einen Raspberry Pi von USB-Festplatte booten lassen, damit ich nicht befürchten muss, die vielen Lese- und vor allem Schreib-Vorgänge würden auf Dauer die SD-Karte vorschnell altern lassen. Das wäre fatal für einen Remote-Server, auf den ich keinen physischen Zugriff habe.

Hintergrund: Der „Raspi“ bootet grundsätzlich immer von SD-Karte. Das lässt sich auch nicht ändern. (Der Raspi 3 kann wohl auch direkt von USB booten, aber ich setze noch einen alten Raspi 1 ein, der für meinen Zweck als Backup-Server völlig ausreichend ist.)

Ziel ist es, nur einen minimalen „Boot-Loader“ von SD-Karte zu laden. Dann kann man auch eine alte langsame verwenden, weil sie ja ein einmal kurz je Bootvorgang benutzt wird.

Boot-Vorgang des Raspberry Pi

Grob vereinfacht habe ich den Boot-Vorgang des Raspberry Pi so verstanden (Details u.a. hier):

  • Auf der SD-Karte muss die erste Partition eine VFAT („W95 FAT32“) sein. Meiner Beobachtung nach muss diese Partition außerdem boot heißen. Von dort werden diverse Boot-Files geholt (bootcode.bin u.a.).
  • Diese laden (ebenfalls von dieser Partition) den Kernel aus kernel.img und starten ihn mit den Parametern aus cmdline.txt.
  • Im Raspbian „Original“ steht in der cmdline.txt: dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=37665771-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh.
    • Interessant ist hier (für die Frage von wo weiter gebootet wird), der root-Parameter. Er beschreibt die root-Partition (nicht die boot-Partition, wie beim initrd)
    • Um von USB-Platte zu booten, trage ich hier root=/dev/sda2 ein.
  • Alles Weitere erledigt der Kernel von der eingestellten Root-Partition aus.

Erst-Einrichtung des Systems

So habe ich das gemacht (geht sicher auf viele Weisen):

  • Download und unzip des Raspbian Systems. (Oft wird Noobs empfohlen, welches „komfortabel“ die SD-Karte erstellt. Das habe ich einmal gemacht – mag für Anfänger gut sein, mir erstellt das aber zu viele Partitionen und ich habe gerne selber im Griff, was passiert. Daher „pures“ Raspbian für mich.)
  • SD-Karte vorbereiten:
    • Raspbian-System auf die SD-Karte schreiben. Auf dem Mac z.B. mit sudo ddrescue --force Desktop/2017-11-29-raspbian-stretch-lite.img /dev/rdisk2 (nachdem man mit diskutil list die richtige Disknummer herausgefunden hat. Vorsicht!…)
    • ggf. SD-Karten nochmal neu einstecken.
    • Sicherheitshalber cp /Volumes/boot/cmdline.txt /Volumes/boot/cmdline_orig.txt
    • vi /Volumes/boot/cmdline.txt und dort root=/dev/sda2 eintragen. (vgl. oben)
  • USB-Festplatte vorbereiten
    • Raspbian-System auf die USB-Platte schreiben. (Gleiches dd wie bei der SD.)
  • Nun bootet das Ganze schon korrekt von der USB-Platte.
  • Nun mit einer Tastatur und angeschlossenem Bildschirm (leider nötig…) als pi (pw raspberry) einloggen und z.B. mit raspi-config den sshd starten.

„Korrekturen“

Größe der Root-Partition

Beim dem Erst-Boot wird die Root-Partition durch die Angabe init=/usr/lib/raspi-config/init_resize.sh automatisch auf das Maximum vergrößert. Das Filesystem aber nicht. Das muss angepasst werden.

Da ich ein Backup-System baue, habe ich die Root-Partition auf 8 GB verkleinert, damit der Rest für Backup bleibt: Beherztes Löschen und Neu-Anlegen in cfdisk. Danach mit resize2fs /dev/sda2 das Filesystem anpassen.

PARTUUID statt sda1

Man kann die root-Partition in der cmdline.txt statt mit „absoluter Angabe“ (/dev/sda2) besser via PARTUUID adressieren. Mit Hilfe von blkid findet man diese heraus. Bei mir sieht die /boot/cmdline.txt nun so aus:

  dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=868ad590-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

boot-Partition direkt von SD-Karte mounten:

Die fstab mountet normal die „zugehörige“ boot-Partition, die bei mir nun auch auf der USB-Platte liegt. Bei Kernel-Updates würde der neue Kernel daher nicht auf der boot-Partition auf der SD-Karte landen und also nicht verwendet. Außerdem gibt es Parameter in der config.txt, die man evtl. direkt editieren können möchte.

Daher ist es sinnvoll die /boot-Partition direkt von SD zu mounten. Dazu habe ich mit blkid deren PARTUUID herausgefunden und in die /etc/fstab eingetragen. Die entsprechende Zeile sieht bei mir nun so aus:

  PARTUUID=37665771-01  /boot           vfat    defaults          0       2

noatime-Flag aus dem fstab-Eintrag für die Root-Partition entfernen

Kann man drüber streiten – noatime ist aber v.a. bei SD-Karten wichtig.

Kommentar verfassen