====== BTRFS compression ====== [[https://btrfs.wiki.kernel.org/index.php/Compression]] Compression: * ZLIB -- slower, higher compression ratio (uses zlib level 3 setting) * LZO -- faster compression and decompression than zlib, worse compression ratio, designed to be fast * ZSTD -- (since v4.14) compression comparable to zlib with higher compression/decompression speeds and different ratio levels [[https://git.kernel.org/pub/scm/linux/kernel/git/mason/linux-btrfs.git/commit/?h=next&id=5c1aab1dd5445ed8bdcdbb575abc1b0d7ee5b2e7|details]] * NOTE: odler GRUB version cannot read ZSTD compressed files (from /boot) Default compression for kernels up to 3.6 it's ZLIB. For compatibility with old kernel ZLIB is default. LZO is fast and new algo, but can be buggy. [[https://btrfs.wiki.kernel.org/index.php/FAQ#Does_a_balance_operation_recompress_files.3F|Does a balance operation recompress files?]] >No. Balance moves entire file extents and does not change their contents. If you want to recompress files, use btrfs filesystem defrag with the -c option. >Balance does a defragmentation, but not on a file level rather on the block group level. It can move data from less used block groups to the remaining ones, eg. using the usage balance filter. NOTE: Defragmentation with recompression destroys deduplication. * Size changed from 6,94 GB to 7,39 GB * After deduplication with 1024k block drops to 7.17 GB (net change in shared extents of: 490.0M) * After deduplication with 4k block drops from 7.17 GB to 6,94 GB(a net change in shared extents of: 306.6M) ==== mount options ==== Can be enabled during mount time: mount BTRFS -o remount,compress=zlib mount BTRFS -o remount,compress-force=zlib > if the first portion of data being compressed is not smaller than the original, the compression of the file is disabled -- unless the filesystem is mounted with compress-force **compress-force=** - Enable compression even for files that don't compress well, like videos and dd images of disks. Test data of size 651MB takes 371MB after compression. ==== chattr +c ==== Also single file compression possible using ''chattr +c filename.txt'' To recompress exisitng files, start defragmentation with -c param: btrfs filesystem defrag -c file.iso btrfs filesystem defrag -c -r mydir It is not possible to get compression ratio of file. Internals: * In compressed extents, individual blocks are not compressed separately; rather, the compression stream spans the entire extent. * BTRFS: There is a simple decision logic: if the first portion of data being compressed is not smaller than the original, the compression of the file is disabled -- unless the filesystem is mounted with ''compress-force'' ==== btrfs property ==== btrfs property set compression