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 auscmdline.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 mitdiskutil 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 dortroot=/dev/sda2
eintragen. (vgl. oben)
- Raspbian-System auf die SD-Karte schreiben. Auf dem Mac z.B. mit
- 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.