Das SD-Bild passt nicht auf die SD-Karte


13

Ich habe ein Pi eingerichtet und läuft seit einer Weile gut (RPi-1). Ich wollte ein Image von RPi-1 erstellen, damit ich eine exakte Kopie auf mein 2. Pi (RPi-2) laden kann. Die SD-Karte in RPi-1 hat eine Kapazität von 4 GB (tatsächlich wird nur etwa die Hälfte verwendet), und die SD-Karte in RPi-2 hat ebenfalls eine Kapazität von 4 GB. Ich verwende Win32 Disk Imager, um eine Kopie von RPi-1 erfolgreich zu erstellen. Ich habe dann die SD-Karte für RPi-2 mit SD Formatter 4.0 (unter Windows 7) formatiert. Wenn ich jedoch Win32 Disk Imager verwende, um das RPi-1-Image auf die SD-Karte von RPi-2 zu schreiben, wird Folgendes angezeigt: "Nicht genügend Speicherplatz auf der Festplatte: Größe 7744512 Verfügbar: 7626752 Sektoren Sektorgröße: 512"

Ich weiß, dass es kein schlechtes Image ist, da ich die SD-Karte für RPi-1 formatieren und das Image problemlos zurückschreiben kann.

Was vermisse ich hier? Sind nicht alle 4 GB SD-Karten gleich groß oder variieren sie geringfügig? Was müssen Sie mit einer brandneuen SD-Karte tun, die ich verpasst habe?

(RPi - 1 SD-Karte = Sandisk 4 GB // RPi - 2 SD-Karte = Kingston 4 GB)


2
Es gibt KEINE zwei SD-Karten mit der gleichen Größe, es sei denn, sie stammen vom gleichen Hersteller, der gleichen Marke und aus der gleichen Produktionscharge. Sie sollten das SD-Karten-Image NICHT für Sicherungszwecke verwenden, sondern stattdessen Dateien kopieren .
Lenik

Wie viel Speicherplatz befindet sich laut Computer auf der leeren Karte?
Betazerfall

Antworten:


6

In der Tat sind nicht alle SD-Karten gleich groß. Sie müssten die Partition verkleinern, damit sie auf die kleinere SD passt. Ich hatte selbst ein ähnliches Problem. Ich hatte eine separate SD mit (in meinem Fall) Raspbian. Und ich habe meine SD-Karte, deren Größe ich ändern wollte, über einen USB-Kartenleser angeschlossen.

Bevor Sie Ihre Partition sicher verkleinern können, müssen Sie sicherstellen, dass am Ende des Entfernens keine Daten vorhanden sind. Sie können dies mit resize2fs -M -p /dev/sda2(Sie müssen / dev / sda2 durch den richtigen Pfad zum USB-Kartenleser und der Linux-Partition ersetzen, deren Größe Sie ändern möchten). Dadurch wird das Dateisystem auf die kleinstmögliche Größe verkleinert. Sie könnten tatsächlich die exakte Größe angeben, die Sie möchten, aber es erfordert einige Berechnungen und das Konvertieren von Größen in Blockgrößen und Sektoren und was nicht. Sicherer und einfacher, dies nicht zu tun.

Danach können Sie die Partition verkleinern. Ich glaube, ich habe das benutzt fdisk. Holen Sie sich die genaue Startposition der Partition, löschen Sie sie und erstellen Sie sie mit der gleichen Startposition, aber mit einer kleineren Größe.

Zuletzt müssen Sie das Dateisystem erneut vergrößern, um die gesamte Partition mit zu belegen resize2fs -p /dev/sda2


Ich möchte diese Antwort nur ein wenig klarstellen, da es mir ein bisschen schwer gefallen ist, ihr zu folgen. Ich habe zuerst die Partitionen auf der SD-Karte ausgehängt. Dann musste ich ausführen e2fsck -f /dev/mmcblk0p2(ich verkleinere die zweite Partition von mmcblk0), um die Konsistenz zu überprüfen. Dann durfte ich resize2fs -M -p /dev/mmcblk0p2wie vorgeschlagen rennen .
AudiFanatic


1

Es ist besser, ein Tarball des Dateisystems zu erstellen, denn wenn Sie ein vollständiges Festplatten-Image erstellen, kopieren Sie auch gelöschte Daten. Wenn Sie eine Datei löschen, wird die Verknüpfung zum Inode aufgehoben, die eigentlichen Daten befinden sich jedoch noch auf der Festplatte. Bei Verwendung eines vollständigen Datenträgerabbilds werden dddie alten Daten kopiert (es sei denn, Sie überschreiben sie zum ersten /dev/zeroMal mit , was einige Zeit in Anspruch nimmt), bei Verwendung eines Backups werden tarjedoch nur die aktuellen Daten kopiert.

Oder ... Sie können wie bei vielen anderen Distributionen vorgehen: Reduzieren Sie die Größe Ihres Dateisystems auf ungefähr 1,9 GiB, bevor Sie ein Image erstellen, und ändern Sie die Größe, um die Festplatte nach dem Wiederherstellen des Backups zu füllen.

Vorsichtsmaßnahme: Ich bin nicht mit Windows-Imaging-Tools vertraut, sondern ein Linux-Benutzer.


1

Wenn Sie Linux verwenden, hier ein kleines Skript:

#!/bin/bash
# Automatic Image file resizer
# Written by SirLagz
strImgFile=$1

export PATH=$PATH:/sbin

if [[ ! $(whoami) =~ "root" ]]; then
echo ""
echo "**********************************"
echo "*** This should be run as root ***"
echo "**********************************"
echo ""
exit
fi

if [[ -z $1 ]]; then
echo "Usage: ./autosizer.sh <Image File>"
exit
fi

if [[ ! -e $1 || ! $(file $1) =~ "x86" ]]; then
echo "Error : Not an image file, or file doesn't exist"
exit
fi

partinfo=`parted -ms $1 unit B p | awk '{if (NR!=2) {print}}'`  
fileSystemType=`echo "$partinfo" | grep -o 'ext4\|ext3'`
numberOfMatchPart=`echo "$fileSystemType" | wc -l`

if [[ $fileSystemType == "" || $numberOfMatchPart -eq 0 || $numberOfMatchPart -gt 1 ]] ; then
echo "Error : Your partition layout is not currently supported by this tool."
exit
fi

partnumber=`echo "$partinfo" | grep $fileSystemType | awk -F: ' { print $1 } '`
partstart=`echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2)) } '`
loopback=`losetup -f --show -o $partstart $1`

e2fsck -f $loopback

minsize=`resize2fs -P $loopback | awk -F': ' ' { print $2 } '`
minsize=`echo $minsize+200000 | bc`

resize2fs -p $loopback $minsize
sleep 1
losetup -d $loopback

partnewsize=`echo "$minsize * 4096" | bc`
newpartend=`echo "$partstart + $partnewsize" | bc`

parted $1 rm $partnumber
parted $1 unit B mkpart primary $partstart $newpartend
endresult=`parted -m $1 unit B print free | tail -1 | awk -F: ' { print substr($2,0,length($2)) } '`
truncate -s $endresult $1

Kredit: Sirlagz (soooo Entschuldigung!)


4
Würden Sie so freundlich erklären, was dieses Skript tun soll? Wie kann ich die gewünschte Bildgröße durch Telepathie angeben?
Lenik

Das Skript verkleinert ein Bild, nimmt die verwendete Größe, fügt 200000 zum Ende hinzu (für Protokoll usw.). Nach einem Start mit diesem Bild muss die Größe der neuen SD-Karte
angepasst werden

Hallo, ich habe dieses Skript geschrieben, also zögern Sie nicht, mir Fragen in meinem Blog zu stellen: sirlagz.net - Dieses Skript muss unter Linux ausgeführt werden. Das Skript verkleinert das Bild auf die kleinstmögliche Größe plus ein wenig Platz. Auf diese Weise können Sie ein 8-GB-Bild (von dem nur 1 GB verwendet wird) auf eine 1-GB-Karte kopieren.
Lawrence

Es sollte "partstart = echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2) - 1) } '" verwenden, um B in partstart zu entfernen.
Netawater

@netawater Ich habe ein anderes Ergebnis für diesen Befehl mit Kubuntu / Debian: sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/ ... Ich benutze dieses Skript ohne "-1" mit Erfolg ! ich verstehe nicht
Gilles Grandguillaume
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.