Saltar al contenido

“Cambie el tamaño” del .img para una tarjeta SD más pequeña. Cómo encoger una imagen de tarjeta SD de arranque

Solución:

Este artículo ofrece una solución que resuelve mi problema. Es bastante similar al otro, pero explica mejor cómo calcular y qué significado tienen los números y las particiones.

La información clave fue el uso del comando truncate. Siguiendo la solución completa para no perder la respuesta.

Un paso preliminar consiste en clonar la tarjeta SD en tu PC:

  1. usar lsblk para ver qué dispositivos están disponibles y si sus particiones están montadas

  2. desmonte todas las particiones del dispositivo que desea copiar en su PC. Por ejemplo:

    umount /dev/sdc1
    umount /dev/sdc2
    
  3. cree una copia de toda la tarjeta sd con todas las particiones desmontadas

    dd if=/dev/sdc of=/path/to/file/myimage.img
    

Reducción de imágenes en Linux

Contexto del problema:

Teniendo un myimage.img más grande que el soporte de hardware (si es más pequeño no debería haber ningún problema; sin embargo, usando la misma estrategia, puede ajustar mejor la imagen en el soporte de hardware).

El secreto es utilizar herramientas e instrumentos estándar de Linux: GParted, fdisk y truncate.

Requisitos:

  • Una PC con Linux
  • los .img quieres encogermyimage.img en este ejemplo)

Creando dispositivo de loopback:

GParted es una aplicación que se usa normalmente para administrar tablas de particiones y sistemas de archivos. Con el fin de encogerse la imagen, GParted se utilizará en la primera parte de la respuesta.

GParted opera en dispositivos, no en archivos simples como imágenes. Es por eso que primero necesitamos crear un dispositivo para la imagen. Hacemos esto usando la funcionalidad loopback de Linux.

Habilitemos habilitar el loopback:

sudo modprobe loop

Solicitemos un nuevo dispositivo de loopback (gratuito):

sudo losetup -f

El comando devuelve la ruta a un dispositivo de loopback libre:

/dev/loop0

Creemos un dispositivo de la imagen:

sudo losetup /dev/loop0 myimage.img

El dispositivo /dev/loop0 representa myimage.img. Queremos acceder a las particiones que están en la imagen, por lo que debemos pedirle al kernel que las cargue también:

sudo partprobe /dev/loop0

Esto debería darnos el dispositivo /dev/loop0p1, que representa la primera partición en myimage.img. No necesitamos este dispositivo directamente, pero GParted lo requiere.

Cambiar el tamaño de la partición usando GParted:

Carguemos el nuevo dispositivo usando GParted:

sudo gparted /dev/loop0

Cuando se abre la aplicación GParted, debería aparecer una ventana similar a la siguiente:

captura de pantalla

Ahora observe algunas cosas:

  • Hay una partición.
  • La partición asigna todo el disco / dispositivo / imagen.
  • La partición se llena parcialmente.

Queremos cambiar el tamaño de esta partición para que se ajuste a su contenido, pero no más que eso.

Seleccione la partición y haga clic en Cambiar tamaño / Mover. Aparecerá una ventana similar a la siguiente:

captura de pantalla del diálogo

Arrastre la barra derecha hacia la izquierda tanto como sea posible.

Tenga en cuenta que a veces GParted necesitará unos MB extra para colocar algunos datos relacionados con el sistema de archivos. Puede presionar la flecha hacia arriba en el cuadro Nuevo tamaño varias veces para hacerlo. Por ejemplo, lo presioné 10 veces (= 10MiB) para que FAT32 funcione. Para NTFS, es posible que no lo necesite en absoluto.

Finalmente presione Cambiar tamaño / Mover. Volverá a la ventana de GParted. Esta vez tendrá un aspecto similar al siguiente:

espacio no asignado a la derecha

Observe que hay una parte del disco sin asignar. Esta parte del disco no será utilizada por la partición, por lo que podemos recortar esta parte de la imagen más adelante. GParted es una herramienta para discos, por lo que no encoge imágenes, solo particiones, tenemos que hacer el encogimiento de la imagen nosotros mismos.

prensa Solicitar en GParted. Ahora moverá archivos y finalmente reducirá la partición, por lo que puede tardar uno o dos minutos, pero la mayoría de las veces termina rápidamente. Luego cierre GParted.

Ahora ya no necesitamos el dispositivo loopback, así que descárgalo:

sudo losetup -d /dev/loop0

Afeitar la imagen:

Ahora que tenemos todos los datos importantes al principio de la imagen, es hora de eliminar esa parte no asignada. Primero necesitaremos saber dónde termina nuestra partición y dónde comienza la parte no asignada. Hacemos esto usando fdisk:

fdisk -l myimage.img

Aquí veremos una salida similar a la siguiente:

Disk myimage.img: 6144 MB, 6144000000 bytes, 12000000 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000ea37d

      Device Boot      Start         End      Blocks   Id  System
myimage.img1            2048     9181183     4589568    b  W95 FAT32

Tenga en cuenta dos cosas en la salida:

  • La partición termina en el bloque 9181183 (mostrado debajo End)
  • El tamaño del bloque es de 512 bytes (mostrado como sectores de 1 * 512)

Usaremos estos números en el resto del ejemplo. El tamaño del bloque (512) suele ser el mismo, pero el bloque final (9181183) será diferente para usted. Los números significan que la partición termina en el byte 9181183 * 512 del archivo. Después de ese byte viene la parte no asignada. Solo los primeros 9181183 * 512 bytes serán útiles para nuestra imagen.

A continuación, reducimos el archivo de imagen a un tamaño que solo puede contener la partición. Para esto usaremos el truncate comando (¡gracias uggla!). Con el comando truncar es necesario proporcionar el tamaño del archivo en bytes. El último bloque fue 9181183 y los números de bloque comienzan en 0. Eso significa que necesitamos (9181183 + 1) * 512 bytes. Esto es importante, de lo contrario, la partición no se ajustará a la imagen. Entonces ahora usamos truncar con los cálculos:

truncate --size=$[(9181183+1)*512] myimage.img

resize2fs también se puede utilizar para cambiar el tamaño.

sudo resize2fs -fp SD.img 4G

¡También cambia el tamaño del archivo!

Puedes hacer uso de las opciones bs y count en el dd-comando para limitar el tamaño del archivo de salida.

Ejemplo:

dd if=sdx of=SD.img bs=1G count=4

daría como resultado un archivo de salida con un tamaño de 4 GiB.

Echa un vistazo profundo a man dd.

Necesitaría saber cuántos bytes tiene que copiar para que todas las particiones estén completamente cubiertas, así que eche un vistazo con sudo fdisk -l /dev/sdx qué sector es el último que necesita.

Las particiones deben estar al comienzo del disco (como en la imagen que proporcionó).

Los discos con msdos-partition-table se pueden clonar fácilmente de esta manera, pero si el disco usa GPT y se va a clonar en un disco con un tamaño diferente, el MBR protector debe adaptarse a las contraseñas y la copia de seguridad GPT que reside en el mismo el final del disco necesita ser recreado, esto se puede hacer con gdisk.


De tu fdisk-salida puede ver que el último sector de la última partición es sector 8595455, eso significa que debe copiar al menos 8595455 + 1 sectores (el primer sector es 0). Con un tamaño de sector de 512 bytes, esto equivale a 4.400.873.472 bytes. bs multiplicado por count tiene que ser mayor o igual que esto.

Tal vez esto sea demasiado grande para una memoria USB de 4 GB, aún puede reducir el tamaño de sdc2, hay mucho espacio sin usar en él.

Para el ejemplo actual que proporcionó,

 dd if=/dev/sdc of=SD.img bs=10M count=420

cubrirá la tabla de partición, sdc1 y sdc2. Calcular:

10*1024*1024*420 = 4,404,019,200 > 4,400,873,472
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

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