Espacio no utilizado de relleno cero en un disco duro

En preparación para crear imágenes de disco comprimidas de varios discos duros, estoy buscando un software que rellene con cero las partes no utilizadas del disco (las series largas de ceros se comprimen bastante bien).

Requisitos:

  • Se ejecuta bajo Linux o Windows 98.
  • Admite formatos de disco NTFS y FAT32.
  • Pone a cero tanto como sea posible (espacio vacío tanto no asignado como dentro de las asignaciones, entradas de directorio no utilizadas, etc.)
  • Libre

Agradable tener:

  • Soporte para formatos de disco ext2 y ext3.
Windows 98? ¿Eso alguna vez apoyó NTFS en absoluto?
SysInternals SDelete si puede permitirse al menos Windows XP.
la verdad es que Win 98 + NTFS podría ser un oxímoron... probablemente haya algunas utilidades externas para leer NTFS... pero ¿a quién le importa un sistema operativo muerto?
@Thomas, una de las computadoras de las que voy a hacer una imagen tiene Win98 instalado y es demasiado lenta para ejecutar WinXP. Si voy a hacer esto con un solo programa, debe ser Win98 (para ejecutar desde el sistema operativo instalado en esa computadora) o Linux (para ejecutar desde un disquete de arranque combinado y un sistema de archivos de red).

Respuestas (5)

Puede usar WipeFreeSpace que se ejecuta en Linux. Admite varios sistemas de archivos, incluido FAT32 (Win98). Tienes que pasar por el proceso de construcción manual, ya que no hay binario...

O puedes usar la herramienta hacers THC-SecureDelete .

Para el primer intento, le recomiendo que haga una copia de seguridad de todos los datos primero, por lo tanto, tar los datos en otro disco y borrar todo el disco y volver a tar es una opción aceptable si lo hace solo una vez.

Actualizado: SysInternals SDelete para al menos Windows XP como Thomas mencionó en el comentario superior es solo una solución gratuita de Windows.

Sugeriría arrancar desde una llave USB de Linux que brinde acceso de lectura/escritura a la unidad que desea poner a cero y usar un script de python (la mayoría de las instalaciones de Linux incluyen python), para hacer algo como:

import os

def DoIt(drive_path):
    """ Fill a drive with zeros then delete them """    
    info = os.statvfs(drive_path)  # Get a the file system info. NOT AVAILABLE ON WINDOWS!
    zerodir = os.path.join(drive_path, 'ZerosDir')  # Create a directory name
    os.makedirs(zerodir)  # And the directory
    filename_pattern = os.path.join(zerodir, 'Z%07d.000')  # File name pattern
    bsize = max(info.f_bsize, info.f_frsize)  # Decide the block size
    zeros = "\x00" * bsize  # Create a block of zeros that size

    try:  # We don't wish to abort the whole script on an error
        for n in xrange(info.f_files):  # For the max number of files allowed
            with open(filename_pattern % n, 'wb') as zf:  # Open a file
                zf.write(zeros)  # write the file
                zf.flush()  # Make sure it is written
                os.fsync(zf)  # REALLY Sure
    except IOError, e:
        pass # Carry on to the end of the script even if there is a problem
    print 'Finished Creating Files'

    for n in xrange(info.f_files):  # For the max number of files allowed
       try:  # Don't wish to abort even if there is a file we can't delete
           os.os.remove(filename_pattern % n) # Remove the file
       except OSError, e:  # In case of problems
           print e  # Print the problem but carry on
    os.rmdir(zerodir)
    print 'Done!'

if __name__ == "__main__":
    import sys
    if len(sys.argv) < 2:
        print "Please supply the path(s) to the drive(s) to fill with zeros"
    for arg in sys.argv[1:]:
        DoIt(arg)

Nota IMPORTANTE

Lo anterior es 100% no probado Úselo bajo su propio riesgo

No parece que pondrá a cero el espacio libre en FAT32 y otros sistemas de archivos basados ​​en clústeres, y ni siquiera toca las entradas de directorio no utilizadas.

Históricamente, mi solución para hacer lo que ha descrito sería montar el sistema de archivos de origen y usar el comando dd para crear un archivo de relleno cero y luego eliminar el archivo temporal:

$ mount /dev/source_hard_drive /mnt
$ cd /mnt
$ dd if=/dev/zero of=some_random_temp_file bs=1M ; rm some_random_temp_file
Eso no reducirá a cero el espacio libre de los sectores parcialmente utilizados.
¿Ejecutar la desfragmentación primero ayudaría con este problema?
No. La desfragmentación no empaquetará varios archivos en un solo sector si el sistema de archivos no está diseñado para ello, y no creo que ninguno de los sistemas de archivos en los que estoy interesado lo admita.

Considere usar Partclone en lugar de reducir a cero el espacio no utilizado en su disco. Partclone es un software gratuito y admite formatos de disco NTFS, FAT32 y EXT2 y EXT3, así como muchos otros formatos.

En lugar de poner a cero el espacio no utilizado, Partclone se puede configurar para copiar solo los bloques usados ​​presentes en el disco . Puede generar lo que se llama un archivo de dominio , que especifica qué bloques en el disco están realmente en uso. Esto le ahorrará tiempo y permitirá una copia no destructiva de sus datos de origen.

Pone a cero tanto como sea posible (espacio vacío tanto no asignado como dentro de las asignaciones, entradas de directorio no utilizadas, etc.)

ntfswipefuncionó bien en Linux. Puede obtener todos los bits no utilizados, como la información recuperada y el archivo eliminado, no solo el espacio libre.

Soporte para formatos de disco ext2 y ext3.

Para eso puedes usar zerofree.

Eso es tres de los cuatro formatos cubiertos. ¿Tiene alguna sugerencia para FAT32 también?
@mark no, lo siento, estos son solo los que encontré tratando de hacer lo mismo