Obraz SD nie mieści się na karcie SD

13

Przez pewien czas miałem jedną konfigurację pi i działałem dobrze (RPi - 1). Chciałem stworzyć obraz RPi - 1, aby móc załadować dokładną kopię na moim drugim pi (RPi - 2). Karta SD w RPi - 1 ma 4 GB (faktycznie używana jest tylko około połowa), a karta SD w RPi - 2 ma również 4 GB. Korzystam z Win32 Disk Imager, aby pomyślnie utworzyć kopię RPi - 1. Następnie sformatowałem kartę SD dla RPi - 2 za pomocą SD Formatter 4.0 (w Windows 7). Jednak kiedy używam Win32 Disk Imager do zapisywania obrazu RPi-1 na karcie SD RPi-2, otrzymuję: „Za mało miejsca na dysku: Rozmiar 7744512 Dostępne: 7626752 sektory Rozmiar sektora: 512”

Wiem, że to niezły obraz, ponieważ mogę sformatować kartę SD dla RPi - 1 i bez problemu zapisać obraz z powrotem.

Czego tu brakuje? Czy wszystkie karty SD 4 GB nie mają tego samego rozmiaru, czy różnią się nieznacznie? Czy jest coś, co musisz zrobić z nową kartą SD, którą przegapiłem?

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

Rob_IGS
źródło
2
NIE ma dwóch kart SD o tym samym rozmiarze, chyba że pochodzą od tego samego producenta, tej samej marki i tej samej partii produkcyjnej. NIE powinieneś używać obrazu karty SD do tworzenia kopii zapasowych, ale zamiast tego kopiuj pliki .
lenik
Ile miejsca zajmuje Twój komputer na pustej karcie?
Beta Decay

Odpowiedzi:

6

Rzeczywiście nie wszystkie karty SD mają ten sam dokładny rozmiar. Trzeba by zmniejszyć partycję, aby zmieściła się na mniejszej karcie SD. Sam miałem podobny problem. To, co zrobiłem, miało osobne SD z (w moim przypadku) Raspbian. Podłączyłem kartę SD i chciałem zmienić jej rozmiar, używając czytnika kart USB.

Aby móc bezpiecznie zmniejszyć partycję, musisz upewnić się, że na końcu, który usuwasz, nie ma żadnych danych. Możesz to zrobić za pomocą resize2fs -M -p /dev/sda2(musisz zastąpić / dev / sda2 poprawną ścieżką do czytnika kart USB i partycji linux, której rozmiar chcesz zmienić). Spowoduje to zmianę rozmiaru systemu plików do najmniejszego możliwego rozmiaru. Możesz faktycznie określić dokładny rozmiar, który chcesz, ale wymaga to pewnej matematyki i konwersji rozmiarów do bloków i sektorów, a co nie. Bezpieczniej i łatwiej tego nie robić.

Następnie możesz zmniejszyć partycję. Myślę, że użyłem fdiskdo tego. Uzyskaj dokładną pozycję początkową partycji, usuń ją i utwórz ponownie, używając tej samej pozycji początkowej, ale o mniejszym rozmiarze.

Na koniec musisz ponownie powiększyć system plików, aby zająć całą partycję resize2fs -p /dev/sda2

Gerben
źródło
Chcę tylko trochę wyjaśnić tę odpowiedź, ponieważ uważam, że jest to trochę trudne do naśladowania. Najpierw odmontowałem partycje na karcie SD. Następnie musiałem uruchomić e2fsck -f /dev/mmcblk0p2(zmniejszam drugą partycję mmcblk0), aby sprawdzić spójność. Potem pozwolono mi biec resize2fs -M -p /dev/mmcblk0p2zgodnie z sugestią.
audiFanatic
1

Lepiej byłoby zrobić archiwum systemu plików, ponieważ kiedy tworzysz pełny obraz dysku, kopiujesz również usunięte dane. Po usunięciu pliku i-węzeł jest rozłączany, ale rzeczywiste dane są nadal na dysku. Użycie pełnego obrazu dysku ddspowoduje skopiowanie starych danych (z wyjątkiem sytuacji, gdy najpierw je zastąpisz /dev/zero, co zajmuje trochę czasu), ale użycie kopii zapasowej tarspowoduje skopiowanie tylko bieżących danych.

Lub ... możesz zrobić tak, jak robi to wiele dystrybucji: zmniejsz rozmiar systemu plików do czegoś bezpiecznego, takiego jak 1,9 GiB, zanim utworzysz obraz, i zmień rozmiar, aby wypełnić dysk po przywróceniu kopii zapasowej.

Zastrzeżenie: nie znam narzędzi do obrazowania w systemie Windows, jestem użytkownikiem systemu Linux.

Amedee Van Gasse
źródło
1

jeśli używasz linux, tutaj mały skrypt:

#!/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

kredyt: Sirlagz (bardzo przepraszam!)

Gilles Grandguillaume
źródło
4
czy byłbyś uprzejmy wyjaśnić, co ten skrypt ma zrobić? jak mogę określić wymagany rozmiar obrazu telepatią?
lenik
skrypt zmniejsza rozmiar obrazu, bierze użyty rozmiar, dodaje 200000 na końcu (dla dziennika itp.), po uruchomieniu z tym obrazem musisz powiększyć, aby dopasować rozmiar nowej karty SD ...
Gilles Grandguillaume
Cześć, napisałem ten skrypt, więc nie krępuj się i zadaj mi jakiekolwiek pytania na moim blogu: sirlagz.net - Ten skrypt musi być uruchomiony w systemie Linux. Skrypt zmniejszy rozmiar obrazu do minimalnego możliwego rozmiaru plus odrobinę luzu. Umożliwia to umieszczenie obrazu o pojemności 8 GB (z którego używany jest tylko 1 GB) na karcie 1 GB.
Lawrence
powinien użyć „partstart = echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2) - 1) } '”, aby pozbyć się B w partstart.
woda netto
@netawater Mam inny wynik dla tego polecenia z kubuntu / debian: sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/ ... ... z powodzeniem używam tego skryptu bez „-1” ! Nie rozumiem.
Gilles Grandguillaume