Imagen de una tarjeta de 16 Gb que contiene espacio no particionado al final: ¿Truncamiento posible?

18

Quería preparar una distribución para algunos amigos.
Como no tenía nada más por ahí, utilicé una tarjeta SD de 16 Gb.

Comencé con la imagen predeterminada de Debian Weezy 2Gb y no hice ningún cambio de tamaño.
Ahora, como he terminado, quería crear una imagen de lo que hice, pero obtengo un archivo de 16 Gb, que contiene 14 Gb de espacio no particionado (no particionado y libre) al final.

[Usé Windows // Win32DiskImager ya que no tengo nada libre para pegarme en el rPI en este momento]

¿Puedo truncar el archivo de imagen justo detrás del espacio particionado y transferir la parte principal a una tarjeta más pequeña?

Nippey
fuente
2
Si tiene acceso a una computadora Linux, ejecute dd if=/dev/path/to/SD/card of=~/SpecialImage.img, luego instale GParted y ejecute gparted ~/SpecialImage.img. Una vez que GParted abra su .imgarchivo, ¡simplemente cambie el tamaño de las particiones a su gusto! (Ambos comandos deben ejecutarse como root, sudo sudeben obtener lo que necesita. Cuando $cambia a a #, usted es Root. Tenga cuidado, este es el equivalente de Dios para Linux.) GParted es básicamente una interfaz gráfica de usuario para la gestión de partición arcana. herramientas que necesitarás. Usar GParted simplemente hace que todo sea mucho más simple y más probable para tener éxito.
JamesTheAwesomeDude
Plese leyó mi pregunta detenidamente.
Nippey
Sí, leí tu pregunta y puedo decirte que truncar una imagen de disco es peligroso. Claro, puede recortar los últimos bytes de una imagen, pero no hay garantía de que no corte accidentalmente ningún archivo, especialmente porque Linux separa intencionalmente sus archivos . Además, puede haber algunos metadatos importantes al final del sistema de archivos o algo así. En general, es una apuesta más segura usar las utilidades de cambio de tamaño del sistema de archivos adecuado que tratar de cortar el final de un archivo usted mismo.
JamesTheAwesomeDude
1
Bueno, pero estoy hablando de espacio no particionado. Incluso Linux no colocará ningún dato en el Espacio en disco que esté marcado como no particionado, sino que permanecerá dentro del bloque como está escrito en la Tabla de particiones. Mi preocupación fue causada por el formato del archivo de imagen: puede ser que el archivo de imagen tenga metadatos al final del archivo, por lo que me preocupaba cortar la información del archivo. (Espero que mi comentario anterior no haya sonado demasiado duro, sry;)
Nippey
Ohh, entiendo lo que estás diciendo ahora. Si le preocupa el espacio libre final dañado, ejecute GParted en la imagen después de haberla truncado. Probablemente mostrará la última área como "no asignada" o "corrupta": cree una nueva partición "sin formato" en ese espacio. Entonces, no tendrás ningún problema. :)
JamesTheAwesomeDude

Respuestas:

33

Finalmente encontré un recurso que explica mi pregunta.

http://softwarebakery.com/shrinking-images-on-linux

Corto:

Sí, es posible truncar!

Resumen del proceso:

Extrayendo la información de partición de la imagen usando fdisk:

$ fdisk -lu image.img
Disk image.img: 4096 MB, 4096000000 bytes, 8000000 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: 0x000a1bc7

      Device Boot      Start         End      Blocks   Id  System
image.img1              2048     5872026     5869978    b  W95 FAT32

Vemos que la partición tiene un tamaño de aproximadamente 2,8 Gb (5872026 * 512), el resto no está particionado .

Entonces, todo después del final de la partición se puede eliminar.
Esto se hará con la herramienta truncate. No olvide agregar 1 al número de sectores, ya que los números de bloque comienzan en 0.

$ truncate --size=$[(5872026+1)*512] image.img


Editar:

Para los que están siendo demasiado perezosos para cambiar a Linux:
También funciona en Windows con Cygwin 's fdisk.exey truncate.exe!

¿Qué es cygwin?

Puedo citar: "Cygwin: tenga esa sensación de Linux en Windows" ( https://www.cygwin.com/ ).
Es un conjunto de ejecutables que pueden ejecutarse en Windows, pero proporcionan todos los programas de línea de comandos que generalmente conoce de Linux. Cygwin puede tardar mucho tiempo en instalarse si selecciona cada paquete durante la instalación, pero para seguir este ejemplo, simplemente asegúrese de que, además de la configuración predeterminada, también estén seleccionados los paquetes util-linux(fdisk) y coreutils(truncar).
Dependiendo de su entorno, su hombre necesita agregar /usr/biny /usr/sbinsu $PATH.

Nippey
fuente
1
¿Qué paquete necesito instalar para obtener fdisk.exey truncate.exe?
PythonNut
1
Hola @PythonNut, actualicé mi respuesta anterior y agregué los paquetes necesarios: o)
Nippey
¿Qué pasa si la partición tiene el tamaño del disco, incluso si se usa menos?
piegames
5

Sé que esta es una pregunta antigua, pero me gustaría mostrar cómo hacer este proceso en Mac, porque no es tan fácil: fdiskno tiene la -lopción y truncateno está instalado de manera predeterminada:

1. Paso 1: Instale truncate en Mac OS X:

Necesitas MacPorts o Homebrew para esto. Yo uso MacPorts. Si no tiene uno de estos, continúe e instálelos primero. Enlace a MacPorts

Ahora, podemos instalar truncar . Abre tu Terminal y escribe:

sudo port install truncate

Para la instalación de Brew:

brew install truncate

Esto debería hacerlo.

2. Use Disk Utilities para montar nuestro IMG de modo que sea visible para el comando del terminal diskutil .

Verá en un momento por qué necesitamos este paso. Abre la aplicación Disk Utility. Haga clic en Archivo (en la barra superior) -> Abrir imagen de disco y seleccione su archivo IMG.

3. Verifique el tamaño de la partición del IMG y dónde está montado.

En una terminal, escriba:

diskutil list

Y debería mostrar algo como esto, en algún lugar al final:

/dev/disk3 (disk image):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        +16.0 GB    disk3
   1:             Windows_FAT_32 boot                    62.9 MB    disk3s1
   2:                      Linux                         3.9 GB     disk3s2

Entonces, vemos que alrededor de 12 GB no están particionados. Necesitamos truncar esos.

La razón por la que necesitamos este comando es para verificar dónde está montada la imagen del disco. En mi caso, está bajo: / dev / disk3

4. Averigüe el tamaño real de la partición.

3.9 GB y 62.9 MB son valores que no funcionarán con truncamiento. Necesitamos encontrar los tamaños de partición en bytes.

5. Ejecute fdisk .

En su Terminal, ejecute este comando:

   fdisk /dev/diskX

Donde X es el número que descubriste en el paso anterior. Esto debería resultar en algo como esto:

         Starting       Ending
 #: id  cyl  hd sec -  cyl  hd sec [     start -       size]
------------------------------------------------------------------------
 1: 0C    0 130   3 -    8  40  32 [      8192 -     122880] Win95 FAT32L
 2: 83    8  40  33 -  478  79  49 [    131072 -    7553024] Linux files*
 3: 00    0   0   0 -    0   0   0 [         0 -          0] unused      
 4: 00    0   0   0 -    0   0   0 [         0 -          0] unused      

6. ¡Hora de truncar !

En su terminal, cdal directorio en el que se encuentra su imagen. Luego escribir:

truncate FILE SIZE

ARCHIVO es su archivo, por supuesto.

TAMAÑO es el tamaño en bytes. Lo que hice fue agregar a la columna de tamaño del fdiskcomando, la columna de inicio y multiplicar por 512. Entonces, en mi caso, TAMAÑO será: 512 * (7553024 + 131072) = 3934257152 , que es aproximadamente 3.9 GB.

Necesitará el inicio y el tamaño de la última partición que muestra fdisk. (No necesariamente el más grande, pero el que está al final del archivo IMG)

Experimenté un poco, y cada vez que ingresé 7553024 * 512 o (7553024 + 1) * 512 bytes, el archivo IMG estaba dañado. Entonces, solo para estar seguro, hágalo como indico arriba. Puede agregar más de lo que realmente se necesita, pero es una opción segura.

7. (Opcional) Pruebe fácilmente si el IMG no está dañado.

Vaya una vez más a la Utilidad de Discos e intente abrir el nuevo archivo IMG como antes. Si se monta, también puede ver el nuevo tamaño (más pequeño) . Si no se monta, algo salió mal. (Tal vez intente aumentar el tamaño en el truncatecomando)

Esta no es la mejor prueba, pero es una forma segura de verificar si el nuevo IMG está dañado o no. Entonces, realmente no cuentes con eso, pero vale la pena intentarlo ...

¡Espero que alguien encuentre esto útil!

ant0nisk
fuente
1
¡Buena esa! Gracias por expandir el conocimiento :) Bueno, usted señaló que 512*(Size+1)no funciona. Como puede ver, solía Endy no Size, ya que debe mantener ambas particiones si hay más de una. Entonces, ¡usar 7553024 + 131072( +1) es 100% correcto!
Nippey
1

Win32DiskImager reciente tiene una opción para incluir solo particiones asignadas en la imagen del disco. Esto hará el recorte en un clic.

ingrese la descripción de la imagen aquí

Dmitry Grigoryev
fuente
Excelente, lo hace mucho más fácil en Windows!
Nippey
0

Es algo que noté recientemente, ya que hago muchas de estas operaciones de Win32diskimg para hacer una copia de seguridad de mis imágenes RPI para la implementación. Recientemente comencé a probar fstrim SD "trimming" para limpiar partes de la tarjeta SD que no están en uso para nivelar teóricamente el desgaste. No estoy seguro sobre el efecto que tendrá, pero un efecto secundario fue cuando tomé una imagen de la partición SD de 16GB y luego usé 7zip para comprimirla. Pasé de los usuales 16GB a 9.5GB para ahora un archivo de 2.5GB. Estoy probando ahora para asegurarme de que nada está mal, pero parece que usar TRIM para marcar el espacio no utilizado como 0 hace que la compresión de la imagen sea mucho más eficiente (lo cual tiene sentido). Solo quería informar sobre esto, fue muy fácil de lograr y no hubo múltiples pasos.

jctghost
fuente
Si bien no está mal, realmente no aborda la cuestión.
RalfFriedl