Uno de los comportamientos más desconcertantes para los administradores de sistemas en Proxmox VE es ver cómo un archivo de disco virtual .qcow2 sigue ocupando 80 GB en el almacenamiento físico del hipervisor, a pesar de que dentro del sistema operativo invitado solo se están utilizando 20 GB.
Por diseño, el formato QCOW2 (QEMU Copy-On-Write) es de aprovisionamiento dinámico (thin provisioned): crece conforme el sistema operativo escribe nuevos datos, pero nunca encoge por sí solo cuando eliminas archivos. Los bloques borrados quedan marcados como libres únicamente en la tabla del sistema de archivos del huésped, pero el hipervisor sigue almacenando los ceros en el disco físico. Si no se compacta periódicamente, este espacio fantasma satura el almacenamiento y multiplica innecesariamente el peso de tus copias de seguridad en el NAS Synology.
// EJECUCIÓN RÁPIDA (TL;DR) – RECUPERACIÓN ONLINE DE ESPACIO
# Método seguro sin apagar la máquina (Requiere VirtIO SCSI + Discard):
1. En Proxmox: Hardware > Hard Disk > Edit > Marcar casilla “Discard” y “SSD emulation”.
# 2. En el huésped Linux (Shell root):
fstrim -av
# 3. En el huésped Windows (PowerShell Administrador):
Optimize-Volume -DriveLetter C -Defrag -Verbose
Proxmox liberará de inmediato los bloques vacíos en el archivo .qcow2 físico del host.
Comprendiendo la diferencia entre Reducción y Compactación
Antes de ejecutar comandos en la consola, es imperativo distinguir entre dos operaciones técnicas completamente distintas:
- Compactación (Hole Punching / Sparsify): Mantiene el tamaño máximo asignado al disco (ej. 100 GB), pero libera todo el espacio no utilizado, haciendo que el archivo
.qcow2en el host se reduzca a lo que realmente pesa la información (ej. 25 GB). Es 100% segura y no tiene riesgo de pérdida de datos. - Reducción de Tamaño Lógico (Shrink): Consiste en achicar la capacidad máxima asignada (ej. bajar un disco de 100 GB a 50 GB). Operación de alto riesgo: si el tamaño del disco virtual se reduce un solo megabyte por debajo de la partición del sistema, la tabla de particiones se corrompe y la máquina virtual queda destruida.
Método 1: Compactación Online mediante TRIM / Discard (Recomendado)
Este es el estándar moderno en Proxmox VE. Permite que el sistema operativo invitado informe activamente al hipervisor qué bloques han sido eliminados mediante la instrucción ATA/SCSI TRIM.
Paso 1: Habilitar Discard en la configuración de la VM
- Selecciona la máquina virtual en el panel de Proxmox y dirígete a la pestaña Hardware.
- Haz doble clic sobre el Hard Disk.
- Verifica que el controlador de bus sea SCSI (si tu máquina arranca en SATA o IDE debido a problemas de arranque, aplica primero nuestra solución para reparar el error Inaccessible Boot Device).
- Marca las casillas Discard y SSD emulation.
- Pulsa OK. Si la VM estaba encendida, requiere un reinicio completo (apagar y encender) para que QEMU actualice los descriptores del hardware virtual.
Paso 2: Disparar el comando TRIM en el sistema invitado
En distribuciones Linux (Ubuntu, Debian, AlmaLinux):
# Ejecutar el recorte de bloques en todos los puntos de montaje activos sudo fstrim -avHabilitar el temporizador del sistema para que se ejecute automáticamente cada semanasudo systemctl enable --now fstrim.timer
En Windows Server / Windows 10/11:
Abre PowerShell con privilegios de Administrador y ejecuta:
Optimize-Volume -DriveLetter C -ReTrim -Verbose
Método 2: Compactación Offline con ‘qemu-img convert’
Si tu sistema operativo invitado es antiguo y no soporta TRIM, o si la máquina proviene de una conversión directa desde nuestra Guía de Migración de VMware ESXi a Proxmox, el método definitivo es llenar el espacio libre con ceros binarios y recomprimir el archivo de imagen.
Paso 1: Poner a cero el espacio libre dentro del huésped
Para que la herramienta de Proxmox sepa qué sectores puede eliminar, los bloques vacíos deben contener estrictamente ceros (0x00).
En Linux:
# Crear un archivo masivo lleno de ceros hasta agotar el disco dd if=/dev/zero of=/zerofile bs=1M status=progressEliminar el archivo inmediatamente después de que el comando falle por disco llenorm -f /zerofile
En Windows:
Descarga la utilidad oficial SDelete de Microsoft Sysinternals y ejecuta en la consola CMD:
sdelete.exe -z C:
Paso 2: Apagar la máquina y compactar desde el Host Proxmox
- Apaga la máquina virtual por completo.
- Abre la consola Shell de Proxmox y dirígete al directorio donde reside el archivo de la VM (por ejemplo, en un almacenamiento tipo Directorio o NFS):
cd /var/lib/vz/images/100/ - Ejecuta la conversión compactada hacia un nuevo archivo temporal:
qemu-img convert -O qcow2 -c vm-100-disk-0.qcow2 vm-100-disk-0-shrinked.qcow2(El parámetro-caplica además compresión Deflate en los clusters, reduciendo aún más el tamaño final). - Sustituye la imagen antigua por la optimizada:
mv vm-100-disk-0.qcow2 vm-100-disk-0.qcow2.bak mv vm-100-disk-0-shrinked.qcow2 vm-100-disk-0.qcow2 - Enciende la máquina virtual. Tras validar que los servicios y bases de datos funcionan correctamente, puedes borrar con seguridad el archivo de respaldo
.bak.
Método 3: Reducción del Tamaño Asignado (Shrink Real de Disco)
Si asignaste erróneamente un disco de 500 GB a una máquina virtual y deseas que su capacidad total máxima pase a ser de 100 GB, el procedimiento exige una sincronización matemática milimétrica:
¡ADVERTENCIA CRÍTICA DE INTEGRIDAD!
Nunca ejecutes el comando de reducción en Proxmox sin antes haber achicado la partición del sistema operativo invitado a un tamaño menor que el objetivo final. De lo contrario, cortarás el sistema de archivos por la mitad.
- Reducir la partición en el Huésped: Entra en la VM. En Windows, ve a Administración de Discos > Reducir Volumen. En Linux, usa
gpartedoresize2fs. Si tu meta es que el disco quede en 100 GB, reduce la partición interna a 90 GB (dejando 10 GB de margen de seguridad no asignado al final). - Apaga la VM.
- Ejecutar el recorte en Proxmox Shell:
qemu-img resize --shrink /var/lib/vz/images/100/vm-100-disk-0.qcow2 100G - Actualizar la configuración de Proxmox:
qm rescan --vmid 100 - Enciende la máquina virtual, vuelve al administrador de particiones y expande el volumen para ocupar los 10 GB de colchón que dejaste.
Diagnóstico y Preguntas Frecuentes
¿Por qué el comando fstrim devuelve “the discard operation is not supported”?
Ocurre cuando el disco está configurado bajo el bus IDE o VirtIO Block antiguo. Para que TRIM funcione, el disco debe estar configurado obligatoriamente como **SCSI** utilizando el controlador **VirtIO SCSI** o **VirtIO SCSI Single** en las opciones del hardware.
¿Qué sucede si este procedimiento satura los nodos de un clúster?
La compresión intensiva de discos con qemu-img genera altas tasas de I/O de CPU y almacenamiento. Si ejecutas este proceso en nodos en producción dentro de un clúster con alta disponibilidad (HA), asegúrate de que el tráfico de Corosync no se degrade, evitando caer en el temido error Cluster Not Ready – No Quorum en Proxmox.
Guía técnica de ingeniería de sistemas escrita por Gustavo Dulcey, especialista en Virtualización KVM, QEMU y optimización de almacenamiento en centros de datos.