La imagen SD no cabe en la tarjeta SD

13

He tenido un pi configurado y funcionando bien por un tiempo (RPi - 1). Quería crear una imagen de RPi - 1 para poder cargar una copia exacta en mi segundo pi (RPi - 2). La tarjeta SD en RPi - 1 es de 4 GB (solo se usa aproximadamente la mitad) y la tarjeta SD en RPi - 2 también es de 4 GB. Utilizo Win32 Disk Imager para crear una copia de RPi - 1, con éxito. Luego formateé la tarjeta SD para RPi - 2 con SD Formatter 4.0 (en Windows 7). Sin embargo, cuando uso Win32 Disk Imager para escribir la imagen RPi - 1 en la tarjeta SD de RPi - 2 obtengo: "No hay suficiente espacio en el disco: Tamaño 7744512 Disponible: 7626752 sectores Tamaño del sector: 512"

Sé que no es una mala imagen porque puedo formatear la tarjeta SD para RPi - 1 y escribir la imagen sin problemas.

¿Que me estoy perdiendo aqui? ¿No son todas las tarjetas SD de 4GB del mismo tamaño o varían ligeramente? ¿Hay algo que deba hacer con una nueva tarjeta SD que me haya perdido?

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

Rob_IGS
fuente
2
NO hay dos tarjetas SD con el mismo tamaño, a menos que provengan del mismo fabricante, la misma marca y del mismo lote de producción. NO debe usar la imagen de la tarjeta SD con fines de copia de seguridad, sino copiar archivos .
lenik
¿Cuánto espacio dice su computadora en la tarjeta vacía?
Beta Decay

Respuestas:

6

De hecho, no todas las tarjetas SD tienen el mismo tamaño exacto. Tendría que reducir la partición para que encaje en la SD más pequeña. Tuve un problema similar yo mismo. Lo que hice fue tener una SD separada con (en mi caso) Raspbian. Y conecté mi SD que quería cambiar de tamaño, usando un lector de tarjetas USB.

Antes de que pueda reducir su partición de forma segura, debe asegurarse de que no haya datos presentes al final que está eliminando. Puede hacerlo con resize2fs -M -p /dev/sda2(debe sustituir / dev / sda2 con la ruta correcta al lector de tarjetas USB y la partición de Linux que desea cambiar de tamaño). Esto cambiará el tamaño del sistema de archivos al tamaño más pequeño posible. En realidad, podría especificar el tamaño exacto que desea, pero implica algunas matemáticas y convertir tamaños a bloques y sectores y lo que no. Más seguro y más fácil no hacer esto.

Después de eso puedes reducir la partición. Creo que solía hacer fdiskesto. Obtenga la posición de inicio exacta de la partición, elimínela y vuelva a crearla utilizando la misma posición de inicio, pero con un tamaño más pequeño.

Por último, debe agrandar el sistema de archivos nuevamente para ocupar toda la partición usando resize2fs -p /dev/sda2

Gerben
fuente
Solo quiero aclarar un poco esta respuesta ya que me resultó un poco difícil de seguir. Primero desmonté las particiones en la tarjeta SD. Luego tuve que ejecutar e2fsck -f /dev/mmcblk0p2(estoy reduciendo la segunda partición de mmcblk0) para verificar la consistencia. Luego se me permitió correr resize2fs -M -p /dev/mmcblk0p2como lo sugerí.
audiFanatic
1

Sería mejor hacer un tarball del sistema de archivos, porque cuando crea una imagen de disco completa, también copia datos eliminados. Cuando elimina un archivo, el inodo se desvincula pero los datos reales todavía están en el disco. Una imagen de disco completa usando ddcopiaría esos datos antiguos (excepto si primero los sobrescribe /dev/zero, lo que lleva algún tiempo) pero una copia de respaldo usando tarsolo copiaría los datos actuales.

O ... podría hacer lo que hacen muchas distribuciones: reduzca el tamaño de su sistema de archivos a algo seguro como 1.9 GiB antes de hacer su imagen, y cambie el tamaño para llenar el disco después de restaurar la copia de seguridad.

Advertencia: no estoy familiarizado con las herramientas de imágenes de Windows, soy un usuario de Linux.

Amedee Van Gasse
fuente
1

Si usa Linux, aquí hay un pequeño 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

crédito: Sirlagzmuuuy lo siento!)

Gilles Grandguillaume
fuente
44
¿sería tan amable de explicar lo que se supone que debe hacer este script? ¿Cómo puedo especificar el tamaño de imagen requerido, por telepatía?
lenik
el script reduce el tamaño de un img, toma el tamaño usado, agrega 200000 para finalizar (para el registro, etc.), después de un arranque con este img necesitas agrandar para ajustar el tamaño de la nueva tarjeta SD ...
Gilles Grandguillaume
Hola, escribí este script, así que no dudes en enviarme cualquier pregunta en mi blog: sirlagz.net : este script debe ejecutarse en Linux. El script reducirá el tamaño de la imagen al tamaño mínimo posible, más un poco de espacio flojo. Esto le permite colocar una imagen de 8 gb (de la cual solo se usa 1 gb) en una tarjeta de 1 gb.
Lawrence
debería usar "partstart = echo "$partinfo" | grep $fileSystemType | awk -F: ' { print substr($2,0,length($2) - 1) } '" para deshacerse de B en partstart.
netawater
@netawater tengo un resultado diferente para este comando con kubuntu / debian: sirlagz.net/2013/03/10/script-automatic-rpi-image-downsizer/… ... uso este script sin "-1" con éxito ! No entiendo.
Gilles Grandguillaume