¿Cómo llenar a cero el espacio libre de un disco virtual en Windows para una mejor compresión?

46

¿Cómo llenar a cero el espacio libre de un disco virtual en Windows para una mejor compresión?

Me gustaría una herramienta de código abierto simple (o al menos gratis) para eso. Probablemente debería escribir un archivo lo más grande posible 0y luego borrarlo. Solo una pasada (esto no es por razones de seguridad, sino por compresión, estamos haciendo una copia de seguridad de las máquinas virtuales).

Debe ejecutarse desde el interior de Windows y no desde un disco.

En Linux lo hago así (como usuario):

cd
mkdir wipe
sudo sfill -f -l -l -z ./wipe/

Edición 1: decidí usar sdelete de la respuesta aceptada. Eché un vistazo a la ayuda del sdelete:

C:\WINDOWS\system32>sdelete /?

SDelete - Secure Delete v1.51
Copyright (C) 1999-2005 Mark Russinovich
Sysinternals - www.sysinternals.com

usage: sdelete [-p passes] [-s] [-q] <file or directory>
       sdelete [-p passes] [-z|-c] [drive letter]
   -c         Zero free space (good for virtual disk optimization)
   -p passes  Specifies number of overwrite passes (default is 1)
   -q         Don't print errors (Quiet)
   -s         Recurse subdirectories
   -z         Clean free space

Esta es una versión antigua. Usé el modificador -c de la segunda invocación y esto fue bastante rápido (la sintaxis solo es válida para versiones anteriores a V1.6):

c:\>sdelete -c c: (OUTDATED!)

Tengo la impresión de que esto hace lo que quiero. La herramienta sdelete es fácil de usar y fácil de obtener.

Edición 2: Como señaló scottbb en su respuesta a continuación, hubo un cambio en la herramienta en septiembre de 2011 (versión 1.6) Las opciones -c y -z han cambiado de significado. El uso correcto desde 1.6 en adelante es

c:\>sdelete -z c:

Edición 3: hay una versión 2.0 de sdelete y sdelete64. Parecen tener errores al poner a cero. Parecerá estar atascado al 100% durante tiempos extremadamente largos. Algunas personas han informado de 10 a 40 veces más. La versión anterior 1.61 no tiene este problema. Ver https://social.technet.microsoft.com/Forums/en-US/2ffb2539-34ba-4378-aa8a-941d243f117e/sdelete-hangs-at-100?forum=miscutils

Edición 4: ahora está el problema del espacio de disco virtual asignado dinámicamente . Si tiene un disco de 100GB que no está lleno y usa solo 30GB en el host, el relleno cero no debería aumentar dramáticamente el tamaño del disco porque eso contradice el propósito de la asignación dinámica . Hay una respuesta para Oracle VM VirtualBox https://superuser.com/q/907196/44402 , pero en otras pilas como VMWare, Xen, XenServer, etc., esto debe responderse por separado.

mit
fuente
2
sdeletees la herramienta adecuada para el trabajo, pero un cambio de septiembre de 2011 a la herramienta (versión 1.6) hace que las respuestas anteriores sean incorrectas. Las opciones -cy -zhan cambiado de significado. El uso correcto ahora essdelete -z c:\
scottbb
También asegúrese de usar imágenes de estilo COW (Copiar en escritura) si tiene muchas máquinas basadas en la misma instalación básica.
Matt

Respuestas:

46

En Windows, use la herramienta sysinternals sdelete para poner a cero todo el espacio vacío. El comando que desea se vería así sdelete -z c:.

Uso: sdelete [-p pasa] [-s] [-q] ...  
sdelete [-p pasa] [-z | -c] [letra de unidad] ...  
-a Eliminar el atributo de solo lectura.  
-c Limpiar el espacio libre.  
-p pasa Especifica el número de pasadas de sobrescritura (el valor predeterminado es 1).  
-q No imprime errores (Silencioso).  
-s o -r Subdirectorios recurrentes.  
-z Espacio libre cero (bueno para la optimización del disco virtual).

Para Linux te sugiero que uses zerofree .

Zoredache
fuente
Vine aquí para compactar mis discos duros virtuales. Compartir algunos enlaces relacionados de TechNet .. technet.microsoft.com/en-us/library/cc708394%28v=ws.10%29.aspx technet.microsoft.com/en-us/library/cc708317(v=ws.10 ) .aspx
Faiz
Me pregunto si el relleno cero tendría un impacto positivo en una unidad cifrada estándar de Linux LUKS dm-crypt . antes de someter a toda la máquina a arrancar desde un clonezilla bootstick y hacer una copia de seguridad física de toda la unidad. - ¿La sección puesta a cero dentro del cifrado conducirá a la sección puesta a cero en el disco externo? ¿O seguirá escribiendo ruido (sin asignar) por razones de seguridad? ¿O debería poner a cero la unidad de cripta sin montar (sin mirar el contenido cifrado)? (¿Y es una buena idea, es decir, la tabla de asignación es confiable en el contexto de una unidad
cifrada
Me sorprendería si hiciera algo más que cifrar los valores nulos y escribir el "ruido" cifrado en el disco.
Dan Pritts
15

Windows ya tiene una herramienta de línea de comando integrada que hace esto: CIPHER. Ver su / W opción.

Entonces, el comando completo sería: cipher / w: c: (reemplace c: con la letra de la unidad real)

(escribe ceros en el espacio no utilizado, luego 0xff, por lo que debe mirarlo y detenerlo con ctrl-c cuando comienza a escribir 0xff; no es ideal, pero es gratuito y ya está disponible en Windows desde XP al menos)

David Balažic
fuente
3
Enfoque interesante. Interrumpa la ejecución justo antes de que comience a deshacer todos los ceros. ¡+1 para una solución creativa usando herramientas que ya están ahí!
PsychoData
Me pregunto si es posible detectar cuándo ha terminado de escribir ceros y luego hacerlo abortar ...
Frederick Nord
Si usa el disco duro SSD, verifique que tenga TRIM habilitado. Luego, todo el bloque no utilizado será eliminado rápidamente con el patrón 0xFF por el firmware del disco duro. Esto es muy útil en imágenes de disco virtual hechas por servidores virtuales. Las imágenes se llenarán como espacios vacíos y liberarán bloques del sistema de archivos en el sistema de archivos de alojamiento.
Znik
Esto funcionó muy bien y mucho más rápido que SDelete -z (que estaba atascado al 100% sin dar ningún otro comentario).
psychowood
6

SDelete no pondrá a cero el espacio para la compactación de un disco virtual. SDelete comienza poniendo a cero el espacio libre, pero luego lo llena con 0xff y luego bytes aleatorios Consulte Cómo preparar un archivo de disco duro virtual de Virtual Server 2005 para enviarlo a los Servicios de soporte técnico de Microsoft Para obtener información sobre cómo configurar un VHD para compactación

Precompact.exe puede ser difícil de encontrar por alguna razón. Encontré una copia descargable por separado aquí . Sin embargo, si tiene una PC virtual con Windows, también puede obtenerla desde% programfiles (x86)% \ Windows Virtual PC \ Integration Components \ Precompact.iso

Jim B
fuente
2
sdelete con la opción -c es un relleno cero. ¿Quizás esté pensando en la utilidad de cifrado incorporada de Windows que no tiene una opción de solo cero?
Jeremy M
"SDelete implementa el estándar de limpieza y desinfección del Departamento de Defensa DOD 5220.22-M" (de los documentos) que específicamente no simplemente elimina un clúster. sdelete -c pone a cero el espacio libre (después de llenarlo), sin embargo, el método que usa sdelete no es el mismo que el precompacto y, en muchos casos, dará como resultado un disco más grande que el precompacto, que fue diseñado para poner a cero los discos virtuales
Jim B
Es interesante saber de otra herramienta. Gracias
mit
2
SDelete puede dejar el disco con 0s, pero el precompacto funciona mucho más rápido y fue diseñado para este tipo de situación.
Chris S
2
@romkyns Ya no importa, ya que todas las versiones modernas de Windows y Hyper-V son compatibles trim(a partir de Win7 e Hyper-V 2012), no hay necesidad de cero antes de la compactación. La utilidad PreCompact solo puso a cero partes del disco con archivos eliminados, la parte que nunca se había utilizado no se tocó. El uso de algo así sdeletellenaría el disco dinámico a un tamaño estático, que luego podría compactarse nuevamente solo al tamaño realmente utilizado.
Chris S
6

fsutilno es de código abierto, pero se envía con Windows y, por lo tanto, no cuesta nada extra. Lo usé para poner a cero el espacio libre en una unidad WD 250 GB 7200 RPM vacía ( F:). Esto es lo que ejecuté desde la línea de comando:

fsutil volume diskfree f:

Que mostró este informe:

Total # of free bytes        : 249899469856
Total # of bytes             : 249997291520
Total # of avail free bytes  : 249899469856

Usé Total # of avail free bytesen los siguientes comandos:

fsutil file createnew F:\clear 249899469856
fsutil file setvaliddata F:\clear 249899469856
fsutil file setzerodata offset=0 length=249899469856 F:\clear
del f:\clear

Tomó alrededor de 4 horas escribir 250 GB de ceros.

James L.
fuente
3

Yo también había estado buscando una forma de usar Cipher para escribir solo 0x00 y luego salir al comenzar a escribir 0xFF en el espacio libre. Esto permitirá que se comprima el máximo espacio libre. Se me ocurrió el siguiente trabajo básico de PowerShell

reemplace d: \ con la unidad requerida

Function CipherFreeSpace
{
    $cipherjob = @()
    $Job = start-job -ScriptBlock {cipher /w:d:\ }
    while ($cipherjob -notcontains "Writing 0xFF")
    {
        Write-host "." -nonewline 
        Start-Sleep 2
        $cipherjob += $job | Receive-Job 
    }
    $Job | Stop-Job | Remove-Job -Force
}
CipherFreeSpace

Saludos Simon

Simon Stevenson
fuente
1

Si está utilizando VMware, una forma mucho mejor es utilizar las herramientas integradas en VMware para recuperar cualquier espacio no utilizado en la unidad virtual.

Utilicé esto para reducir el tamaño del disco virtual de 28 gigabytes a 13 gigabytes. Su experiencia puede ser diferente.

Cuando intenté usar sdelete -z c:, en realidad aumentó el tamaño de las unidades virtuales a 30 gigabytes, que era su tamaño máximo.

Consulte el sitio web de VMware y Compacte un disco duro virtual , que se encuentra debajo Using VMware Workstation > Configuring and Managing Devices > Configuring and Maintaining Virtual Hard Disks.

Actualizar

A veces, las herramientas GUI no son tan confiables como las herramientas de línea de comandos. Me he encontrado con problemas donde las herramientas de la GUI fallan, pero las herramientas de línea de comandos funcionan bien. Aquí están las opciones para VMware Desktop 10:

C:\Program Files (x86)\VMware\VMware Workstation>vmware-vdiskmanager -h
Diskname or some other argument is missing.
VMware Virtual Disk Manager - build 1895310.
Usage: vmware-vdiskmanager.exe OPTIONS <disk-name> | <mount-point>
Offline disk manipulation utility
  Operations, only one may be specified at a time:
     -c                   : create disk.  Additional creation options must
                            be specified.  Only local virtual disks can be
                            created.
     -d                   : defragment the specified virtual disk. Only
                            local virtual disks may be defragmented.
     -k                   : shrink the specified virtual disk. Only local
                            virtual disks may be shrunk.
     -n <source-disk>     : rename the specified virtual disk; need to
                            specify destination disk-name. Only local virtual
                            disks may be renamed.
     -p                   : prepare the mounted virtual disk specified by
                            the mount point for shrinking.
     -r <source-disk>     : convert the specified disk; need to specify
                            destination disk-type.  For local destination disks
                            the disk type must be specified.
     -x <new-capacity>    : expand the disk to the specified capacity. Only
                            local virtual disks may be expanded.
     -R                   : check a sparse virtual disk for consistency and attempt
                            to repair any errors.
     -e                   : check for disk chain consistency.
     -D                   : make disk deletable.  This should only be used on disks
                            that have been copied from another product.

Aquí hay un ejemplo de reducción de un disco. Esta línea de comando funcionó, a pesar de que el mismo comando de la GUI falló:

C:\Program Files (x86)\VMware\VMware Workstation>vmware-vdiskmanager.exe -k
 "H:\VMware\WindowsXP.vmdk"
  VixDiskLib: Invalid configuration file parameter.  Failed to read configuration file.
  Shrink: 100% done.

El mensaje de error que comienza VizDiskLibes nuevo en VMware Desktop 10 y puede ignorarse de forma segura.

Aplazamiento de pago
fuente
1
sdelete en sí no está destinado a reducir el tamaño de vmdk. Se utiliza para convertir todo el espacio libre disponible en ceros en preparación para la operación de reducción. Si no hace esto, los archivos eliminados y otros datos huérfanos seguirán presentes en el disco. Las herramientas VMWare no siempre podrán reclamar el espacio en disco que todavía ocupan esos archivos. Al convertir estos "archivos eliminados" en ceros, el espacio en el disco puede recuperarse completamente cuando ejecuta la herramienta de reducción. La razón por la que vio un aumento en el tamaño del archivo en el disco virtual es porque sdelete llena todo el espacio disponible que tiene con ceros.
Leon Lucardie
Gracias por aclarar esto. Creo que las herramientas podrían beneficiarse de una mejor denominación y / o una descripción de una línea de lo que hace la herramienta cuando la ejecuta.
Contango
-1

Mit,

Descubrí que el script de PowerShell de Simon hizo exactamente lo que necesita, sin los problemas de versiones de sdelete. (cambia haciendo cosas diferentes en diferentes versiones)

Tenía un problema, ese cifrado seguía funcionando, pero lo solucioné.

Modifiqué aún más el script para limpiar la carpeta temporal:

Deberá reemplazar F: \ con su letra de unidad en ambos lugares.

Function CipherFreeSpace
{
    $cipherjob = @()
    $Job = start-job -ScriptBlock {cipher /w:F:\ }
    while ($cipherjob -notcontains "Writing 0xFF")
    {
        Write-host "." -nonewline 
        Start-Sleep 2
        $cipherjob += $job | Receive-Job 
    }
    Stop-Process -processname cipher
    Start-Sleep -s 3
    Remove-Item -recurse F:\EFSTMPWP
    $Job | Stop-Job | Remove-Job -Force
}
CipherFreeSpace
Preston Shirmeyer
fuente
-4

¿Por qué las herramientas de terceros, cuando Windows ya incluye todo lo que necesitará?

1) format X: /fs:XXXX /p:#, donde Xestá la letra de unidad; XXXXes el sistema de archivos, Yeither y #es el número de pases;

2) cleancomando diskpart : http://technet.microsoft.com/library/cc766465.aspx , http://support.microsoft.com/kb/300415 ;

Por cierto, tampoco necesita más que un solo pase: de lo contrario, un reclamo es información desactualizada para estrategias de escritura / escritura de disco obsoletas, personas que empujan productos, impulsadas por paranoia o bs transmitidas como "asesoramiento experto".

Editar: nvm, se perdió la parte del espacio libre ...

usuario180961
fuente
1
En muchos casos, hay herramientas de terceros disponibles que hacen buenos o mejores trabajos, son más fáciles de instalar o más confiables. Pero esto es totalmente OT, la pregunta no era sobre quién lo escribe. Aparte de esto, Microsoft adquirió Sysinternals (que escribió SSDelete) porque eran años luz mejor que las cosas incorporadas. Simplemente compare ProcessExplorer con el producto MS "TaskManager" -1 para iniciar una guerra de llamas
Alojz Janez
Te perdiste el requisito de "código abierto" en la pregunta, ¿verdad?
Alojz Janez