Donnerstag, 25. Juli 2019

rootfs auf ein anderes Laufwerk verschieben

Der Startparameter root= legt für den Linuxkernel fest wo das root FileSystem zu finden ist.
In der dann dort gelesenen /etc/fstab wird festgelegt wohin welches Laufwerk eingehängt/gemounted wird. Das gilt auch für das rootfs.
Anhand vom SingeBoardComputer Odroid HC1 will ich zeigen wie man das rootfs vom Originalstandort: 2. Partition der SD Card auf eine über Sata angeschlossene Disc (oder irgendein anders Laufwerk) verschieben kann.

Beschreibungen dazu habe ich einige gefunden, ich habe versucht sie zu verstehen und für mich so simpel wie möglich umzusetzen. Prinzipiell wird das in der Art für jeden SBC funktionieren.

Der Systemstart ist dann wie folgt: Bootsystem von SD Card lesen, rootfs auf der zweiten Disc über Sata oder USB starten.
Es gibt auch SBCs die direkt (ohne Umweg über SD Card) von einer Sata/Usb Disc booten können!
Hinweis:
Mittlerweile können einige Hardwareversionen des Raspberry Pi auch direkt von USB booten.
Dazu habe ich auch einen neuen Artikel gemacht.
Nachtrag 2022: Ich bin beim Odroid auf Armbian umgestiegen. Bei Armbian empfehle ich diesen Vorgang einfacher mit sudo armbian-config / System ... oder mit dem Script sudo nand-sata-install durchführen. Siehe dazu auch die Ergänzung am Ende des Artikels.
Ich habe es der Vollständigkeit halber an zwei SBC Exemplaren getestet:
  • Odroid HC1 mit Ubuntu, Bootkonfiguration liegt in /media/boot/boot.ini
  • Raspberry Pi 2 mit raspbian, Bootkonfiguration liegt in /boot/cmdline.txt
Die Vorgehensweise und das Prinzip ist fast identisch. Folgendes ist zu tun:
  1. Disc partitionieren und formatieren
  2. Disc mounten
  3. rootfs von SD Card nach Disc kopieren
  4. fstab auf der Disc anpassen 
  5. Bootparameter auf der SD Card anpassen.
  6. Nach einem Neustart ist das rootfs auf der Disc 

Vorbereitung

Ein Tool ist eventuell noch nicht installiert: rsync
Wir müssen alles im sudo (root) Kontext ausführen.
sudo su
apt update
apt-get install rsync
lsblk
Der letzte Befehl dient dazu, den Geräte Eintrag zur Disc zu finden, meist wird das sda sein.

Die Disc muss jetzt ev. initialisiert, mit einer Partition und einem Filesystem versehen werden.
fdisk /dev/sda
Eine kurze Befehlsreferenz für fdisk
  • mit p anzeigen, erstmal anschauen und die nächsten Schritte entscheiden
  • eventuell d für löschen oder g für ganz neue GPT Partitiontable
  • n für neu, dann werden Standardwerte abgefragt, kann man einfach bestätigen
  • w für schreiben, bisher stand alles nur im Speicher, mit w wird festgeschrieben.
Der Befehl legt das Dateisystem an, es muss nichts weiter eingegeben werden. Der letzte Befehl dauert etwas, man muss nur warten und nichts drücken!
mkfs.ext4 /dev/sda1
Damit ist die Vorbereitung der Disc abgeschlossen, jetzt definiere ich für die weitere Arbeit ein paar Parameter/Variablen um weniger zu tippen und den Code universell zu halten.
sd=sda                 # siehe Ergebnis von lsblk
mmc=mmcblk1            # für den Odroid hc1, beim Raspberry Pi muss man mmcblk0 setzen.
mp=/media/systemdrive  # kann man nach persönlichem Geschmack anpassen
Kopie des rootfs
Jetzt wird das rootfs von der SD Card auf die Disc kopiert. Achtung: Damit das wirklich umfassend funktioniert, darf das System möglichst keine offenen Dateien haben! Eventuell muss man Prozesse/Dienste beenden.
mkdir -p $mp               # Mountpoint anlegen
mount /dev/${sd}1 $mp      # Disc einhängen
rsync -axv / $mp           # rootfs mit rsync kopieren - das dauert entsprechend!

Odroid HC1

Für den Odroid HC1 muss man noch diesen Befehlsblock ausführen:
cp /media/boot/boot.ini /media/boot/boot.ini.bak
UUIDo=$(blkid -o export /dev/${mmc}p2 | grep ^UUID)
UUIDn=$(blkid -o export /dev/${sd}1 | grep ^UUID)
sed -i "s/^$UUIDo/$UUIDn/" $mp/etc/fstab
sed -i "s/root=$UUIDo/root=$UUIDn/" /media/boot/boot.ini
cp /media/boot/boot.ini /media/boot/boot.ini.hdd
Bei meinem System erfolgte die Einbindung des rootfs anhand der UUID der SD Card (des Laufwerkes). Ich habe deshalb auch die Einbindung der Disc so vorgenommen.

Andere

Bei meinem Raspberry wurde die PARTUUID, also die UUID der Partition verwendet. Letztlich könnte dort auch einfach der Pfad zum Device /dev/sda1 stehen.
Für den Raspberry sieht es so aus:
cp /boot/cmdline.txt /boot/cmdline.txt.bak 
PUUIDo=$(blkid -o export /dev/${mmc}p2 | grep PARTUUID)
PUUIDn=$(blkid -o export /dev/${sd}1 | grep PARTUUID)
sed -i "s/^$PUUIDo/$PUUIDn/" $mp/etc/fstab
sed -i "s/root=$PUUIDo/root=$PUUIDn/" /boot/cmdline.txt
cp /boot/cmdline.txt /boot/cmdline.txt.hdd

Test und Neustart

Da ich jeweils die boot Konfiguration gesichert habe, kann man leicht auf die alte config gehen und wieder von SD Card starten, oder danach die geänderte Version wieder aktivieren.

Man muss vor dem Neustart den Inhalt der boot Konfiguration überprüfen! Geht einfach
diff /media/boot/boot.ini /media/boot/boot.ini.bak

Ich suche und ersetze letztlich nur die alte durch die neue ID. Ich habe es bei einem neuen System getestet. Ob es bei allen möglichen Inhalten der beiden Dateien so funktioniert ist nicht sicher!

Odroid HC1 und Armbian

Mit Armbian führt man die Verlagerung des rootfs auf sda einfach mit dem Script nand-sata-install oder dem armbian-config Programm durch. 

Mein Problem danach: Ich hatte als System SD-Card eine relativ gute und auch "große" SD Card verwendet. Die sollte jetzt nur noch als Boot Hilfe dienen? Wie bekomme ich eine einfache, kleine SD Card dazu diesen Part in Zukunft zu übernehmen? Es geht relativ einfach. Die SD Card ist im Pfad /media/mmcboot gemountet.

Man kopiert vom laufenden System die Datei /media/mmcboot/boot/armbianEnv.txt - die enthält den "Patch" in Form von dieser Zeilen:

board_name=hc1
rootdev=UUID=68817833-d67b-4b43-a10d-fafb34eb4fdf
rootfstype=ext4
usbstoragequirks=0x2537:0x1066:u,0x2537:0x1068:u

Dann habe ich das Armbian Image auf die neu SD Card (mindestens 4GB) geschrieben, einmal gebootet und mich angemeldet und den Setup Dialog durchgeführt. 

Anschließend erzeugt man die Datei /boot/armbianEnv.txt mit gleichem Inhalt. Nach einem reboot ist alles wieder wie vorher. 

Wahrscheinlich kann man sich den ersten Bootdialog sogar ersparen indem man einfach die SD Card nach dem Aufspielen des Images einmal mountet und die Datei /boot/armbianEnv.txt erzeugt.

Keine Kommentare:

Kommentar veröffentlichen