Ein fast jeder, der mit der Pi 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 Bootzeitpunkt notwendig und es wird nur die Bootpartition der SD Karte benötigt. Sämtliche Betriebssystemdaten wie Benutzerdaten, die root Partition, können auf einer beliebigen Partition liegen. Der folgende Artikel beschreibt was man dazu machen muss und verweist auch auf ein Script raspiSD2USB, welches diese Umkonfiguration und Datenkopiererei sehr schnell und einfach vornimmt.
 
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. Dieses kann eine Partieion eines USB Sticks oder auch eine Partition einer USB Platte sein.

Nach der Umstellung wird die existierende root Partition der SD Karte nicht mehr benutzt. Wichtig ist, dass zum Zeitpunkt der Umstellung nur eine weitere Platte bzw einen USB Stick an der Pi angeschlossen ist. 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/sdb1) unterscheiden und die Pi nicht die richtige Datenpartition findet und nicht bootet.
 
Sollen mehr als eine USB Platte an der Raspberry ständig laufen muss die PartitionsUUID als Kennung in der fstab und der cmdline.txt benutzt werden und die Zielplatte als Partitionstabelle eine GPT benutzen.

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/sdb und die Partition /dev/sdb1 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 anderen Rechner im lokalen Netz.

0) Erstellen eines Backups der SD Karte zur Sicherheit. Wer sich mit Linux auskennt und die Originale cmdline.txt wie unten beschrieben sichert kann immer schnell wieder auf die alte Einstellung zurückgehen.

1) Erstellen einer Partition auf einem USB Stick oder einer USB Platte.
sudo fdisk /dev/sdb
bzw
sudo gdisk /dev/sdb
wenn man mehrere Platten ander der Raspberry angeschlossen hat.

2) Formatieren der neuen Partition mit ext4. Das geht nur unter Linux auf der Pi.
sudo mkfs.ext4 /dev/sdb1
 
3) Kopieren der SD Karten Datenpartition auf die neue USB Partition.
sudo mount /dev/sdb1 /mnt
cd /
sudo tar cf - * | ( cd /mnt; tar xfp -)
 
4) Ändern der /mnt/etc/fstab auf der neuen USB Partition von

/dev/mmcblk0p1  /boot           vfat    defaults         0       0
/dev/mmcblk0p2  /               ext4    defaults,noatime 0       0


nach

/dev/mmcblk0p1  /boot           vfat    defaults         0       0
/dev/sdb1       /               ext4    defaults,noatime 0       0
 
bzw nach
 
/dev/mmcblk0p1  /boot           vfat    defaults         0       0
PARTUUID=7C32EB25-0462-429F-BF92-90FFD81FC8FE       /               ext4    defaults,noatime 0       0
 
Die PartitionsUUID bekommt man wie folgt heraus:
 
sudo sgdisk -i 1 /dev/sdb | grep unique | cut -d ' ' -f 4
 
Ändern mit
sudo nano /mnt/etc/fstab
 
5) Anlegen einer Sicherung der alten /boot/cmdline.txt
sudo cp /boot/cmdline.txt /boot/cmdline.txt.sd
 
Damit kann man jederzeit wieder die SD Datenpartition benutzen indem man die gesicherte Datei wieder auf die
Originaldatei kopiert.
sudo cp /boot/cmdline.txt.sd /boot/cmdline.txt

6) Ändern in der der Datei /boot/cmdline.txt den Teil mit root=/dev/mmcblk0p2 nach root=/dev/sda1

Beispiel

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/sdb1 rootfstype=ext4 noatime quiet rootwait loglevel=1 zram.num_devices=2
bzw nach
dwc_otg.lpm_enable=0 root=PARTUUID=7C32EB25-0462-429F-BF92-90FFD81FC8FE rootfstype=ext4 noatime quiet rootwait loglevel=1 zram.num_devices=2

Ändern mit
sudo nano /boot/cmdline.txt

Alternativ kann man raspiSD2USB, ein von mir erstelltes Script runterladen, auf die Pi kopieren und dann nachdem das oder die weiteren USB Geräte angeschlossen wurden, ausführen. Es nimmt alle oben beschriebenen Schritte automatisch vor. Dabei ist zu berücksichtigen, dass im Falle von mehr als einer angeschlossenen USB Platte die Ziel USB Platte für das Rootfilesystem ein GPT haben muss. Bei einer Platte reicht ein MBR.
 
raspiSD2USB.py steht unter der GPL auf dieser Seite zur allgemeinen Verfügung.

Ein Beispieldurchlauf sieht z.B. wie folgt aus:
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 raspiSD2USB 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/cmndline.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 dass man zur Sicherheit immer vor solch einer Umstellung ein Backup machen sollte.

Links

Kommentar schreiben
Hinweis:
Die eMail ist versteckt und nicht öffentlich sichtbar. Sie wird benutzt um über neue Kommentare zu informieren.