Saltar al contenido

liberar espacio no utilizado en un archivo de imagen qcow2 en kvm / qemu

Solución:

Solución 1:

La imagen no se encogerá automáticamente, ya que cuando borras archivos, en realidad no borras datos (esta es la razón por la que la recuperación funciona). Qemu tiene una función para encoger las imágenes de qcow2, pero lo que hace la utilidad es realmente deduplicar los ceros del disco, dejando intacta toda la demás información. Entonces la idea sería:

  1. Llene con cero la unidad (dd if=/dev/zero of=/some/file hasta que te quedes sin espacio)
  2. eliminar / algunos / archivo
  3. apaga la máquina virtual
  4. cd donde se guardan y ejecutan las imágenes de la máquina virtual qemu-img convert -O qcow2 original_image.qcow2 deduplicated_image.qcow2
  5. cambie la configuración de la VM para usar la nueva deduplicated_image.qcow2, pruebe que la VM esté funcionando y elimine la imagen anterior

Esto, afaik, solo funcionará con imágenes qcow2, no he probado otros formatos.

Solucion 2:

virt-sparsify puede hacer todo esto con menos molestias de su parte: http://libguestfs.org/virt-sparsify.1.html


Solución 3:

Además de la respuesta aceptada (que describe el método general más común para reducir un archivo qcow2), la versión moderna (es decir: RHEL7 +) de la pila libvirt / qemu / qcow2 admite la virtio-scsi controlador que admite el discard='unmap' opción.

Si la máquina virtual usa virtio-scsi y la definición de libvirt incluye discard='unmap', un simple fstrim en el sistema de archivos invitado liberará espacio libre asignado pero no utilizado en el host. Esto se puede comprobar con du -hs <guestdisk> en el lado del anfitrión (nota: ls -al <guestdisk> voluntad no mostrar el tamaño real asignado, solo el lógico).

Incluso para instancias libvirt / qemu más nuevas (es decir: RHEL8 +), el tamaño del archivo invitado se puede reducir incluso si el sistema operativo invitado no admite el recorte: habilitando ambos discard='unmap' y discard_zeroes="unmap" (y usando el virtio-scsi controlador), escribiendo un flujo secuencial de cero en el lado del invitado (es decir, a través de dd if=/dev/zero of=/zero.img bs=1M count=1024) activará el recorte del tamaño de host de los rangos de LBA afectados. Sin embargo, tenga en cuenta que esto puede requerir un uso intensivo de la CPU para el host (que tuvo que “analizar” cualquier escritura de invitado en busca de ceros repetidos), por lo que solo debería habilitarse en casos específicos.

Ambos métodos reducirán la físico tamaño asignado (qué du -hs muestra). Para reducir el tamaño lógico (qué simple ls -al da) necesitas usar virt-spasify o qemu-img (como se describe en las otras respuestas).


Solución 4:

Puede usar virt-sparsify para esto. Automáticamente pone a cero y dispersa el espacio libre en la mayoría de los sistemas de archivos que encuentra dentro de la imagen del disco de origen (admite ext2 / 3/4, btrfs, NTFS, etc.).

Instrucciones paso a paso para la conversión in situ

  1. Apaga la VM

  2. Mantenga una copia de seguridad

  3. Convertir: virt-sparsify --in-place disk.img

Instrucciones paso a paso para la conversión a otro archivo (esto es más seguro pero requiere más espacio libre):

  1. Apaga la VM

  2. Convertir: virt-sparsify disk.img new-file.img

  3. Cambie el archivo de imagen antiguo por el nuevo: mv disk.img disk.img.bak && mv new-file.img disk.img

  4. Si la VM se inicia normalmente, puede eliminar la copia de seguridad: rm disk.img.bak

PD: también puede convertir entre formatos cuando usa virt-sparsify:

virt-sparsify disk.raw --convert qcow2 disk.qcow2
¡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 *