Is it possible to get the compressed and uncompressed sizes of a file on a btrfs file system? Is it possible to get the compressed and uncompressed sizes of a file on a btrfs file system? shell shell

Is it possible to get the compressed and uncompressed sizes of a file on a btrfs file system?


there is a third party tool that can do this.

https://github.com/kilobyte/compsize

usage:

ayush@devbox:/code/compsize$ sudo compsize /optProcessed 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  


I am not able to answer on a file by file basis, and @catlover2 gave the answer for a filesystem. But you should differentiate between the block size on disk, and the size in the (virtual) filesystem, ls and du can not go beyond filesystem, so they give no informations on how many disk blocks are used, and @jiliagre --apparent-size is here useless.

To better illustrate this question, I have made a test with a single 23G file btrfs filesystem; first uncompressed, then lzo compressed. The example file is a virtual machine image and as only a compression level of 0.5. It shows that only df, and btrfs filesystem df can show the compression.

$   lvcreate vg0 test_btrfs -L 30GLogical 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_btrfsData, single: total=8.00MiB, used=256.00KiBSystem, DUP: total=8.00MiB, used=16.00KiBSystem, single: total=4.00MiB, used=0.00Metadata, DUP: total=1.00GiB, used=112.00KiBMetadata, single: total=8.00MiB, used=0.00$ cp bigfile /tmp/test_btrfs$ btrfs filesystem df /tmp/test_btrfsData, single: total=24.01GiB, used=22.70GiBSystem, DUP: total=8.00MiB, used=16.00KiBSystem, single: total=4.00MiB, used=0.00Metadata, DUP: total=1.00GiB, used=23.64MiBMetadata, 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 bigfile24367940096 bigfile$ du -B1 bigfile24367943680 bigfile$ btrfs filesystem defragment -c bigfile$ ls -l bigfile-rw------- 1 root root 24367940096 May  4 15:03 bigfile$ du -B1 --apparent-size bigfile24367940096 bigfile$ du -B1 bigfile24367943680 bigfile$ btrfs filesystem df /tmp/test_btrfsData, single: total=24.01GiB, used=12.90GiBSystem, DUP: total=8.00MiB, used=16.00KiBSystem, single: total=4.00MiB, used=0.00Metadata, DUP: total=1.00GiB, used=39.19MiBMetadata, single: total=8.00MiB, used=0.00$ df -BG /tmp/test_btrfsFilesystem                 1G-blocks  Used Available Use% Mounted on/dev/mapper/vg0-test_btrfs       30G   13G       16G  47% /tmp/test_btrfs

The question of @gandalf3 is still unanswered, and may be we need to wait for development of btrfs (or to help to develop it!) to get a proper underlying disks block du for a peculiar file. It would be very useful, I find very frustrating when I mount a btrfs fs with compression (without force) not knowing if my files are compressed or not and at which level.


In Ubuntu-18

apt install btrfs-compsizecompsize /mnt/btrfs-partition