Von USB booten

Aus Fingers Wiki
Zur Navigation springen Zur Suche springen

Der Raspberry Pi kann von Haus aus ja nur von SD-Karte booten. Das ist insofern ein Problem, als SD-Karten wohl sehr anfällig drauf sind, dass bei abklemmen der Stromversorgung während eines Schreibzugriffs gerne mal das Dateisystem der entsprechenden Partition hops geht. USB-Sticks sind in der Hinsicht wohl weniger empfindlich, da diese wohl noch einen Elko drinnen haben und so den letzten Schreibzugriff noch zu Ende bringen können (Quelle: Fritzler hier).

Update 2022: Der Pi3 aufwärts mit Mikro-SD-Karte hat das Problem offenbar nicht mehr. Ich hatte jedenfalls mit hart ausschalten keine Probleme mehr.

Naheliegende Idee: Gebootet wird von SD-Karte, aber alles weitere passiert vom USB-Stick. Dazu ist nicht viel nötig:

Root-Partition von der SD-Karte auf den USB-Stick übertragen

Ich hab einfach die root-Partition (bei Noobs mit installiertem Raspbian ist das Partition 6 auf der SD-Karte) mit gparted (Partitionierungsprogramm unter Linux) auf den USB-Stick kopiert (vorher dir originale Partition vom USB-Stick gelöscht). Damit ist meine Root-Partition jetzt die erste Partition auf dem USB-Stick.

Man kann natürlich auch eine Partition anlegen und mit dem gewünschten Dateisystem formatieren und dann die Daten kopieren oder ein Partitionierungsprogramm seiner Wahl verwenden oder oder

Boot-Optionen auf der SD-Karte ändern

In der (FAT-)Boot-Partition von Raspbian (bei mir Nr. 5) gibt es die Datei cmdline.txt

Dieser Teil:

root=/dev/mmcblk0p6 rootfstype=ext4 

ist zuständig dafür, dem Kernel zu sagen, wo er nach seinem Root-Filesystem suchen soll.

Ändern in:

root=/dev/sda1 rootfstype=ext4 

Damit sucht der Kernel seine Root-Partition auf dem ersten sd-Device (a) in der ersten Partition (1).

/etc/fstab anpassen

In der Datei /etc/fstab ist festgelegt, welche Partitionen mit welchen Optionen gemounted wird. Diese ist (in der Root-Partition auf dem USB-Stick anzupassen. (Ich hab ne eigene Partition für /home angelegt, die hab ich analog auch auf den USB-Stick gepackt.)

Original:

proc            /proc           proc    defaults          0       0
/dev/mmcblk0p5  /boot           vfat    defaults          0       2
/dev/mmcblk0p6  /               ext4    defaults,noatime  0       1
/dev/mmcblk0p7  /home/          ext4    defaults,noatime  0       1

ändern in

proc            /proc           proc    defaults          0       0
/dev/mmcblk0p5  /boot           vfat    defaults,noauto   0       2
/dev/sda1       /               ext4    defaults,noatime  0       1
/dev/sda2       /home/          ext4    defaults,noatime  0       1
  • Die erste Zeile mounted ein virtuelles Dateisystem -> nix zu tun.
  • Die zweite Zeile ist für die Boot-Partition zuständig, die ja noch auf der SD-Karte liegt. Die Option noauto sorgt dafür, das die Partition beim Start nicht automatisch eingehängt wird. Mit mount /boot ist das aber jederzeit möglich, wenn man trotzdem was drauf ändern will.
  • Die dritte Zeile sorgt für das Einhängen der richtigen Root-Partition (die selbe wie auch in der cmdline.txt).
  • Die vierte kümmert sich um meine Home-Partition

Fertig

Mehr ist nicht zu tun und fortan wird von der SD-Karte der Kernel gebootet, aber alle Dateisysteme, die im Betrieb eingehängt sind liegen auf dem USB-Stick.

Mehrere USB-Medien beim Start

Wenn man mehrere USB-Medien beim Start eingesteckt hat, müsste man sich angucken, welches das sda und welches sdb wird. Oder man referenziert über /dev/disk und die Unterverzeichniss nach Name oder UUID auf das gewünschte Medium. Hab ich nicht gemacht, da im Normalbetrieb bei mir nur ein USB-Medium angesteckt ist und ich 1:1 Kopien davon als Backup hab um im Zweifel nur umstecken zu müssen. Wenn man die Partition anhand Ihrer eineindeutigen UUID einhängt, geht das natürlich nicht. Mit dem einhängen per Label hab ich mich nicht näher beschäftigt. Im Zweifel einfach mal in die Verzeichnisse reingucken. per ls -l kann man sich anzeigen lassen, welchem /dev/sdxy (in der aktuellen Konfiguration) eine UUID oder ein Label zugeordnet ist.