23.9k Aufrufe
Gefragt in Linux von computerschrat Profi (32.2k Punkte)
Hallo zusammen,

ich habe den Inhalt einer 16GB SD Karte meines Raspberry Pi mit dem Win32DiskImager gelesen und als .img Datei abgelegt. Beim Versuch, dieses Image auf eine andere ebenfalls 16GB SD-Karte zu spielen, bekomme ich die Fehlermeldung, dass die Karte zu klein ist. Es fehlen ihr einige wenige Sektoren.

Welche Möglichkeiten habe ich, das Image zu verkleinern (oder beim Lesen gleich kleiner abzuspeichern), dass es auf die "kleinere" Karte passt? Freier Speicherplatz ist in der Quell-Karte beliebig viel, der DiskImager liest aber leider die ganze Karte ohne Rücksicht auf Inhalte.

Zur Verfügung hätte ich neben einem laufenden Windows8 ein virtuelles Ubuntu, mit dem ich auch auf den SD-Kartenleser zugreifen kann, sowie natürlich auch den Raspberry unter Rasbian.

Für gute Tipps wäre ich sehr dankbar.

Gruß
computerschrat

16 Antworten

0 Punkte
Beantwortet von
Versteh ich nicht: Wenn Win32DiskImager das Image von der Card erstellt hat, sollte Win32DiskImager dasselbe Image auch auf eine gleich große Card wieder aufspielen können.

Vlt. hat der Cardreader einen Bock?
0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)
Hallo K-1,

so hatte ich mir das auch gedacht
Leider sind aber zwei Karten mit 16GB nicht identisch gleich groß, sondern unterscheiden sich um ein paar MB. Die Quell SD-Karte hat nach dem Formatieren 14,83GB, die Ziel Karte leider nur 14,72GB. Genutzt sind auf der Quelle nur knapp 2GB.
Wenn ich nun von aber der Quelle ein Image ziehe ist das genau so groß, wie eben die Karte ist und damit passt es um ein paar MG nicht in das Ziel hinein.
Darum suche ich einen Weg das Image zu verkleinern. Andernfalls müsste ich den gesamten Prozess der Einrichtung des Systems neu machen und das wollte ich vermeiden.

Gruß
computerschrat
0 Punkte
Beantwortet von halfstone Profi (18.1k Punkte)
Hi computerschrat,

versuche es doch mal mit GParted unter Linux, das sollte fähig sein die Partitionen auf deiner Ziel SD Karte der Größe der Karte anzupassen.

Das können aber eigentlich die meisten Imagingprogramme, vielleicht hast du die Option bei Win32DiskImager übersehen.

Gruß Fabian
0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)
Hallo Fabian,

ich habe bisher leider keine Optionen im Win32DisImager gesehen (außer der md5 Option).

Den Versuch mit GParted hatte ich schon gemacht. Auf der Quelle befinden sich jetzt zwei Partitionen mit echten Daten, die zusammen wesentlich kleiner sind als die 16GB und noch ein nicht zugeordneter Bereich. Leider macht der Imager aber eine bitweise Kopie und kümmert sich nicht darum, ob hier Daten oder nichts liegt und damit wird das Image auch einer fabrikneuen leeren Karte genau so groß.

Gibt es vielleicht ein anderes Programm, mit dem ich ein Image nur von den genutzten Partitionen ziehen kann?

Gruß
computerschrat
0 Punkte
Beantwortet von ennok Experte (1.2k Punkte)
Das ist ein Linux! :)

Erstelle unter Ubuntu auf der neuen Karte die Partitionen entsprechend der alten Karte und kopiere die Dateien mittels

cp -ax <quelle> <ziel>

Zum Schluss noch den Bootloader drauf, fertig.
0 Punkte
Beantwortet von halfstone Profi (18.1k Punkte)
Hi Computerschrat,

also soweit ich mich an Gparted erinnere kann man a einfach Partitionen kopieren.

Laut unserer Anleitung zum Umzug auf SSD mit Gprarted geht es doch genau so. Wenn deine beiden "richtigen" Partitionen gerade nicht die ganze SD Karte ausfüllen sollte es so ganz einfach sein. Dann noch das Problem mit dem Bootmanager lösen und gut ist.

Ich hätte da noch eine Holzhammermethode. Du könntest auch mit dd unter Linux alles von der SD Karte in eine Datei schreiben und dann per dd wieder auf die neue Karte und Daumen drücken, dass alle Daten am Anfang liegen und die paar Sektoren am Ende, die fehlen keine Auswirkungen haben.

Gruß Fabian
0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)
Hallo EnnoK,

danke für den Tip. Jetzt habe ich mit cp ein Problem, das ich als Linux Einteiger noch nicht interpretieren kann.
Wenn ich den Befehl eingebe als cp -ax /dev/mmcblk0 /dev/sda
bekomme ich als normaler Benutzer die Meldung, dass ich keine Zugriffsrechte für /dev/sda hätte.
gebe ich den Befehl als root, passiert einfach gar nichts. Keine Meldung und leider auch keine Kopieraktivität.
Was mache ich da noch falsch?

Gruß
computerschrat
0 Punkte
Beantwortet von ennok Experte (1.2k Punkte)
Ne, du musst wirklich auf Dateisystemebene arbeiten. Also beide Dateisysteme mounten.

Da ich gerade nicht rausfinde, mit welchem Dateisystem Rasbian arbeitet, sag mal, was
sudo file -s /dev/mmcblk0

ausgibt.
0 Punkte
Beantwortet von halfstone Profi (18.1k Punkte)
Dann erkläre ich mal meine Holzhammermethode etwas besser:

Der Linux Befehl dd kopiert sektorweise alles was da ist irgendwohin.

Man kann also in deinem Fall den Befehl so nutzen:

dd if=/dev/mmcblk0 of=sdcardimage.img also alles auf der Karte in eine Datei namens sdcardimage.img schreiben.

Dann die Karten tauschen und den Befehl andersrum benutzen:

dd if=sdcardimage.img of=/dev/mmcblk0 und damit die Kopie sdcardimage.img auf die neue Karte schreiben.

Ich habs jetzt so nicht getestet aber if bedeutet Input file und of eben output file.

dd interessiert auch nicht, dass deine zweite Karte etwas kleiner ist (sollte es zumindest nicht).

dd kopiert auch alle anderen Sachen wie Partitionen, aktive Partitionen, Bootsectoren...

Und wenn wichtige Informationen nicht an das Ende (wo immer das bei einem speicherchipbasierten Speicher sein soll) geschrieben werden sollten, sollte es so funktionieren.

dd wird auch gerne empfohlen wenn es darum geht für forensische Zwecke ein Image einer soft-defekten Platte zu machen bevor man mit irgendwelchen Rettungstools drauf los geht.

Wenn was von wegen Berechtigungen kommt musst du auch das sudo davor schreiben (SuperUser do), also als Administrator/Root ausführen.

Gruß Fabian
0 Punkte
Beantwortet von computerschrat Profi (32.2k Punkte)
Hallo,

erstmal danke euch beiden für die Unterstützung.
@EnnoK
Rasbiab ist eine Debian-Variante.
Die ANtwort auf sudo file -s /dev/mmcblk0 ist etwas länglich:
/dev/mmcblk0: sticky x86 boot sector;
partition 1: ID=0xc, starthead 130, startsector 8192, 114688 sectors;
partition 2: ID=0x83, starthead 0, startsector 12299, 30993408 sectors,
code offset 0xb8

@Fabian,
Die Methode mit dd werde ich jetzt gleich mal testen, ich muss nur noch mehr Speicher "organisieren". Mein virtuelles Linux hat nur 8GB Speicher und da wird es mit dem Image auf der virtuellen Platte noch etwas eng. aber das bekomme ich noch gebacken.

Gruß
computerschrat
...