
Pasé muchas horas buscando en la web cómo reducir imágenes de discos virtuales KVM, especialmente para invitados de Windows, sin suerte.
Todo lo que encontré es poner a cero el espacio libre de la VM, desfragmentar el disco virtual (desde Windows) y luego ejecutar qemu-img convert -c ...
( -c
marcar para comprimir).
Tengo una máquina virtual con Windows 7, con un tamaño de unidad virtual de 100 GB. Inicialmente, este VDD gastaba 40 GB en el almacenamiento del host. Una vez que se pone a cero, el VDD consume 100 GB reales en el host. Y qemu-img -c ...
crea 91 GB, que no es en absoluto lo que esperaba.
En el sitio web moderno, podemos descargar máquinas virtuales W7 de menos de 10 GB, ¿cómo es posible? ¿Hay alguna manera de comprimir "realmente" las imágenes de VM?
Gracias a @dyasny, hice una pequeña prueba con virt-sparsity
. Limpié el disco de la VM W7, desactivé la hibernación, por lo que el VDD solo consume 20 GB. Degradé el disco nuevamente y lo ejecuté nuevamente sdelete -z
. Ejecutar virt-sparsity
con la --compress
bandera proporciona una unidad virtual de 80 GB. Lejos de lo que hubiera esperado.
EDIT-2016-02-16: "Actualizando" esta pregunta porque el método para reducir una VM que se analiza aquí es muy eficiente pero tiene un inconveniente importante: elimina todas las instantáneas de VM. Si alguien sabe cómo reducir una máquina virtual y al mismo tiempo conservar instantáneas, ¡no dude en compartirlo!
Respuesta1
Para reducir un sistema operativo invitado de Windows, debe reducir la partición dentro del invitado, apagar la máquina virtual, crear un nuevo disco más pequeño del tamaño deseado, copiar los datos del disco antiguo al nuevo disco más pequeño, intercambiar los nombres de los discos y reiniciar. la máquina virtual.
Es sencillo, pero si se hace incorrectamente podría provocar la pérdida de datos y de cabello.
Estos son los pasos para KVM con un invitado de Windows Server 2012 de 100 GB que queremos reducir a 35 GB, usando el formato QCOW2.
IMPORTANTE: Este método implicasin modificación de la máquina virtualdefinición. En cambio, sólo requieremanipulaciones de imagen de disco.
Supuestos para el huésped:
- El invitado es un servidor Windows 2012.
- Imagen de disco de 100 GB en formato QCOW2
- Dos particiones:
- 350 MB de arranque
- 99,6 GB de C: unidad con 20 GB de espacio utilizado
- Queremos reducir C: de 99,6 GB a 34 GB
Supuestos para el anfitrión:
- Servidor Ubuntu 16 LTS
- KVM (libvirt)
- Unidad de 250GB
- Imágenes virtuales ubicadas en /var/lib/libvirt/images
PASO 1: Preparación del Windows Guest, reducción de la partición principal C:
En este paso, simplemente reduciremos nuestras particiones de Windows directamente desde Windows. La imagen de disco resultante al final de este paso será la suma de la partición de arranque, la unidad C: (reducida) y un espacio sobrante no utilizado que eliminaremos (al no copiarlo en un disco nuevo).
- Inicie sesión en el invitado de Windows
- Abra la utilidad "Administración de computadoras", utilizando la función de búsqueda del menú de inicio para ubicarla.
- En el lado izquierdo, haga clic en "Almacenamiento->Administración de discos"Captura de pantalla de administración de discos de almacenamiento
- En la nueva pantalla, haga clic derecho en la partición C:, haga clic en "Reducir volumen...", lo que debería tomar un poco de tiempo antes de que aparezca un cuadro de diálogo. Ser paciente.
Una vez que aparezca el cuadro de diálogo "Reducir C:", ingrese la cantidad de espacio en "Cantidad de espacio para reducir" que haga que el valor "Tamaño total después de reducir en MB" se acerque a los 35 GB deseados. Luego haga clic en "Reducir".
NOTA: Es posible que reciba un mensaje de error si el nuevo espacio es demasiado pequeño; en este caso, debe reducir la "Cantidad de espacio para reducir" en 1 GB de forma incremental hasta que el error desaparezca y se produzca la reducción. En la práctica, nos gusta conservar 10 GB de espacio libre.
Supongamos que pudo reducir la partición C: a 34 GB.
Una vez hecho esto, apague la VM abriendo un símbolo del sistema y escribiendo:
shutdown /s /t 0
- Tu invitado de Windows está listo.
PASO 2: Reducción del disco en el host de VM
El procedimiento no es realmente una reducción, sino que vamos a crear un nuevo disco (del tamaño final) en el que copiaremos las dos particiones del disco original y nos saltaremos el espacio no utilizado.
El objetivo es crear un disco cuyo tamaño total = partición de arranque + partición C:. También terminaremos con un pequeño espacio sobrante (a menos que tus cálculos hayan sido perfectos) del que no debes preocuparte porque lo abordaremos en el último paso.
- Inicie sesión en el host de Linux
- cambiar a superusuario:
sudo su
- vaya a donde se almacenan las imágenes virtuales:
cd /var/lib/libvirt/images
- lista los archivos:
ls -l
- Encuentra tu imagen de invitado (hay muchos tutoriales sobre eso en otros lugares). Supongamos que nuestra imagen de invitado de Windows se llama "windows.qcow2"
hacemos una copia de seguridad:
mkdir backup cp windows.qcow2 backup/windows.qcow2.bak
(ve a tomar un café porque esto tomará un tiempo para un disco grande)
instale los paquetes de guestfs que le puedan faltar:
apt-get install libguestfs-tools
Muy bien, revisemos nuevamente nuestro disco de Windows explorando la imagen de Windows con
virt-filesystems
:virt-filesystems --long --parts --blkdevs -h -a windows.qcow2
que produce esto:
Name Type MBR Size Parent /dev/sda1 partition 07 350M /dev/sda /dev/sda2 partition 07 34G /dev/sda /dev/sda device - 100G -
Observe que tenemos
/dev/sda1
cuál es nuestra partición de arranque de Windows de 350 MB,/dev/sda2
cuál es nuestra partición C: de ahora 34 GB y que la imagen total del disco/dev/sda/
es de 100 G, lo que nos deja mucho espacio para recortar.Así que aquí está el paso importante: haz tus cuentas: 34 G + 350 M caben en 35 G, por lo tanto vamos a crear una imagen de 35 GB. Inevitablemente terminaremos con algo de espacio sobrante, a menos que tus cálculos sean perfectos, pero no te preocupes, lo abordaremos a continuación.
creemos el nuevo disco virtual QCOW2 que llamamos
newdisk.qcow2
de tamaño total 35 GB:qemu-img create -f qcow2 -o preallocation=metadata newdisk.qcow2 35G
que produce:
Formatting 'newdisk.qcow2', fmt=qcow2 size=37580963840 encryption=off cluster_size=65536 preallocation=metadata lazy_refcounts=off refcount_bits=16`
Cambiemos el tamaño del disco copiando el disco antiguo en el recién asignado. Esta es la parte que es absolutamente asombrosa. La mayoría de las otras guías muestran cosas tremendamente complicadas. Esto simplemente se hace con este comando, después del cual debes ir a buscar más café; probablemente tomará un tiempo:
virt-resize windows.qcow2 newdisk.qcow2`
que produce esto:
[ 0.0] Examining windows.qcow2 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? --:-- ********** Summary of changes: /dev/sda1: This partition will be left alone. /dev/sda2: This partition will be left alone. There is a surplus of 439.8M. An extra partition will be created for the surplus. ********** [ 8.8] Setting up initial partition table on newdisk.qcow2 [ 9.9] Copying /dev/sda1 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00 [ 15.1] Copying /dev/sda2 100% ?¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦¦? 00:00 Resize operation completed with no errors. Before deleting the old disk, carefully check that the resized disk boots and works correctly.
Observe que la herramienta encontró un excedente de espacio... recuerde los comentarios sobre Matemáticas... Entonces puede cancelar eso y recrear el disco o simplemente continuar como lo hacemos aquí y expandir la
sda2
partición como se hizo en el PASO 3.Una vez hecho. Inspeccione la imagen resultante:
virt-filesystems --long --parts --blkdevs -h -a newdisk.qcow2
que produce esto:
Name Type MBR Size Parent /dev/sda1 partition 07 350M /dev/sda /dev/sda2 partition 07 34G /dev/sda /dev/sda3 partition 83 439.8M /dev/sda /dev/sda device - 35G -
Observe cómo el tipo de
/dev/sda3
es de tipo Linux para el espacio sobrante. El espacio sobrante está bien, a menos que hayas hecho tus cálculos exactamente bien. Nos ocuparemos de esta partición adicional del invitado de Windows más adelante. Ahora mismo, simplemente ignóralo.Intercambia las imágenes del disco:
mv windows.qcow2 backup/ mv newdisk.qcow2 windows.qcow2
Inicie su máquina virtual.
PASO 3: Finalización de la operación del disco en Windows Guest
En este paso, confirmamos que Windows arranca bien y vamos a expandir nuestra partición C al espacio adicional.
Inicie sesión en el invitado de Windows
Abra la utilidad "Administración de computadoras", utilizando la función de búsqueda del menú de inicio para ubicarla.
En el lado izquierdo, haga clic en "Almacenamiento->Administración de discos"
Deberías ver 3 particiones: boot, C: y una pequeña partición de 439 MB (en el extremo derecho).Captura de pantalla de Computer Management que muestra las 3 particiones
Elimine la partición de Linux haciendo clic derecho->eliminar volumen. (haga clic en Sí en cualquier mensaje)
Haga clic derecho en la partición C: y haga clic en "Extender", luego Siguiente y Aceptar en los cuadros de diálogo. Sólo debería ofrecer ampliar por el importe de la última partición. Una vez hecho esto, habrá cambiado el tamaño de C: y quedará con solo dos particiones.
Eso es todo. Su invitado de Windows ahora usa solo 35 GB aproximadamente. Recuerde que la imagen del disco real puede ser más grande (podría estar más cerca de 38 GB) debido a toda la sobrecarga, etc.
Verifique que todo funcione bien y elimine las copias de seguridad de sus imágenes o muévalas fuera de línea para almacenarlas.
Respuesta2
Finalmente logré reducir realmente el espacio de la VM. Al principio, la máquina virtual W7 consumía 107 GB en el almacenamiento del host. El tamaño del disco duro virtual es de 100 GB y actualmente, la VM sólo consume 18 GB de su almacenamiento virtual.
Aquí esta lo que hice:
- Limpiar la unidad virtual (eliminar archivos temporales, etc.)
- Defrag con el software UltraDefrag de código abierto con "optimización total"
- Correr
sdelete -c c:
- Correr
sdelete -z c:
- Correr
qemu-img convert -c -f qcow2 w7-64.qcow2 -O qcow2 w7-64-compressed.qcow2
De esta manera, el archivo qcow2 se redujo de 107 GB a... ¡7 GB!
Respuesta3
Cuando ejecutas qemu-img -c
, comprimes la imagen, lo que, si bien puede reducir algo de espacio, realmente puede perjudicar el rendimiento. Si desea deduplicar los ceros en el disco, debe ejecutar qemu-img convert
, básicamente como si estuviera intentando convertir la imagen de un formato a otro (incluso si los formatos src y dst son los mismos).
Este proceso escribirá una nueva imagen convertida, sin ceros, deduplicando efectivamente el espacio puesto a cero en la unidad.
Otra opción sería simplemente usar, virt-sparsify
por supuesto.
Respuesta4
En Xenial y Bionic, la utilidad virt-sparsify
del paqueteherramientas-libguestfsDeberia trabajar. Tenga en cuenta que:
- NO es necesario ejecutar una herramienta como la que
sdelete
está dentro del huésped de antemano (pero no hará daño) - Puede usar la
--in-place
bandera para liberar espacio sin copiar el archivo (¡útil si la imagen del disco ya es más grande que el espacio libre restante en su disco!) - La herramienta admite qcow2 e imágenes en formato raw.