Limpie el espacio no utilizado con ceros (ext3, ext4)

73

¿Cómo borrar el espacio no utilizado con ceros? (ext3, ext4)

Estoy buscando algo más inteligente que

cat /dev/zero > /mnt/X/big_zero ; sync; rm /mnt/X/big_zero

Al igual que FSArchiver está buscando "espacio usado" e ignora el sitio no utilizado, pero opuesto.

Propósito: Me gustaría comprimir las imágenes de partición, por lo que se recomienda llenar el espacio no utilizado con ceros.

Por cierto. Para btrfs: borre el espacio no utilizado con ceros (btrfs)

Grzegorz Wierzowiecki
fuente
1
Son posibles dos tipos diferentes de respuesta. ¿Qué estás intentando lograr? ¿ 1) seguridad, al prohibir que alguien lea esos datos, o 2) optimizar la compresión de toda la partición o [SSD performance] ( en.wikipedia.org/wiki/Trim_(computing) ?
Totor

Respuestas:

77

Tal utilidad es zerofree.

De su descripción:

Zerofree encuentra los bloques no asignados, no puestos a cero en un sistema de archivos ext2 o ext3 y los llena con ceros. Esto es útil si el dispositivo en el que reside este sistema de archivos es una imagen de disco. En este caso, dependiendo del tipo de imagen de disco, una utilidad secundaria puede reducir el tamaño de la imagen de disco después de ejecutar zerofree. Zerofree requiere que el sistema de archivos esté desmontado o montado de solo lectura.

La forma habitual de lograr el mismo resultado (poner a cero los bloques no utilizados) es ejecutar "dd", cree un archivo lleno de ceros que ocupe todo el espacio libre en la unidad y luego elimine este archivo. Esto tiene muchas desventajas, que zerofree alivia:

  • es lento
  • hace que la imagen del disco (temporalmente) crezca al máximo
  • (temporalmente) usa todo el espacio libre en el disco, por lo que otras acciones de escritura concurrentes pueden fallar.

Zerofree ha sido escrito para ejecutarse desde sistemas GNU / Linux instalados como SO invitados dentro de una máquina virtual. Si este no es su caso, es casi seguro que no necesite este paquete.

ACTUALIZACIÓN # 1

La descripción del paquete .deb contiene el siguiente párrafo ahora, lo que implicaría que esto también funcionará bien con ext4.

Descripción: cero bloques libres de los sistemas de archivos ext2, ext3 y ext4 Zerofree encuentra los bloques no asignados con contenido de valor distinto de cero en un sistema de archivos ext2, ext3 o ext4 y los llena con ceros ...

Otros usos

Otra aplicación de esta utilidad es comprimir imágenes de disco que son una copia de seguridad de un disco real. Un ejemplo típico de esto es el volcado de la tarjeta SD en un BeagleBone o un Raspberry Pi. Una vez que los espacios vacíos se han puesto a cero, las imágenes de respaldo se pueden comprimir de manera más eficiente.

enzotib
fuente
1
¿Es la página oficial de la herramienta intgat.tigress.co.uk/rmy/uml/index.html ? ¿Crees que es seguro usarlo con ext4?
Grzegorz Wierzowiecki
2
@GrzegorzWierzowiecki: sí, esa es la página, pero para Debian y sus amigos ya está en los repositorios. Utilicé en una partición ext4 en un disco virtual para reducir sucesivamente la imagen del archivo de disco, y no tuve ningún problema.
enzotib
1
Esto no es equivalente al ddmétodo crudo en la pregunta original, ya que no funciona en sistemas de archivos montados.
jlh
La página zerofree habla sobre un parche que le permite hacer "el sistema de archivos está montado con la opción zerofree" para que siempre borre los archivos eliminados continuamente. ¿esto requiere recompilar el núcleo entonces? ¿Hay alguna manera más fácil de lograr lo mismo?
Endolith
2
Tenga cuidado: perdí el sistema de archivos ext4 usando zerofreeAstralinux (basado en Debian) ...
Hubbitus
33

Resumen de los métodos (como se menciona en esta pregunta y en otras partes) para limpiar el espacio no utilizado en ext2 / ext3 / ext4:

Poner a cero el espacio no utilizado

El sistema de archivos no está montado

  • Si el "disco" en el que se encuentra su sistema de archivos es de aprovisionamiento delgado (por ejemplo, un SSD moderno que admite TRIM, un archivo VM cuyo formato admite escasez, etc.) y su núcleo dice que el dispositivo de bloque lo entiende, puede usarlo e2fsck -E discard src_fspara descartar el espacio no utilizado (requiere e2fsprogs 1.42.2 o superior).
  • Usar zerofree (p zerofree src_fs. Ej. ) Para escribir explícitamente ceros sobre bloques no utilizados.
  • Utilizando e2image -rap src_fs dest_fssolo para copiar bloques en uso (el nuevo sistema de archivos debe estar en un "disco" puesto a cero, requiere e2fsprogs 1.42.9 o superior).

El sistema de archivos está montado

  • Si el "disco" en el que se encuentra su sistema de archivos es de aprovisionamiento delgado (por ejemplo, un SSD moderno que admite TRIM, un archivo VM cuyo formato admite escasez, etc.), su kernel dice que el dispositivo de bloque lo comprende y finalmente el controlador del sistema de archivos ext lo admite, puede usarlo fstrim /mnt/fs/pedirle al sistema de archivos que descarte el espacio no utilizado.
  • Usando cat /dev/zero > /mnt/fs/zeros; sync; rm /mnt/fs/zeros( sfilldesde secure-delete usa esta técnica). Este método es ineficiente, no recomendado por Ted Ts'o (autor de ext4), puede no poner a cero ciertas cosas y puede ralentizar el futuro fsck.

Tener el sistema de archivos desmontado dará mejores resultados que tenerlo montado. El descarte tiende a ser el método más rápido cuando se necesita poner a cero una gran cantidad de espacio utilizado anteriormente, pero usarlo zerofreedespués del proceso de descarte a veces puede poner un poco más a cero (dependiendo de cómo se implemente el descarte en el "disco").

Hacer el archivo de imagen más pequeño

La imagen está en un formato VM dedicado

Necesitará usar una herramienta de imagen de disco adecuada (como qemu-img convert src_image dst_image) para permitir que se recupere el espacio a cero y para que el archivo que representa la imagen se vuelva más pequeño.

La imagen es un archivo sin procesar

Se puede usar una de las siguientes técnicas para hacer que el archivo sea escaso (por lo que las ejecuciones de cero dejan de ocupar espacio):

  • cp --sparse=always src_image dst_image.
  • fallocate -d src_image (requiere util-linux v2.25 o superior).

En estos días, podría ser más fácil usar una herramienta como virt-sparsify para realizar estos pasos y más de una vez.

 Fuentes

Luego
fuente
15

sfillfrom secure-delete puede hacer esto y muchos otros trabajos relacionados.

p.ej

sfill -l -l -z /mnt/X

ACTUALIZACIÓN # 1

Hay un árbol fuente que parece ser usado por el proyecto ArchLinux en github que contiene la fuente para la sfillcual se incluye una herramienta en el paquete Secure-Delete.

También hay una copia de sfillla página de manual de 's aquí:

cas
fuente
esa URL es obsoleta No tengo idea de dónde está ahora su página de inicio (o incluso si todavía tiene una), pero está empaquetada para Debian y Ubuntu. probablemente otras distribuciones también. si necesita código fuente, puede encontrarlo en los archivos de Debian si no puede encontrarlo en ningún otro lugar.
cas
La URL de la página de manual obsoleta se ha solucionado ahora. Parece que "Digipedia" ya no es una cosa.
mwfearnley
8

Si tiene e2fsprogs 1.42.9, puede usar e2imagepara crear la imagen de partición sin el espacio libre en primer lugar, para que pueda omitir el paso a cero.

psusi
fuente
No pude (fácilmente) encontrar información en línea sobre estos parámetros, pero de hecho se encuentran en las notas de la versión 1.42.9: e2fsprogs.sf.net/e2fsprogs-release.html#1.42.9
mwfearnley
1
Esa es una herramienta valiosa! Sin embargo, su respuesta sería mejor si también explicara cómo usarla. Es e2image -ar /dev/foo1 | gzip > fs.img.gz, o alguna variación de los mismos. Incluye -fpara usarlo en un fs montado.
marcelm
0

Puedes usar sfill. Es una mejor solución para volúmenes delgados.

usuario64219
fuente
Si desea comentar sobre cas answer, espere hasta tener suficiente reputación para hacerlo.
Anthon
1
Creo que la respuesta se refiere a manpages.ubuntu.com/manpages/lucid/man1/sfill.1.html ... que es al menos un intento de respuesta. ("en línea" en este caso significa "con el sistema de archivos montado", no "en la web").
derobert
0

Si no desea recurrir a herramientas adicionales, este método debería ser más rápido que cat /dev/zero > /mnt/fs/zeros:

dd if=/dev/zero of="/mnt/fs/filler" bs=10485760
dd if=/dev/zero of="/mnt/fs/filler1" bs=1
rm /mnt/fs/filler
rm /mnt/fs/filler1
Eadmaster
fuente
¿Por qué sería eso más rápido que cat? (No, el argumento de tamaño de bloque de ddno ayuda)
marcelm
2
Sí, pero eso no hace ddmás rápido. De hecho, probablemente hace catmás rápido. El tamaño del bloque solo es importante para minimizar la sobrecarga de las llamadas al sistema y optimizar el uso de la memoria caché de la CPU. Con la sobrecarga de syscall, ingresa al área de rendimientos decrecientes. La caché comienza a doler arriba, digamos, 1MiB. Y cuando se opera en discos reales, está vinculado a E / S de todos modos y el punto es principalmente discutible. Intenta compararlo tú mismo.
marcelm