Dualboot

Aus Grannophone
Zur Navigation springen Zur Suche springen

DualBoot

Prinzipiell kann man den Raspi dualbooten.

Dafür gibt es mehrere Methoden. Schwierigkeit bei uns ist, dass man geskriptet statt interaktiv umschalten können muss.

Die "HardCore"-Methode verwendet zwei USB-Medien und entfernt start*.elf aus dem /boot, welches nicht verwendet werden soll.

Mit der "BruteForce"-Methode hat man nur genau 2 Umgebungen, weil man 4 primäre Partitionen braucht. Umschalten zwischen den beiden Umgebungen geht dann, indem man die Partitionstabellen neu schreibt:

 /dev/sda1         532480  1056767   524288  256M  c W95 FAT32 (LBA) #boot2
 /dev/sda2           8192   532479   524288  256M  c W95 FAT32 (LBA) #boot1
 /dev/sda3        1056768 15544319 14487552  6.9G 83 Linux           #rootfs1
 /dev/sda4       15544320 30031871 14487552  6.9G 83 Linux           #rootfs2
 vs:
 /dev/sda1           8192   532479   524288  256M  c W95 FAT32 (LBA) #boot1
 /dev/sda2         532480  1056767   524288  256M  c W95 FAT32 (LBA) #boot2
 /dev/sda3        1056768 15544319 14487552  6.9G 83 Linux           #rootfs1
 /dev/sda4       15544320 30031871 14487552  6.9G 83 Linux           #rootfs2
 # Dabei muss man aufpassen, dass in [rootfs2] die /boot-Partition
 # als PARTUUID=xxxxxxxx-01 eingetragen wird, denn wenn rootfs2
 # gebootet wird, hält sich /boot natürlich aufgrund der fstab für
 # -01, obwohl es strenggenommen -02 wäre.
 # In [boot2] muss dagegen unbedingt in der cmdline.txt die PARTUUID
 # für / auf -04 gesetzt werden (und in [boot1] auf -03).

Mit -05, -06, etc. darf rootfs auch auf logischer Partition liegen! 3 primäre /boot, 1 extended, 3 logische / (und ggf. noch separate Datenpartition) sind also möglich!

Um außer PARTUUID auch LABEL etc. verwenden zu können, braucht man eine initrd. Die wird automatisch erstellt, wenn man das Overlay File System benutzt; manuell geht es so wie hier beschrieben. Damit sollte auch LVM unterstützt werden, was die Sache noch bequemer machen würde.

Laut diesem Text sei es möglich, in der config.txt einen Parameter os_prefix zu setzen, der ein Unterverzeichnis in /boot/ darstellen kann. Dann werden cmdline.txt, kernel, overlays etc. aus diesem Unterverzeichnis gezogen. Das wäre eine sehr schicke Methode. Man braucht nur genug Platz in der 1. Partition für mehrere Umgebungen. Dieses Script geht so ähnlich vor, movet aber jedes Mal die Inhalte hin und her, statt die config.txt zu ändern. Mit bindmounts sollten sich die Unterverzeichnisse auf /boot "hochmappen" lassen, falls das notwendig ist, um Updates zu fahren. Aber vielleicht ist der Updater ja auch schlau genug, ein Prefix zu beachten?

Nota bene: Laut diesem Text kann man die config.txt-Optionen davon abhängig machen, welcher GPIO in welchem Zustand ist. Das würde einen Hardware-Taster für einen Recovery-Mode erlauben - oder automatisches Recovery, wenn der Hörer nicht aufgelegt ist und das Telefon neu bootet. Also so was wie:

 [gpio4=1]
 # Receiver was off-hook during boot
 os_prefix=/bsys
 
 [gpio4=0]
 # Receiver was on-hook during boot
 os_prefix=/prd1
 #os_prefix=/prd2
 
 [all]

Pi-Boot-Switch ist einen Blick wert.

Macht es Sinn, einen Ein-/Ausschalt-Taster auf die Unterseite zu verbauen, so dass Hochheben ausschaltet?