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:
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.
Comprimí este directorio usando .tar.gz que resultó en un archivo de tamaño
# du -s ./test.tar.gz 1672083116 ./test.tar.gz
- 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
- 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.