Limpie el espacio no utilizado con ceros (btrfs)

10

¿Cómo borrar el espacio no utilizado con ceros? (Estoy pidiendo una herramienta para el sistema de archivos btrfs )

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 ext3, ext4: Limpie el espacio no utilizado con ceros (ext3, ext4) . Aquí pido btrfs

Aclaración de "algoritmo más inteligente": como veo que "algoritmo más inteligente" genera confusión, aquí finalmente decidí agregar una línea al respecto. Estimado lector, piense en el sistema de archivos como estructura de datos. Para fines de simplificación, imaginemos el mapa de retención de árbol rojo-negro autobalanceado, que se usa como clave de asociación-> matriz de valores, donde los valores son enteros. El objetivo es borrar todos los valores negativos con ceros. El algoritmo "no inteligente" iterará sobre él y agregará pares clave: valor al nuevo mapa (con eventuales alteraciones negativas a cero). El algoritmo inteligente solo detectará los lugares donde se almacenan los valores negativos y los eliminará en el lugar .

Grzegorz Wierzowiecki
fuente
2
¿Intentaste la sfillsugerencia ? Parece que no requiere extX.
Kevin
1. Sé que puedes llenar archivos existentes con ceros con trituración, pero esto probablemente no sea así, ¿verdad? 2. ¿Cómo estás haciendo esas imágenes? ¿Quizás puedas hacer el truncamiento allí?
Zlatko
@kevin: por eso publiqué la respuesta completa en la pregunta original. Raramente uso yo mismo los sistemas de archivos ext2,3,4, así que las utilidades que funcionan solo en ext * son molestamente inútiles.
cas
Necesito algo "inteligente". Algo que solo llena el espacio vacío con ceros sin tocar otros lugares; quiero decir, sin afectar las estructuras de datos internas, como B-Trees (si tienes curiosidad, he escrito en cuestión "compresión" pero también lo necesito para otros fines, como desduplicación, análisis e investigación de imágenes fs)
Grzegorz Wierzowiecki
solo use truncatey / ofallocate
mikeserv

Respuestas:

4

Aquí hay un cambio modificado y mucho más extendido de mi respuesta a su pregunta anterior:

sfilldesde el secure-deletepaquete puedes hacer lo que quieras.

A diferencia de zerofree (que funciona solo con los sistemas de archivos ext2, ext3 y ext4), sfill funcionará con cualquier sistema de archivos.

p.ej

sfill -l -l -z /mnt/X

La página de inicio sfill / secure-delete ahora parece haberse desvanecido, 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.

NOTA: sfill solo funciona en un sistema de archivos montado. Si no llena los archivos de imagen desde el sistema host en lugar de hacerlo desde una VM, deberá montar la imagen fs en el host. El método exacto varía según el tipo de archivo de imagen que sea (por ejemplo, qcow2 o raw).

Montar imágenes 'en bruto' es fácil y directo. Simplemente use kpartxel archivo de imagen para crear un dispositivo de bucle invertido y / dev / mapper / entradas para cada partición se pueden montar individualmente.

Aquí hay una secuencia de comandos parcial modificada a partir de un fragmento de la secuencia de comandos que utilizo para montar imágenes de disco duro de red libre de arranque (utilizado para actualizaciones de BIOS en máquinas donde flashrom no funcionará):

image="myrawimagefile.img"

# use kpartx to build /dev/mapper device nodes
KP=$(kpartx -a -v "$image")

# now mount each partition under ./hd/
for p in $(echo "$KP" | awk '/^add map/ {print $3}') ; do
  dm="/dev/mapper/$p"
  fp=$(echo "$p" | sed -r -e 's/^loop[0-9]+//')
  mkdir -p "./hd/$fp"
  mount "$dm" "./hd/$fp"
  sfill -l -l -v "./hd/$fp"
  umount "$dm"
done

# now remove the loopback device and /dev/mapper entries
kpartx -d "$image"

NOTA: se supone que cada partición de la imagen se puede montar. Es cierto en mi caso de uso (una imagen HD de Freedos con una partición). no es cierto si una de las particiones es, digamos, espacio de intercambio. Detectar tales particiones y usar dd para poner a cero la partición de intercambio se deja como ejercicio para el lector :)

Este método, o una variante del mismo, también debería funcionar para volúmenes LVM.

Si sus imágenes son qcow, entonces puede usar la qemu-nbdherramienta del qemu-utilspaquete, que presentará el archivo de imagen y sus particiones como dispositivos de bloqueo de red, por ejemplo / dev / nbd0 / dev / ndb0p1, que puede usarse de manera similar a / dispositivos dev / mapper anteriores.

Es posible que sea más fácil y menos complicado (pero más lento) usar qemu-imgpara convertir de qcow a raw, usar el método para raw anterior y luego convertir la imagen raw modificada de nuevo a qcow2 comprimido. Esto probablemente dará como resultado imágenes un poco más pequeñas que el uso de qemu-nbd, ya que comprimirá la nueva imagen qcow2 mientras se crea.

cas
fuente
1
Lo que quiero decir es, que se no considera "inteligente" manera de llenar el espacio no utilizado con ceros. Es la forma más obvia y típica de hacer esto. No estoy preguntando sobre cosas así.
Grzegorz Wierzowiecki
1
Describa un algoritmo "inteligente" que no sea específico de una familia de sistemas de archivos en particular (como zerofill es para ext2 / 3/4). Querías un programa que pudiera hacer el trabajo. No dijiste que tenía que ser mágico también.
cas
1
y, en realidad, si el sistema de archivos no está en uso (porque, por ejemplo, está montado en el host para el relleno por cero), ¿qué importa qué tan inteligente sea el algoritmo? Navegar por los metadatos de fs buscando sectores vacíos no va a ser más rápido o mejor que simplemente escribir un gran relleno lleno de NUL ... el sistema de archivos en sí mismo es lo suficientemente inteligente como para descubrir dónde está el espacio vacío.
cas
2
Por un lado, para sus necesidades es suficiente, por lo que mi pregunta ya contiene un fragmento de código con esta solución, por lo que su respuesta no proporciona nada nuevo. Por otro lado, mis necesidades requieren lo que especifico, porque quiero borrar el espacio no utilizado con ceros sin modificar las estructuras internas (por ejemplo, reequilibrar "Dancing B-Trees" u otro tipo de estructura de datos (por ejemplo, para análisis y deduplicación) propósitos)
Grzegorz Wierzowiecki
2
@cas: creo que te estás perdiendo el hecho de que el relleno cero es un paso esencial antes de compactar discos duros virtuales en máquinas virtuales. Si tiene un disco expansivo de 500 GB, con 10 GB de archivos y 10 GB de espacio "vacío" (es decir, archivos eliminados), ejecutar el enfoque ingenuo de "archivo cero gigante" tomará MUCHO más tiempo y requerirá que el VHD se hinche hasta los 500 GB completos Apuesto a que el OP está asumiendo que la utilidad también debe ser específica de FS.
Nombre falso
3

La forma correcta e "inteligente" de limpiar el espacio libre es usando:

fstrim /mountpoint

Use esto en un sistema de archivos montado.

Es importante tener en cuenta que esto no tiene ventajas de seguridad. Si desea limpiar su disco por seguridad, haga una copia de seguridad de sus archivos, ponga a cero todo el disco con un comando como "triturar" y luego restaure sus archivos.

Sin embargo, la solución funciona bien si su disco es una provisión delgada en un sistema de archivos disperso y desea recuperar el espacio no utilizado.

DustWolf
fuente