Cómo reducir el tamaño de una imagen tomada de un sd

A veces tienes instalado en una SD o microSD un Linux.

Por ejemplo raspbian o raspberry os, o armbian. Y quieres guardar una imagen de esa instalación.

La insertamos en nuestra laptop con Linux y, supongamos que ve a la microSD de 16GB de almacenamiento, con tu raspbian instalado como /dev/sda

Procedemos a desmontar las particiones que seguramente nuestro Linux montó automáticamente:

umount /dev/sda1 (y ejecutamos lo mismo para sda2, sda3, etc)

Entonces haces:

dd if=/dev/sda of=raspbian.img bs=4M

y te queda una bella imagen “raspbian.img” del tamaño de la SD (16GB en mi caso hipotético).

Lo más seguro es que de esos 16GB, al menos 12 o 13 estén vacíos. Por gusto tenemos horrendo archivote!. Si pudiéramos recortar ese espacio que está de más.

Porque además, supón que mañana quieres copiar la misma imagen a una SD más pequeña, de 4GB… 16GB no caben en una SD de 4GB. Pero si tuviéramos una imagen de, digamos 3GB, esta cabría en una SD de 4GB, de 8GB, etc.

Lo que podemos hacer es un peque proceso, a mi forma, para cortar, quitar, todo ese pedazo que nos sobra.

Para ello, con la SD desmontada ejecuto:

sudo udisksctl loop-setup -f raspbian.img

Este paso anterior nos crea un loop0 al que podremos manipular:

sudo gparted /dev/loop0

Me mostrará algo así:

Como vemos, el espacio usado en la última partición (que es la única en mi caso) es el de amarillo, el resto, 12.37GiB están vacíos.

Procedo a redimensionar

Como puedes ver, escojo dejar un poco de espacio libre (en blanco), el tamaño nuevo de la partición me queda en mi caso en 2978MiB. Me quedará un gran pedazo de espacio al final libre (12212 en mi caso):

Y ahora aplico los cambios, este proceso demorará un poquito, de acuerdo a cuán rápida sea la SD:

Ahora, a este mismo loop (/dev/loop0 en mi caso) procedo a validar cuál es el último sector usado:

Ok, en mi caso, la SD tiene 31116288 sectores en total (ver arriba a la derecha) y la última partición va hasta el sector debajo de “Final”: 6107135

Puedo entonces truncar desde el 6107136 en adelante. Se suma 1 a 6107135 porque el conteo de sectores comienza en 0.

Primero borro el loop:

sudo losetup -d /dev/loop0

Y ahora trunco la imagen:

truncate --size=$[(6107135+1)*512] armbian-radio.img

La imagen resultante va a ser de aproximadamente el valor al que redimensionaste en gparted. En mi caso me quedó de 3GB.

Verificando el proceso

Ahora puedo escribir la imagen hacia otra flash. Y hasta será muy rápido el proceso pues en mi caso son 3GB a escribir y no 16!

sudo dd if=raspbian.img of=/dev/sda bs=4M
745+1 registros leídos
745+1 registros escritos
3126853632 bytes (3,1 GB, 2,9 GiB) copied, 230,285 s, 13,6 MB/s

Voló!

Y saco y vuelvo a insertar mi SD y mira:

Efectivamente reporta unos 3GB! Con un poquito de espacio libre.

Si quisiera, puedo redimensionar la partición a los 16GB de mi SD:

sudo umount /dev/sda1

sudo gparted /dev/sda

A veces mejor dejarle libre unos 8MB al final.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.