Warnung vorweg! (Oder kurz: "Ich wars nicht!")
Diese Anleitung ist zwar getestet und funktioniert im beschriebenen Fall. Aber wie so oft, wenn viele Daten kopiert, gelöscht, Partitionen angelegt und weitere potenziell gefährdende Dinge unternommen werden, gilt: VORSICHT ist die Mutter des Porzellanladens. Bitte lieber einmal mehr prüfen, ob der eingegebene Befehl wirklich wirklich tatsächlich einhundertprozentig korrekt ist. Bitte nur nachmachen, wenn Ihr genau wisst, was Ihr da tut. Und IMMER VORHER eine Sicherung anlegen (z.B. mit framp s raspibackup), aber das versteht sich ja von selbst. Na denn: Liberté, Egalité, Fraternité.
Ein mit dem Installer NOOBS installiertes Raspbian lässt sich recht leicht "befreien", es wird dazu nur ein laufendes Linux und evt. Platz zum Zwischenlagern des Systems benötigt. Ob ein RPi, ein PC mit (Live) Linux oder aber eine VM genutzt wird, spielt keine Rolle. Wichtig ist nur, ext4 formatierte Partitionen, wie sie von Raspbian u.a. verwendet werden, korrekt lesen und schreiben zu können.
Ich beschreibe den Weg mit Zwischenspeicherung der Daten, so dass nur eine (m)SD Karte notwendig ist. Einen zweiten Kartenleser vorausgesetzt, könnte das System auch gleich auf den Zielspeicher geschrieben werden. Das Vorgehen sieht kompliziert aus, ist es aber nicht. Ich habe lediglich so ausführlich wie möglich die Schritte beschrieben.
(meine) Voraussetzungen
- PC mit Oracle VM VirtualBox mit Pixel for PC and Mac (beides ist willkürlich gewählt)
- Speicherkartenleser
- Speicherkarte mit NOOBS und installiertem Raspbian (in diesem Fall habe ich testweise Raspbian with pixel, Raspbian lite und OSMC installiert)
- genügend Speicher zum Zwischenlagern des Systems
Schritt 1 - Identifizieren und Sichern
-
boot und root der betreffenden Installation identifizieren
(alle mountbaren Partitionen wurden hier automatisch gemountet, sollte das nicht der Fall sein, kann man sie mit sudo blkid anzeigen lassen und manuell die jeweilige Kombination mounten)
pi@raspberry:~ $ ls -l /media/pi
insgesamt 21
drwxr-xr-x 4 pi pi 2560 Jan 1 1970 boot
drwxr-xr-x 4 pi pi 2560 Jan 1 1970 boot0
drwxr-xr-x 5 pi pi 3072 Jan 1 1970 boot-rbp2
drwxrwxrwx 22 root root 4096 Jun 27 03:22 root
drwxrwxrwx 22 root root 4096 Jun 27 03:09 root0
drwxr-xr-x 23 root root 4096 Jul 16 10:06 root-rbp2
drwxrwxrwx 5 root root 1024 Jul 16 08:25 SETTINGS
Wie zu erwarten, gehören folgende Kombinationen zusammen:
boot / root -> Raspbian with pixel
boot0 / root0 -> Raspbian lite
boot-rbp2 / root-rbp2 -> OSMC
Dies ist z.B. an speziellen Dateien erkennbar, im Falle von OSMC sieht boot-rbp2 wie folgt aus (Hervorhebungen von mir):
Display Spoiler
pi@raspberry:~ $ ls /media/pi/boot-rbp2/
bcm2708-rpi-0-w.dtb bcm2710-rpi-cm3.dtb bcm2835-rpi-zero-w.dtb dtb-4.14.34-2-osmc System.map-4.14.34-2-osmc
bcm2708-rpi-b.dtb bcm2835-rpi-a.dtb bcm2836-rpi-2-b.dtb fixup_x.dat System Volume Information
bcm2708-rpi-b-plus.dtb bcm2835-rpi-a-plus.dtb bcm2837-rpi-3-b.dtb kernel.img utab
bcm2708-rpi-cm.dtb bcm2835-rpi-b.dtb bootcode.bin LICENCE.broadcom vmlinuz-4.14.34-2-osmc
bcm2709-rpi-2-b.dtb bcm2835-rpi-b-plus.dtb cmdline.txt os_config.json
bcm2710-rpi-3-b.dtb bcm2835-rpi-b-rev2.dtb config-4.14.34-2-osmc overlays
bcm2710-rpi-3-b-plus.dtb bcm2835-rpi-zero.dtb config.txt start_x.elf
Man könnte simple Textdateien zur Identifizierung durchaus selbst in boot und root des noch laufenden Systems erstellen, um es hernach leichter finden zu können.
- Sichern
Jetzt müssen zwei Verzeichnisse auf einem Datenträger mit genügend Platz (und allen Rechten) erstellt werden, in denen das System zwischengelagert wird (im Beispiel wird das Homeverzeichnis des angemeldeten Nutzers verwendet). Danach werden die Dateien mittels rsync kopiert. Wichtig! Die Option -a sorgt dafür, dass die Rechte erhalten bleiben. Die Option --progress kann natürlich weggelassen werden, allerdings erfolgt dann während des Kopierens - das dauert eine ganze Weile - keinerlei Ausgabe.
mkdir -p ~/save/boot
mkdir -p ~/save/root
sudo rsync -a --progress /media/pi/boot/ ~/save/boot/
sudo rsync -a --progress /media/pi/root/ ~/save/root/
Schritt 2 - Vorbereiten, Anpassen und auf Datenträger zurücksichern
Entweder werden zuerst auf dem Zielspeicher zwei Partitionen angelegt und mit dem entsprechenden Format formatiert.
1) FAT32 Partition mit ca. 40 - 50 MB
2) Label setzen für Partition: boot
3) ext4 Partition (Rest bzw. beliebige Größe)
4) Label setzen für Partition: root
Oder alternativ kann ein Raspbian Image mit Win32Diskimager oder Etcher geschrieben und das System einmal gestartet werden, damit die zweite Partition automatisch auf die volle Größe der Speicherkarte ausgedehnt wird. Wenn das geschehen ist, wird das System wieder heruntergefahren und die Dateien auf den Partitionen boot (Fat32) und root (ext4) werden alle(!) gelöscht, so dass zwei leere Partitionen übrig bleiben.
Danach werden die PARTUUID der (leeren) Partitionen der neuen Speicherkarte ausgelesen (Hervorhebungen von mir).
pi@raspberry:~ $ sudo blkid /dev/sdb*
/dev/sdb: PTUUID="d853c545" PTTYPE="dos"
/dev/sdb1: SEC_TYPE="msdos" UUID="2501-AA1C" TYPE="vfat" PARTUUID="d853c545-01"
/dev/sdb2: UUID="3a07b8d7-e427-4b76-a4ac-fbd5836a6a55" TYPE="ext4" PARTUUID="d853c545-02"
Jetzt müssen zwei Dateien angepasst werden, damit das System später starten kann. Davor wird der aktuelle Stand gesichert.
Hier den Eintrag hinter root= ändern mit der PARTUUID, die gerade ausgelesen wurde (im Beispiel die 4. Zeile mit dem Eintrag TYPE="ext4": PARTUUID="d853c545-02 )
(Achtung, alles MUSS in einer Zeile stehen bleiben!)
Das ist das Original (NOOBS)...
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/mmcblk0p7 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait splash plymouth.ignore-serial-consoles
So wird es geändert:
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=d853c545-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
Speichern mit STRG-O, beenden mit STRG-X.
Die zweite Datei wird wie folgt geändert:
Der Inhalt sieht etwa so aus:
Display Spoiler
proc /proc proc defaults 0 0
/dev/mmcblk0p6 /boot vfat defaults 0 2
/dev/mmcblk0p7 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
Hier jetzt die beiden Zeilen mit /dev/mmcblk0px ändern. Wiederum die mit blkid ausgelesenen PARTUUID eintragen (Hervorhebungen wieder von mir). Alles andere genau so stehen lassen.
Display Spoiler
proc /proc proc defaults 0 0
PARTUUID=d853c545-01 /boot vfat defaults 0 2
PARTUUID=d853c545-02 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
Speichern mit STRG-O, beenden mit STRG-X.
Jetzt werden die Dateien auf die noch leeren Partitionen (in meinem Beispiel wieder automatisch durchs System nach /media/pi/boot und /media/pi/root gemountet) geschrieben.
sudo rsync -a --progress ~/save/boot/ /media/pi/boot/
sudo rsync -a --progress ~/save/root/ /media/pi/root/
sync
Jetzt kann die Karte ausgeworfen werden und sollte im RPi eingelegt diesen das von NOOBS befreite System starten lassen.
Grüße, STF