it-swarm.dev

¿Cómo limpiar el espacio libre en disco en Linux?

Cuando se elimina un archivo, su contenido aún se puede dejar en el sistema de archivos, a menos que se sobrescriba explícitamente con otra cosa. El comando wipe puede borrar archivos de forma segura, pero parece que no permite borrar el espacio libre en el disco que no utilizan los archivos.

¿Qué debo usar para lograr esto?

141
Alex B

Advertencia:El hardware moderno del disco/SSD y los sistemas de archivos modernos pueden eliminar datos en lugares donde no se pueden eliminar, por lo que este proceso aún puede dejar datos en el disco. La única Las formas seguras de borrar datos son el comando de borrado seguro ATA (si se implementó correctamente) o la destrucción física. También vea ¿Cómo puedo borrar de manera confiable toda la información en un disco duro?

Puedes usar un conjunto de herramientas llamadas secure-delete.

Sudo apt-get install secure-delete

Esto tiene cuatro herramientas:

srm - borra de forma segura un archivo existente
smem - borra de forma segura los rastros de un archivo desde el ram
sfill - borra todo el espacio marcado como vacío en su disco duro
sswap - borra todos los datos de tu espacio de intercambio.

De la página man de srm

srm está diseñado para eliminar datos en medios de manera segura que no pueden ser recuperados por ladrones, agentes de la ley u otras amenazas. El algoritmo de borrado se basa en el documento "Eliminación segura de datos de la memoria magnética y de estado sólido" presentado en el Sexto Simposio de Seguridad de Usenix por Peter Gutmann, uno de los principales criptógrafos civiles.

El proceso de eliminación segura de datos de srm es así:

  • 1 pase con 0xff
  • 5 pases aleatorios. /dev/urandom se usa para un RNG seguro si está disponible.
  • 27 pases con valores especiales definidos por Peter Gutmann.
  • 5 pases aleatorios. /dev/urandom se usa para un RNG seguro si está disponible.
  • Renombra el archivo a un valor aleatorio
  • Truncar el archivo

Como medida adicional de seguridad, el archivo se abre en modo O_SYNC y, después de cada paso, se realiza una llamada a fsync(). srm escribe bloques de 32k con el propósito de la velocidad, rellenando buffers de cachés de disco para obligarlos a vaciar y sobrescribiendo los datos antiguos que pertenecían al archivo.

105
fnord_ix

La forma más rápida, si solo necesita una sola pasada y simplemente quiere reemplazar todo con ceros, es:

cat /dev/zero > zero.file
sync
rm zero.file

(Ejecutar desde un directorio en el sistema de archivos que desea borrar)
(el comando sync es una medida de paranoia que garantiza que todos los datos se escriben en el disco; un administrador de caché inteligente podría resolver que puede cancelar las escrituras de cualquier bloque pendiente cuando el archivo no esté vinculado)

Habrá un tiempo durante esta operación en el que no habrá espacio libre en absoluto en el sistema de archivos, que puede ser de decenas de segundos si el archivo resultante es grande y está fragmentado, por lo que demora un tiempo en eliminarlo. Para reducir el tiempo cuando el espacio libre es completamente cero:

dd if=/dev/zero of=zero.small.file bs=1024 count=102400
cat /dev/zero > zero.file
sync
rm zero.small.file
rm zero.file

Esto debería ser suficiente para evitar que alguien lea el contenido del archivo anterior sin una operación forense costosa. Para una variante ligeramente más segura, pero más lenta, reemplaza /dev/zero con /dev/urandom. Para más paranoia, ejecute varios pasos con /dev/urandom, aunque si necesita mucho esfuerzo, la utilidad shred del paquete coreutils es el camino a seguir:

dd if=/dev/zero of=zero.small.file bs=1024 count=102400
shred -z zero.small.file
cat /dev/zero > zero.file
sync
rm zero.small.file
shred -z zero.file
sync
rm zero.file

Tenga en cuenta que en el archivo anterior, el archivo pequeño se destruye antes de crear el archivo más grande, por lo que puede eliminarse tan pronto como el archivo más grande esté completo, en lugar de tener que esperar a que se destruya dejando el sistema de archivos sin espacio libre por el tiempo necesario. El proceso de trituración lleva un tiempo de largo sobre un archivo grande y, a menos que esté tratando de ocultar algo de la NSA, no es realmente necesario IMO.

Todo lo anterior debería funcionar en cualquier sistema de archivos.

Límites de tamaño de archivo:

Como señala DanMoulding en un comentario a continuación, esto puede tener problemas con la limitación de tamaño de los archivos en algunos sistemas de archivos.

Para FAT32 sería definitivamente una preocupación debido al límite de archivos de 2GiB: la mayoría de los volúmenes son más grandes que esto en estos días (8TiB es el límite de tamaño de volumen IIRC). Puede solucionar esto al canalizar la salida grande de cat /dev/zero a través de split para generar múltiples archivos más pequeños y ajustar las etapas de eliminación y eliminación en consecuencia.

Con ext2/3/4 no es tan preocupante: con el bloqueo predeterminado/común de 4K, el límite de tamaño del archivo es de 2TiB, por lo que tendría que tener un volumen enorme para que esto sea un problema (el el volumen máximo en estas condiciones es de 16TiB).

Con los btrfs (aún experimentales), tanto el tamaño máximo de archivo como el volumen son 16EiB masivos.

Bajo NTFS, la longitud máxima del archivo es mayor que la longitud máxima del volumen en algunos casos incluso.

Puntos de partida para más información:
http://en.wikipedia.org/wiki/Ext3#Size_limits
http://en.wikipedia.org/wiki/Btrfs
http://en.wikipedia.org/wiki/Ntfs#Scalability

Dispositivos virtuales

Como se mencionó recientemente en los comentarios, existen consideraciones adicionales para los dispositivos virtuales:

  • Para los discos virtuales con poca asignación, otros métodos, como los que usa zerofree, serán más rápidos (aunque a diferencia de cat y dd, esta no es una herramienta estándar en la que puede confiar que esté disponible en prácticamente cualquier sistema operativo unix).

  • Tenga en cuenta que poner a cero un bloque en un dispositivo virtual disperso puede que no borre el bloque en el dispositivo físico subyacente, de hecho, me atrevería a decir que es poco probable que lo haga. El bloque ya no se usa, por lo que puede asignarse a otra cosa más adelante.

  • Incluso para dispositivos virtuales de tamaño fijo, es posible que no tenga control de dónde vive físicamente el dispositivo, por lo que podría moverse alrededor de su ubicación actual o en un nuevo conjunto de discos físicos en cualquier momento y lo máximo que puede borrar es la ubicación actual, no cualquier ubicación anterior que el bloque haya residido en el pasado.

  • Para los problemas anteriores en los dispositivos virtuales: a menos que controle el (los) Host (es) y pueda hacer una limpieza segura de su espacio no asignado luego de borrar los discos en el VM o mover el dispositivo virtual, no hay nada que pueda hacer. Se puede hacer al respecto después del hecho. El único recurso es usar el cifrado completo del disco desde el principio para que no se encripte nada en el medio físico en primer lugar. Puede que todavía haya una llamada para borrar el espacio libre dentro del VM por supuesto. Tenga en cuenta también que FDE puede hacer que los dispositivos virtuales dispersos sean mucho menos útiles, ya que la capa de virtualización no puede ver realmente qué bloques no se utilizan. Si la capa del sistema de archivos del sistema operativo envía comandos de recorte al dispositivo virtual (como si fuera un SSD), y el controlador virtual los interpreta, eso puede resolverlo, pero no conozco ninguna circunstancia en la que esto ocurra realmente. la discusión de eso es un tema para otra parte (ya nos estamos acercando a estar fuera del tema para la pregunta original, por lo que si esto ha despertado su interés, es posible que haya algunas preguntas de experimentación y/o seguimiento).

69
David Spillett

ADVERTENCIA

Me sorprendió la cantidad de archivos photorec que se pudieron recuperar de mi disco, incluso después de limpiarlos.

Si hay más seguridad para llenar el "espacio libre" solo 1 vez con 0x00 o 38 veces con diferentes estándares cabalísticos es más una discusión académica. El autor del artículo seminal de 1996 sobre la trituración se escribió a sí mismo un epílogo diciendo que esto es obsoleto e innecesario para el hardware moderno. No hay un caso documentado de datos que sean reemplazados físicamente por ceros y recuperados posteriormente.

El verdadero enlace frágil en este procedimiento es el sistema de archivos . Algunos sistemas de archivos reservan espacio para uso especial, y no está disponible como "espacio libre". Pero tus datos pueden estar allí . Eso incluye fotos, correos electrónicos personales de texto plano, lo que sea. Acabo de buscar en google reservado + espacio + ext4 y aprendí que el 5% de mi partición home estaba reservada. Supongo que aquí es donde photorec encontró muchas de mis cosas. Conclusión: el método de trituración no es el más importante, incluso el método de varias pasadas todavía deja los datos en su lugar .

Puedes probar # tune2fs -m 0 /dev/sdn0 antes de montarlo. (Si esta será la partición raíz después de reiniciar, asegúrese de ejecutar -m 5 o -m 1 después de desmontarla).

Pero aún así, de una forma u otra, puede quedar algo de espacio.

La única forma realmente segura es borrar toda la partición, crear un sistema de archivos nuevamente y luego restaurar sus archivos desde una copia de seguridad.


Camino rápido (recomendado)

Ejecutar desde un directorio en el sistema de archivos que desea borrar:

dd if=/dev/zero of=zero.small.file bs=1024 count=102400
dd if=/dev/zero of=zero.file bs=1024
sync ; sleep 60 ; sync
rm zero.small.file
rm zero.file

Notas: el propósito del archivo pequeño es reducir el tiempo cuando el espacio libre es completamente cero; el propósito de la sincronización es asegurarse de que los datos estén realmente escritos.

Esto debería ser lo suficientemente bueno para la mayoría de las personas.

Camino lento (paranoico)

No hay un caso documentado de datos recuperados después de la limpieza anterior. Sería caro y exigiría muchos recursos, de ser posible.

Sin embargo, si tiene una razón para pensar que las agencias secretas gastarían muchos recursos para recuperar sus archivos, esto debería ser suficiente:

dd if=/dev/urandom of=random.small.file bs=1024 count=102400
dd if=/dev/urandom of=random.file bs=1024
sync ; sleep 60 ; sync
rm random.small.file
rm random.file

Lleva mucho más tiempo.

Advertencia. Si ha elegido la forma paranoica, después de esto todavía querrá hacer la limpieza rápida, y eso no es paranoia. La presencia de datos puramente aleatorios es fácil y económica de detectar, y plantea la sospecha de que en realidad son datos cifrados. Puede morir bajo tortura por no revelar la clave de descifrado.

Camino muy lento (paranoico loco)

Incluso el autor del artículo seminal de 1996 sobre trituración escribió un epílogo diciendo que esto es obsoleto e innecesario para el hardware moderno.

Pero si aún tienes mucho tiempo libre y no te importa perder tu disco con mucha sobrescritura, ahí va:

dd if=/dev/zero of=zero.small.file bs=1024 count=102400
sync ; sleep 60 ; sync
shred -z zero.small.file
dd if=/dev/zero of=zero.file bs=1024
sync ; sleep 60 ; sync
rm zero.small.file
shred -z zero.file
sync ; sleep 60 ; sync
rm zero.file

Nota: esto es esencialmente equivalente a usar la herramienta de eliminación segura.


Antes de la edición, esta publicación fue una reescritura de David Spillett. El comando "cat" genera un mensaje de error, pero no puedo escribir comentarios en las publicaciones de otras personas.

44
user39559

Hay una utilidad zerofree al menos en Ubuntu:

http://manpages.ubuntu.com/manpages/natty/man8/zerofree.8.html

   zerofree — zero free blocks from ext2/3 file-systems

   zerofree  finds  the  unallocated, non-zeroed blocks in an ext2 or ext3
   filesystem (e.g. /dev/hda1) and fills them with zeroes. This is  useful
   if  the  device  on  which this file-system resides is a disk image. In
   this case, depending on the type of disk image, a secondary utility may
   be  able  to  reduce the size of the disk image after zerofree has been
   run.

   The usual way to achieve  the  same  result  (zeroing  the  unallocated
   blocks)  is to run dd (1) to create a file full of zeroes that takes up
   the entire free space on the drive, and then delete this file. This has
   many disadvantages, which zerofree alleviates:

      ·  it is slow;

      ·  it makes the disk image (temporarily) grow to its maximal extent;

      ·  it  (temporarily)  uses  all  free  space  on  the disk, so other
         concurrent write actions may fail.

   filesystem has to be unmounted or mounted  read-only  for  zerofree  to
   work.  It  will exit with an error message if the filesystem is mounted
   writable. To remount the  root  file-system  readonly,  you  can  first
   switch to single user runlevel (telinit 1) then use mount -o remount,ro
   filesystem.

También puedes ver este enlace sobre zerofree: Mantener las imágenes del sistema de archivos dispersas - es de su autor - Ron Yorston (9 de agosto de 2012)

27
osgx

Aquí es cómo hacerlo con una GUI.

  1. Instalar BleachBit
  2. Ejecute como root haciendo clic en Aplicaciones - Herramientas del sistema - BleachBit como administrador.
  3. En las preferencias, dile qué caminos quieres. Generalmente los adivina bien. Desea incluir una ruta de escritura para cada partición. Por lo general, es/home/username y/tmp, a menos que sean la misma partición, en cuyo caso simplemente elija una.
  4. Marque la casilla Sistema - Limpiar espacio en disco libre.
  5. Haga clic en Eliminar.

El avance de BleachBit sobre dd (que de lo contrario es muy bueno) es cuando el disco está finalmente lleno, BleachBit crea pequeños archivos para borrar los inodos (que contienen metadatos como nombres de archivos, etc.).

3
Andrew Z

Puede borrar su espacio libre usando el paquete de eliminación segura.

En ese paquete puede encontrar la herramienta sfill, que está diseñada para eliminar los datos que se encuentran en el espacio de disco disponible en los medios de manera segura y que no pueden ser recuperados por ladrones, agentes del orden u otras amenazas.

Para instalar el paquete de eliminación segura en Linux (Ubuntu), instálelo con el siguiente comando:

$ Sudo apt-get install secure-delete

Luego, para borrar sus datos sin espacio libre, pruebe el siguiente comando:

sfill -f -v -ll /YOUR_MOUNTPOINT/OR_DIRECTORY

Donde/YOUR_MOUNTPOINT/OR_DIRECTORY es su punto de montaje (df -h, mount) o directorio para borrar el espacio libre.

Lea el manual en http://manpages.ubuntu.com/manpages/hardy/man1/sfill.1.html

2
kenorb

Limpie un disco a la velocidad máxima.

Las instrucciones típicas para cifrar un disco hoy en día le indicarán que primero limpie el disco con un WIPE.

El siguiente comando llenará su disco con el texto cifrado AES.

Use un CD en vivo si necesita limpiar su unidad de arranque principal.

Abre una terminal y eleva tus privilegios:

Sudo bash

Vamos a enumerar todas las unidades en el sistema para estar seguro:

cat /proc/partitions

NOTA: Reemplace /dev/sd{x} con el dispositivo que desea borrar.

ADVERTENCIA: ¡Esto no es para aficionados! Podrías hacer que tu sistema no arranque!

Sudo openssl enc -aes-256-ctr -pass pass:"$(dd if=/dev/urandom bs=128 count=1 2>/dev/null | base64)" -nosalt < /dev/zero > /dev/sd{x}

Estoy sorprendido por lo rápido que es esto.

2
Roger Lawhorn

Utilizo dd para asignar uno o más archivos grandes para llenar el espacio libre, luego uso una utilidad de eliminación segura.

Para asignar archivos con dd intente:

dd if=/dev/zero of=delete_me bs=1024 count=102400

Esto generará un archivo llamado delete_me que tiene un tamaño de 100 MB. (Aquí bs es el "tamaño de bloque" establecido en 1k, y count es el número de bloques para asignar).

Luego use su utilidad de eliminación segura favorita (he estado usando shred ) en los archivos así creados.

Pero TENGA EN CUENTA: buffering significa que incluso si hace el disco completo, es posible que no obtenga absolutamente todo.


Este enlace recomienda scrub para la eliminación de espacio libre. No lo he intentado.

2
dmckee

Probablemente ya tenga el paquete GNU coreutils instalado en su sistema. Proporciona el comando triturar .

2
dkaylor

Más fácil es usar scrub :

scrub -X dump

Esto creará una carpeta dump en la ubicación actual y creará un archivo hasta que el disco esté lleno. Puede elegir un patrón con la opción -p (nnsa|dod|bsi|old|fastold|gutmann).

No es fácil instalar Scrub ( ver los foros de Ubuntu en este ), pero una vez que se realiza la instalación, tienes una herramienta realmente SENCILLA y eficiente en tus manos.

1
FMaz008

Encontré una solución simple que funciona en Linux y en MacOS. Muévase en la carpeta raíz de su disco y ejecute este comando:

for i in $(seq 1 //DISKSPACE//); do dd if=/dev/zero of=emptyfile${i} bs=1024 count=1048576; done; rm emptyfile*;

donde // DISKSPACE // es el tamaño en GB de su disco duro.

1
Enrico

use dd y solo ponga a cero el espacio libre. Es un mito. Los datos deben ser sobreescritos varias veces (solo pregunte a Peter Guntmann) y los datos aleatorios, en oposición a 1, entonces 0 implica actividad no natural. El resultado final es una unidad limpia con mucho menos tiempo de escritura. además, los programas de eliminación segura no pueden garantizar que incluso sobrescriban el archivo real en los sistemas de archivos modernos (registrados por diario). hazte un favor y obtén photorec, escanea tu disco para ver el desorden, límpialo con 1 y, opcionalmente, con ceros para que se vea intacto. Si photorec sigue encontrando cosas, recuerde que está escaneando todo lo disponible, así que hágalo con cuidado nuevamente con el usuario root.

recuerde, el cia/fbi/nsa no tiene una máquina elegante que pueda leer el estado real de sus bits de medios magnéticos. eso fue todo un papel escrito hace mucho tiempo. un "qué pasa si". Solo necesitas limpiar 1 vez.

1
fred

Aquí está el script "sdelete.sh" que uso. Ver comentarios para más detalles.

# Install the secure-delete package (sfill command).

# To see progress type in new terminal:
# watch -n 1 df -hm

# Assuming that there is one partition (/dev/sda1). sfill writes to /.
# The second pass writes in current directory and synchronizes data.
# If you have a swap partition then disable it by editing /etc/fstab
# and use "sswap" or similar to wipe it out.

# Some filesystems such as ext4 reserve 5% of disk space
# for special use, for example for the /home directory.
# In such case sfill won't wipe out that free space. You
# can remove that reserved space with the tune2fs command.
# See http://superuser.com/a/150757
# and https://www.google.com/search?q=reserved+space+ext4+sfill

Sudo tune2fs -m 0 /dev/sda1
Sudo tune2fs -l /dev/sda1 | grep 'Reserved block count'

Sudo sfill -vfllz /

# sfill with the -f (fast) option won't synchronize the data to
# make sure that all was actually written. Without the fast option
# it is way too slow, so doing another pass in some other way with
# synchronization. Unfortunately this does not seem to be perfect,
# as I've watched free space by running the "watch -n 1 df -hm"
# command and I could see that there was still some available space
# left (tested on a SSD drive).

dd if=/dev/zero of=zero.small.file bs=1024 count=102400
dd if=/dev/zero of=zero.file bs=1024
sync ; sleep 60 ; sync
rm zero.small.file
rm zero.file

Sudo tune2fs -m 5 /dev/sda1
Sudo tune2fs -l /dev/sda1 | grep 'Reserved block count'
1
Czarek Tomczak

¡Esto no es una respuesta! Solo un comentario para aquellos que deseen usar pv... así que no se moleste en votar.

En Linux Mint 17.3 puede usar pv ( pipe view ) para avanzar en la escritura. Por ejemplo:

# Install pv (pipe view)
Sudo apt-get install pv

# Write huge file of approximate size of /dev/sdb, using urandom data:
pv --timer --average-rate --progress --numeric --eta --interval 5 --size "$(blockdev --getsize64 /dev/sda )" /dev/urandom >Rand.file

La ventaja aquí es que obtiene una barra de progreso, ETA y una velocidad de datos actualizada continuamente. La desventaja es que esto se escribe en una línea y cuando el disco está lleno (devolviendo un error) desaparece. Esto sucede porque el tamaño completo es aproximado, ya que es probable que el sistema operativo use el disco mientras se lleva a cabo esta operación muy larga, especialmente en el volumen del sistema operativo.

En un HD muy antiguo, obtengo una tasa de datos de 13 MB/s usando /dev/urandom, y de 70 MB/s , cuando uso /dev/zero. Esto probablemente mejoraría aún más al usar una variable dd o cat, y no pv.

0
not2qubit

A veces uso este bash one-liner:

while :; do cat /dev/zero > zero.$RANDOM; done

Cuando empiece a decir que el disco está lleno, simplemente presione Ctrl+C y elimine los archivos zero.* creados.

Funciona en cualquier sistema, independientemente de los límites de tamaño de archivo.
Ignora cualquier error cat: write error: File too large.

0
Nicolas Raoul