L'immagine SD non si adatta alla scheda SD


13

Ho avuto un pi impostato e funzionante bene per un po '(RPi - 1). Volevo creare un'immagine di RPi - 1 in modo da poter caricare una copia esatta sul mio secondo pi (RPi - 2). La scheda SD in RPi - 1 è 4 GB (solo la metà viene effettivamente utilizzata) e anche la scheda SD in RPi - 2 è 4 GB. Uso Win32 Disk Imager per creare una copia di RPi - 1, con successo. Ho quindi formattato la scheda SD per RPi - 2 con SD Formatter 4.0 (su Windows 7). Tuttavia, quando utilizzo Win32 Disk Imager per scrivere l'immagine RPi - 1 su una scheda SD di RPi - 2, ottengo: "Spazio su disco insufficiente: Dimensione 7744512 Disponibile: 7626752 settori Dimensione settore: 512"

So che non è una cattiva immagine perché posso formattare la scheda SD per RPi - 1 e riscrivere l'immagine senza problemi.

Cosa mi sto perdendo qui? Tutte le schede SD da 4 GB non hanno le stesse dimensioni o variano leggermente? C'è qualcosa che devi fare su una nuovissima scheda SD che mi è sfuggita?

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


2
non ci sono due schede SD con le stesse dimensioni, a meno che non provengano dallo stesso produttore, dalla stessa marca e dallo stesso lotto di produzione. NON utilizzare l'immagine della scheda SD a scopo di backup, ma invece copiare i file .
Lenik,

Quanto spazio dice il tuo computer sulla scheda vuota?
Decadimento beta

Risposte:


6

In effetti non tutte le schede SD hanno le stesse dimensioni esatte. Dovresti ridurre la partizione per adattarla alla SD più piccola. Anch'io ho avuto un problema simile. Quello che ho fatto è stato avere una SD separata con (nel mio caso) Raspbian. E ho collegato la mia SD che volevo ridimensionare, usando un lettore di schede USB.

Prima di poter ridurre in modo sicuro la partizione, è necessario assicurarsi che non siano presenti dati alla fine che si sta rimuovendo. Puoi farlo con resize2fs -M -p /dev/sda2(devi sostituire / dev / sda2 con il percorso corretto al lettore di schede USB e alla partizione Linux che vuoi ridimensionare). Questo ridimensionerà il filesystem alla dimensione più piccola possibile. In realtà potresti specificare la dimensione esatta che desideri, ma implica un po 'di matematica e la conversione di dimensioni in blocchi e settori e cosa no. Più sicuro e più facile non farlo.

Dopodiché puoi ridurre la porzione. Penso di aver usato fdiskper questo. Ottieni la posizione iniziale esatta della partion, eliminala e ricreala utilizzando la stessa posizione iniziale, ma con dimensioni inferiori.

Infine è necessario ingrandire nuovamente il filesystem per occupare l'intera partizione usando resize2fs -p /dev/sda2


Voglio solo chiarire un po 'questa risposta, poiché l'ho trovata un po' difficile da seguire. Per prima cosa ho smontato le partizioni sulla scheda SD. Quindi ho dovuto correre e2fsck -f /dev/mmcblk0p2(sto restringendo la seconda partizione di mmcblk0) per verificare la coerenza. Poi mi è stato permesso di correre resize2fs -M -p /dev/mmcblk0p2come suggerito.
audiFanatic


1

Faresti meglio a creare un tarball del filesystem, perché quando crei un'immagine del disco completa, copi anche i dati eliminati. Quando si elimina un file, l'inode è scollegato ma i dati effettivi sono ancora sul disco. Un'immagine del disco completa usando ddcopia quei vecchi dati (tranne se li sovrascrivi per la prima volta /dev/zero, il che richiede del tempo) ma un backup usando tarcopia solo i dati correnti.

Oppure ... potresti fare come fanno molte distribuzioni: riduci le dimensioni del tuo filesystem a qualcosa di sicuro come 1,9 GiB prima di creare l'immagine e ridimensiona per riempire il disco dopo aver ripristinato il backup.

Avvertenza: non ho familiarità con gli strumenti di imaging di Windows, sono un utente Linux.


1

se usi linux, ecco un piccolo script:

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

credito: Sirlagz ( davvero dispiaciuto!)


4
saresti così gentile da spiegare cosa dovrebbe fare questo script? come posso specificare la dimensione dell'immagine richiesta, tramite telepatia?
lenik,

lo script ridimensiona un img, prende le dimensioni usate, aggiunge 200000 alla fine (per il registro ecc.), dopo un avvio con questo img è necessario ingrandire per adattarsi alle dimensioni della nuova scheda SD ...
Gilles Grandguillaume

Ciao, ho scritto questo script quindi sentiti libero di farmi qualsiasi domanda sul mio blog: sirlagz.net - Questo script deve essere eseguito su Linux. Lo script ridimensionerà l'immagine alla dimensione minima possibile, oltre a un po 'di spazio lento. Ciò consente di inserire un'immagine da 8 GB (di cui viene utilizzato solo 1 GB) su una scheda da 1 GB.
Lawrence,

dovrebbe usare "partstart = echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2) - 1) } '" per sbarazzarsi di B in partart.
netawater,

@netawater ho un risultato diverso per questo comando con kubuntu / debian: sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/… ... uso questo script senza "-1" con successo ! Non capisco.
Gilles Grandguillaume,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.