=== Übersicht ===
- - Das Ziel
- - Die Voraussetzungen
- - Die einzelnen Schritte
- - Der einfache Weg - Benutzung des Scripts raspiSD2USB
=== Das Ziel ===
Jeder, der mit der Pi zu arbeiten beginnt, benutzt SD Karten zur Speicherung des Betriebssystems und der Daten. Nach einer gewissen Zeit möchte man dann ein schnelleres und/oder größeres Speichermedium benutzen. Leider kann man die Pi nicht ohne SD Karte betreiben. Allerdings ist sie nur zum Startzeitpunkt notwendig und es wird nur die erste Partition, die Bootpartition, der SD Karte benötigt. Sämtliche Betriebssystemdaten wie Benutzerdaten, die auf der zweiten Partition, der root Partition, liegen, können auf einem beliebigen anderen Speichermedium wie einem USB Stick oder einer USB Platte liegen.
Es sind relativ wenige Schritte notwendig um die existierende root Partition der SD Karte auf eine andere Partition umzukopieren und die SD Karte so zu ändern, dass danach nur noch die externe root Partition benutzt wird. Dazu kann man die Pi mit ihrem Linux benutzen. Entweder ändert man das aktuell laufende Linux oder man ändert eine andere SD Karte, die per USB CardReader an der Pi angeschlossen ist.
Nach der Umstellung wird die existierende root Partition der SD Karte nicht mehr benutzt. Wichtig ist, dass zum Zeitpunkt der Umstellung eine weitere Platte bzw ein USB Stick als erstes an der Pi angeschlossen wurde. Ansonsten kann es vorkommen, dass sich die aktuellen Partitionsdaten zum Zeitpunkt der Umstellung (z.B. /dev/sdc1) von denen wie sie nach einem Pi Reboot vorliegen (z.B. /dev/sda1) unterscheiden und die Pi nicht die richtige Datenpartition findet und nicht bootet.
Wer die Änderung nicht im Einzelnen verstehen und vornehmen will kann auch das am Ende des Tutorials verlinkte Script benutzen um die Änderung automatisch vornehmen zu lassen. Dabei muss aber sichergestellt sein, dass die Partitionierung der neuen Rootpartition schon erfolgte. Speziell wenn mehrere USB Geräte an der Raspi angeschlossen werden sollen muss die neue Rootpartition mit gpt angelegt worden sein. Wie das geht ist weiter unten in Schritt 1 beschrieben.
Wenn man mehrere USB Platten an der Raspberry betreibt muss die USB Platte die das Rootfilesystem bekommen soll, eine GPT Partitionstabelle besitzen, damit zum Bootzeitpunkt erkannt werden kann, welche USB Platte die Rootpartition beherbergt. Eine existierende msdos Partitionstabelle muss man dann erst mit gdisk in eine gtp Tabelle umwandeln.
=== Die Voraussetzungen ===
- Ein laufendes Linux Betriebssystem auf einer Pi (Raspbian, XBMC, ...)
- Zugriff auf die Pi entweder per Tastatur und Bildschirm direkt oder per ssh oder putty über eine bestehende Netzwerkverbindung
- Optional: USB CardReader wenn man nicht das aktuell laufende System ändern möchte
Nicht erforderlich ist ein dediziertes Linux System. Warum auch? Die Pi hat ja ein Linux welches man dazu nutzen kann
=== Die einzelnen Schritte ===
Die folgenden Schritte sind notwendig für die Umstellung und können alle auf der Pi vorgenommen werden. Als Beispiel in den Befehlen wird die Beispielplatte /dev/sda und die Partition /dev/sda1 genommen und auf der Pi mit angeschlossenem weiteren USB Platte die Befehle ausgeführt werden. Dazu meldet man sich entweder direkt an der Pi mit Tastatur und Bildschirm an oder verbindet sich per ssh von einem Linux bzw mit putty von einem Windows von einem anderen Rechner im lokalen Netz.
Mit
(kleines l) kann man rausfinden unter welchem Namen das externe USB Laufwerk von der Pi erkannt wurde. Bei mir sieht das dann z.B. so aus:
Spoiler anzeigen
pi@raspifix ~ $ sudo fdisk -l
Disk /dev/mmcblk0: 7851 MB, 7851737088 bytes
4 heads, 16 sectors/track, 239616 cylinders, total 15335424 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00047c7a
Device Boot Start End Blocks Id System
/dev/mmcblk0p1 8192 122879 57344 c W95 FAT32 (LBA)
/dev/mmcblk0p2 122880 15335423 7606272 83 Linux
Disk /dev/sda: 1000.2 GB, 1000204886016 bytes
255 heads, 63 sectors/track, 121601 cylinders, total 1953525168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x001a1bf8
Device Boot Start End Blocks Id System
/dev/sda1 2048 1953521663 976759808 83 Linux
Wer die Schritte nicht manuell ausführen will kann auch ans Ende des Tutorials springen und findet dort einen Link auf ein Script welches die Umstellung automatisch vornimmt. Zwecks Verständnisses der Zusammenhänge ist es aber trotzdem sehr sinnvoll sich die folgenden Schritte anzusehen und zu verstehen.
0) Wichtig: Erstellen eines Backups der SD Karte zur Sicherheit. Das sollte man eigentlich sowieso schon haben, denn es ist ärgerlich wenn mal die SD Karte ihren Geist aufgibt und alle Daten und EInstellungen verloren sind. Das kommt leider häufiger vor als man denkt. Ich benutze z.B. dazu dieses hier beschriebene Script. Wer mit Linux vertraut ist und die wichtige Originaldatei wie unten beschrieben sichert kann es aber auch lassen denn man kann schnell die alten Konfigdateien wieder aktivieren.
1) Erstellen einer Partition auf einem USB Stick oder einer USB Platte. Die Standardtools unter Linux ist dazu fdisk bzw gdisk. Dort erstellt man verschiedene Partitionen auf einem Medium mit ihren Größen.
Will man mehrere USB Platten an der Raspberry betreiben muss man sie mit gdisk anlegen.
Einfacher geht es aber wenn man die USB Platte normal mit einem MBR erstellt hat und vermittels gdisk von mbr zu gpt ändern lässet. Die Umwandlung sieht dann wie folgt aus:
Spoiler anzeigen
root@jessie:/backup# gdisk /dev/sda
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
MBR: MBR only
BSD: not present
APM: not present
GPT: not present
***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory. THIS OPERATION IS POTENTIALLY DESTRUCTIVE! Exit by
typing 'q' if you don't want to convert your MBR partitions
to GPT format!
***************************************************************
Command (? for help): w
Final checks complete. About to write GPT data. THIS WILL OVERWRITE EXISTING
PARTITIONS!!
Do you want to proceed? (Y/N): y
OK; writing new GUID partition table (GPT) to /dev/sdc.
The operation has completed successfully.
Danach wird gpt benutzt und es sieht sie wie folgt aus:
Spoiler anzeigen
root@jessie:/backup# gdisk /dev/sdc
GPT fdisk (gdisk) version 0.8.10
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
2) Formatieren der neuen Partition mit ext4. Das geht nur unter Linux auf der Pi oder einem anderen Linuxsystem:
3) Stoppen aller laufenden Services wie samba, vpn, seafile, apache, ...
4) Kopieren der SD Karten Datenpartition auf die neue USB Partition. Dazu wird tar, ein altbewehrtes Linux Tool zum Erstellen von Dateisammlungen benutzt. Bekannte Tools unter Windows die ähnliche Funktionen liefern sind winzip und winrar. Der Vorteil von tar liegt darin, dass sämtliche Linuxattribute der Dateien gesichert werden und wieder zurückgespielt werden können.
sudo mount /dev/sda1 /mnt
cd /
sudo tar cf - --one-file-system --exclude=/mnt/* --exclude=/proc/* --exclude=/lost+found/* --exclude=/sys/* --exclude=/media/* --exclude=/dev/* --exclude=/tmp/* --exclude=/boot/* --exclude=/run/* / | ( cd /mnt; sudo tar xfp -)
5) Ändern der /mnt/etc/fstab auf der neuen USB Partition von
nach
Der Befehl zum Ändern ist
Hat man mehrere USB Platte angeschlossen muss es wie folgt geändert werden:
/dev/mmcblk0p1 /boot vfat defaults 0 0
PARTUUID=7C32EB25-0462-429F-BF92-90FFD81FC8FE / ext4 defaults,noatime 0 0
Die kryptische Sequenz ist die PartitionUUID und die bekommt man durch folgenden Befehl heraus:
Dadurch wird nicht mehr mmcblk0p2 sondern die neue Partition sda1 als Rootfilesystem eingebunden.
6) Anlegen einer Sicherung der alten /boot/cmdline.txt
Mit dem folgenden Befehl kann man im Notfall jederzeit wieder die alte SD Datenpartition benutzen indem man die gesicherte Datei wieder auf die Originaldatei kopiert.
7) Ändern in der der Datei /boot/cmdline.txt den Teil mit root=/dev/mmcblk0p2 nach root=/dev/sda1
Beispiel (Die Zeile kann auch anders aussehen. Der Teil mit root= wird aber identisch sein)
dwc_otg.lpm_enable=0 root=/dev/mmcblk0p2 rootfstype=ext4 noatime quiet rootwait loglevel=1 zram.num_devices=2
nach
dwc_otg.lpm_enable=0 root=/dev/sda1 rootfstype=ext4 noatime quiet rootwait loglevel=1 zram.num_devices=2
Wenn man mehrere USB Platten angeschlossen hat muss wie schon oben beschrieben die PartitionsUUID anstelle von /dev/sda1 eingetragen werden.
dwc_otg.lpm_enable=0 root=PARTUUID=7C32EB25-0462-429F-BF92-90FFD81FC8FE rootfstype=ext4 noatime quiet rootwait loglevel=1 zram.num_devices=2
Der Befehl zum Ändern ist
Sollte danach die Pi wegen irgendwelcher Tipfehler nicht mehr booten kann man den vorherigen Zustand schnell wieder herstellen indem man ein anderes Raspbian bootet, dann die SD Karte an einem USB Cardreader dort anschliesst und die gesicherte cmdline.txt.sd wieder auf cmdline.txt in der boot Partition kopiert. Alternativ kann man die Datei auch unter Windows zurückkopieren.
=== Der einfache Weg - das Script ===
Alternativ kann man hier ein von mir erstelltes Script runterladen, auf die Pi kopieren. Nachdem das weitere USB Gerät angeschlossen wurde und alle laufenden Services wie vpn, samba, seafile usw gestoppt wurden, ausführen. Es nimmt alle oben beschriebenen Schritte automatisch am aktuell laufenden System vor. Das o.g. Beispiel sieht dann wie folgt aus:
Spoiler anzeigen
raspiSD2USB.py V0.2.1 2015-04-12/20:41:05 0ff0dfd
RSD0002I --- Folgende Partitionen wurden erkannt
RSD0003I --- /dev/mmcblk0p1 - Größe: 112.00 MB - Frei: 97.53 MB - Mountpunkt: /boot - Partitionstyp: vfat - Partitiontabelle: None
RSD0003I --- /dev/mmcblk0p2 - Größe: 2.85 GB - Frei: 221.95 MB - Mountpunkt: / - Partitionstyp: ext4 - Partitiontabelle: None
RSD0003I --- /dev/mmcblk0p3 - Größe: 804.00 MB - Frei: NA - Mountpunkt: None - Partitionstyp: ext4 - Partitiontabelle: None
RSD0003I --- /dev/sda1 - Größe: 3.84 GB - Frei: 3.50 GB - Mountpunkt: /mnt - Partitionstyp: ext4 - Partitiontabelle: msdos
RSD0028I --- Partition /dev/mmcblk0p1 wird übersprungen - Partition ist auf der SD Karte
RSD0028I --- Partition /dev/mmcblk0p2 wird übersprungen - Partition ist auf der SD Karte
RSD0028I --- Partition /dev/mmcblk0p3 wird übersprungen - Partition ist auf der SD Karte
RSD0009I --- Ziel root Partitionskandidaten: /dev/sda1
RSD0011I --- Quell root Partition /dev/mmcblk0p2: Größe: 2.85 GB Typ: ext4
RSD0012I --- Partition /dev/sda1 wird getestet: Größe: 3.84 GB Freier Speicherplatz: 3.50 GB Typ: ext4
RSD0005I --- Folgende Partitionen sind mögliche neue Ziel root Partition
RSD0006I --- /dev/sda1
RSD0007I --- Partion eingeben: /dev/sda1
RSD0019I --- Partition /dev/mmcblk0p2 wird auf Partition /dev/sda1 kopiert und wird die neue root Partition
RSD0020I --- Bist Du sicher (j/N) ?
J
RSD0021I --- Rootpartition wir kopiert ... Bitte Geduld
tar: Removing leading `/' from member names
tar: Write checkpoint 1000
...
tar: Write checkpoint 236000
tar: proc: implausibly old time stamp 1970-01-01 01:00:00
RSD0022I --- /etc/fstab wird auf /dev/sda1 angepasst
RSD0023I --- /boot/cmdline.txt wird auf /dev/sda1 gesichert
RSD0024I --- /boot/cmdline.txt wird auf /dev/sda1 angepasst
RSD0025I --- Umzug von root Partition von /dev/mmcblk0p2 auf Partition /dev/sda1 beendet
Das Script wurde mit einer anderen schnelleren SD Karte, einem USB Stick und einer USB Platte getestet. Es löscht definitiv keine Daten und kopiert nur die aktuelle Datenpartition auf die neue Partition. Falls doch irgendwas schief laufen sollte kann man durch Zurückkopieren der gesicherten /boot/cmdline.txt.sd auf die /boot/cmdline.txt immer wieder die alte originale Datenpartition auf der SD Karte benutzen. Danach muss man nur die Zielpartition wieder löschen und hat den alten Originalzustand.
Trotzdem gilt natürlich der übliche Disclaimer dass man zur Sicherheit immer vor solch einer Umstellung ein Backup erstellen sollte um gegen Datenverlust gewappnet zu sein.
raspiSD2USB.py steht unter der GPL auf github zur allgemeinen Verfügung.