Clonado y reducción de imágenes IMG de sistema

Lo primero que necesitamos es la imagen de sistema a reducir. Por ejemplo, podemos utilizar la imagen obtenida de una tarjeta SD que contenga un sistema Linux de Raspberry Pi. Para ello, con el comando dd realizaremos una imagen de la tarjeta:

user@linuxenandalu:$ sudo dd bs=4M if=/dev/sdX of=/ruta/imagen.img

  • bs: tamaño de bloques de información
  • if: dispositivo asociado a la SD introducida
  • of: archivo de salida

Para reducir el tamaño de la imagen creada, como GParted solo trabaja con dispositivos y no con ficheros, necesitamos crear un dispositivo de loopback que contenga nuestra imagen. Lo primero que haremos será habilitar los dispositivos loopback:

user@linuxenandalu:$ sudo modprobe loop

El siguiente paso es solicitar un dispositivo de loopback que esté libre:

user@linuxenandalu:$ sudo losetup -f

Esto devolverá una ruta con formato /dev/loopX, por lo que crearemos un dispositivo en esa ruta con la imagen que nos interesa de la siguiente manera:

user@linuxenandalu:$ sudo losetup /dev/loopX imagen.img

Solo nos queda cargar las particiones que forman nuestra imagen en el dispositivo de loopback para que GParted pueda gestionar estas particiones:

user@linuxenandalu:$ sudo partprobe /dev/loopX

A continuación abrimos el dispositivo virtual con GParted:

user@linuxenandalu:$ sudo gparted /dev/loopX

Aquí veremos que tenemos las particiones que ocupan la totalidad de la imagen, por lo que seleccionaremos la partición que tenga el mayor espacio libre y la redimensionaremos hasta el mínimo posible o hasta el tamaño que nos interese.

Aceptamos los cambios y desmontamos nuestra imagen del dispositivo de loopback:

user@linuxenandalu:$ sudo losetup -d /dev/loopX

Ya tenemos las particiones de nuestra imagen adaptadas a su espacio ocupado real, por lo que solo queda reducir el tamaño que ocupa el fichero .img, es decir, la imagen de la tarjeta SD.

Primero usaremos el comando fdisk -l para ver el número de bloques ocupados en la imagen y dónde empiezan los bloques que están sin ocupar.

user@linuxenandalu:$ sudo fdisk -l imagen.img

Esto nos devolverá bastante información acerca de la imagen, pero lo que nos interesa conocer a nosotros es la información que aparece en la tabla de particiones que aparecerá al final.

En esa tabla debemos buscar el valor más alto para el campo End, que nos indicará cuál es el último bloque de datos usado en la imagen, por lo que será el que nos servirá como límite a la hora de reducir el archivo.

Conociendo este último bloque, tendremos los siguientes datos:

  • Bloque frontera
  • Tamaño de cada sector = 512 Bytes

Sabiendo esto podemos reducir el tamaño de la imagen con el comando truncate:

user@linuxenandalu:$ truncate --size=$[(valor_de_End + 1)*512] imagen.img

Llegados a este punto ya tenemos la imagen que hemos realizado con su tamaño reducido. Tan solo nos quedará clonarla en una tarjeta SD para comprobar que funciona:

user@linuxenandalu:$ sudo dd bs=4M if=/ruta/imagen.img of=/dev/sdX

One comment

  1. Estupendo artículo. Me ha servido para reducir una imagen de raspbian que tenía y que no me cabían en dos tarjetas que tenía de menos de 8GB.

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *