reiserfs raid montar btrfs shell file filesystems compression filesize

shell - raid - ¿Es posible obtener los tamaños comprimidos y sin comprimir de un archivo en un sistema de archivos btrfs?



montar btrfs (6)

¿Es posible determinar cuál es el tamaño comprimido (supongo que es lo que está listado por ls -l ) y el tamaño sin comprimir de los archivos en un btrfs archivos btrfs con compresión transparente habilitada?


Ejecute btrfs filesystem df /mountpoint .

Ejemplo de salida:

Data: total=2.01GB, used=1.03GB System, DUP: total=8.00MB, used=4.00KB System: total=4.00MB, used=0.00 Metadata, DUP: total=1.00GB, used=2.52MB Metadata: total=8.00MB, used=0.00

La línea clave comienza con Data: :; used= es el tamaño comprimido, y total= es el tamaño total como en un sistema de archivos sin comprimir. Creé un sistema de archivos de prueba, lo monté con la opción compress_force=zlib y copié 1GB de ceros a un archivo en el sistema de archivos; en ese punto, la línea Data: era Data: total=1.01GB, used=32.53MB (¡los ceros son bastante compresibles!). Luego volví a montar el sistema de archivos con la compresión deshabilitada, le copié otro GB de ceros y, en ese punto, la línea Data: total=2.01GB, used=1.03GB lectura Data: total=2.01GB, used=1.03GB .

Como se mencionó anteriormente, ls -l , por el contrario, muestra el tamaño sin comprimir .


El comando du genera el tamaño en disco de un archivo, independientemente del tipo de sistema de archivos, por ejemplo:

$ du -h * 732K file 512 file1 4.0M file2 $ du -B1 * 749568 file 512 file1 4091904 file2

El tamaño en el disco es igual al tamaño del archivo más el tamaño de sus metadatos, redondeado al tamaño de bloque del sistema de archivos. Los archivos no comprimidos generalmente tendrán un tamaño de disco un poco más grande que su tamaño real (conteo de bytes).

Como ya se dijo, ls -l muestra el tamaño sin comprimir. También puede ser reportado por du con la --apparent-size option ;

$ du --apparent-size -h * 826K file 64M file1 17M file2 $ du --apparent-size -B 1 * 845708 file 67108864 file1 16784836 file2

Tenga en cuenta que -B1 y --apparent-size son extensiones du específicas de GNU.

1 Parece que btrfs no sigue esta regla. Si esto es realmente cierto, mi entendimiento es que debería considerarse un error o, al menos, una no conformidad con POSIX .


Hay una herramienta de terceros que puede hacer esto.

https://github.com/kilobyte/compsize

uso:

ayush@devbox:/code/compsize$ sudo compsize /opt Processed 54036 files, 42027 regular extents (42028 refs), 27150 inline. Type Perc Disk Usage Uncompressed Referenced Data 82% 5.3G 6.4G 6.4G none 100% 4.3G 4.3G 4.3G zlib 37% 427M 1.1G 1.1G lzo 56% 588M 1.0G 1.0G


No puedo responder archivo por archivo, y @ catlover2 dio la respuesta para un sistema de archivos. Pero debe diferenciar entre el tamaño del bloque en el disco y el tamaño en el sistema de archivos (virtual), ls y du no puede ir más allá del sistema de archivos, por lo que no dan información sobre cuántos bloques de disco se utilizan, y @jiliagre --apparent-size aquí es inútil.

Para ilustrar mejor esta pregunta, hice una prueba con un solo archivo de sistema de archivos btrfs de 23G; Primero sin comprimir, luego lzo comprimido. El archivo de ejemplo es una imagen de máquina virtual y solo un nivel de compresión de 0.5. Muestra que solo el btrfs filesystem df y btrfs filesystem df puede mostrar la compresión.

$ lvcreate vg0 test_btrfs -L 30G Logical volume "test_btrfs" created $ mkfs.btrfs /dev/vg0/test_btrfs ... fs created label (null) on /dev/vg0/test_btrfs nodesize 16384 leafsize 16384 sectorsize 4096 size 30.00GiB $ mount /dev/vg0/test_btrfs /tmp/test_btrfs $ btrfs filesystem df /tmp/test_btrfs Data, single: total=8.00MiB, used=256.00KiB System, DUP: total=8.00MiB, used=16.00KiB System, single: total=4.00MiB, used=0.00 Metadata, DUP: total=1.00GiB, used=112.00KiB Metadata, single: total=8.00MiB, used=0.00 $ cp bigfile /tmp/test_btrfs $ btrfs filesystem df /tmp/test_btrfs Data, single: total=24.01GiB, used=22.70GiB System, DUP: total=8.00MiB, used=16.00KiB System, single: total=4.00MiB, used=0.00 Metadata, DUP: total=1.00GiB, used=23.64MiB Metadata, single: total=8.00MiB, used=0.00 $ btrfs filesystem df /tmp/test_btrfs ... unchanged! $ cd /tmp/test_btrfs/ $ ls -l bigfile -rw------- 1 root root 24367940096 May 4 15:03 bigfile $ du -B1 --apparent-size bigfile 24367940096 bigfile $ du -B1 bigfile 24367943680 bigfile $ btrfs filesystem defragment -c bigfile $ ls -l bigfile -rw------- 1 root root 24367940096 May 4 15:03 bigfile $ du -B1 --apparent-size bigfile 24367940096 bigfile $ du -B1 bigfile 24367943680 bigfile $ btrfs filesystem df /tmp/test_btrfs Data, single: total=24.01GiB, used=12.90GiB System, DUP: total=8.00MiB, used=16.00KiB System, single: total=4.00MiB, used=0.00 Metadata, DUP: total=1.00GiB, used=39.19MiB Metadata, single: total=8.00MiB, used=0.00 $ df -BG /tmp/test_btrfs Filesystem 1G-blocks Used Available Use% Mounted on /dev/mapper/vg0-test_btrfs 30G 13G 16G 47% /tmp/test_btrfs

La pregunta de @ gandalf3 aún no ha sido respondida, y quizás debamos esperar el desarrollo de btrfs (o ayudar a desarrollarlo) para obtener un bloque de discos subyacente adecuado para un archivo peculiar. Sería muy útil, me parece muy frustrante cuando monte un btrfs fs con compresión (sin fuerza ) sin saber si mis archivos están comprimidos o no y en qué nivel.


Puede crear un sistema de archivos Btrfs en un archivo, montarlo, copiar los archivos allí y ejecutar df:

$ dd if=/dev/zero of=btrfs.data size=1M count=1K $ mkdir btrfs $ mount btrfs.data btrfs -o compress ... copy the files to ./btrfs $ sync $ cd btrfs $ btrfs filesystem df .

Ejemplo de un solo archivo comprimido de 17MiB a 5MiB:

$ cd btrfs $ ls -l -rwx------ 1 atom atom 17812968 Oct 27 2015 commands.bin $ btrfs filesystem df . Data, single: total=1.01GiB, used=5.08MiB System, DUP: total=8.00MiB, used=16.00KiB Metadata, DUP: total=1.00GiB, used=112.00KiB GlobalReserve, single: total=16.00MiB, used=0.00B


También intentaba responder a esta pregunta, y esto es lo que he encontrado: du -s y df producen números diferentes. Así que hice algunas pruebas:

  1. He puesto un directorio de prueba en / home con un tamaño de aproximadamente 3TB. Es una copia parcial de todo el directorio de inicio con una mezcla típica de documentos, archivos de texto, imágenes y programas.

  2. Comprimí este directorio usando .tar.gz que resultó en un archivo de tamaño

# du -s ./test.tar.gz 1672083116 ./test.tar.gz

  1. Con este archivo existente en el sistema de archivos hice esto:

# du -s /home 11017624664 /home

# du --apparent-size -s /home 11010709168 /home

# df /home Filesystem 1K-blocks Used Available Use% Mounted on /dev/md2 31230406656 9128594488 22095200200 30% /home

Lo que significa que tenemos ((11017624664/(1024**2))/(9128594488/(1024**2))-1)*100 = 20% compresión

  1. Luego borré este archivo y obtuve esto:

# du -s /home 9348284812 /home

# du --apparent-size -s /home 9340957158 /home

# df /home Filesystem 1K-blocks Used Available Use% Mounted on /dev/md2 31230406656 7455549036 23764949364 24% /home

Con una relación de compresión del 25%. También a partir de esta información, llegué a la conclusión de que el archivo test.tar.gz con un tamaño real de 1592 G ocupado en el disco 1595 G. También noté que el uso de un --apparent-size produce una diferencia insignificante, probablemente debido al redondeo de tamaño de bloque.

Nota al margen, mi línea fstab para montar esta partición es:

UUID=be6...07fe /home btrfs defaults,compress=zlib 0 2

Resumen:

Para verificar la relación de compresión en una partición completa use estos dos comandos:

du -s /home df /home

Luego divide las salidas. Supongo que mi relación de compresión del 25% es un resultado típico de un compresor zlib.