Сжатие BTRFS разработано так, чтобы эффективно вписаться в весь дизайн CopyOnWrite. Я использую оба вместе, и я могу подтвердить, что они не вызвали у меня никаких проблем.
Как они работают вместе: данные файла в BTRFS хранятся в экстентах, которые представляют собой длинные секции последовательных блоков. Все блоки имеют одинаковый размер, обычно 4 КБ, а размеры варьируются в зависимости от файла и свободного места. Например, если у вас есть файл размером 1 МБ, это может быть один экстент из 256 блоков, или это может быть два экстента из 113 блоков и 143 блоков. Или десятки экстентов всех разных размеров, в любой комбинации. Если вы измените один байт в середине файла, он скопирует экстент, содержащий измененный байт. Он может создать совершенно новый экстент или разделить этот экстент на три: два с каждой стороны измененного байта, которые указывают на исходные неизмененные блоки, и один с новыми данными.
Согласно вики btrfs, подходящее сжатие заключается в том, что сжатие выполняется по блокам (размер 4K), в группах блоков размером до 128K. Таким образом, файл не хранится в одном длинном сжатом потоке; он хранится в виде разделов сжатых кусков. Когда вы меняете один байт в середине файла, большая часть файла в сжатых блоках остается неизменной. Сжатый блок и, возможно, несколько блоков вокруг него до 128 КБ копируются и повторно сжимаются, а список экстентов обновляется, как и любая другая запись COW. В современных системах сжатие 4K или 128K является тривиальным, поэтому нет снижения производительности.
Поскольку настройка карты экстентов файла является обычной частью функциональности COW, нет существенной разницы в том, являются ли некоторые из блоков 4K сжатыми или несжатыми. (На самом деле, в BTRFS файл может содержать любую комбинацию несжатых блоков, сжатых блоков ZLIB и сжатых блоков LZO, в зависимости от того, какая опция сжатия была активна в файловой системе при обновлении частей файла.)
Я не делал никаких исчерпывающих исследований или измерений; это "просто работает", как я и ожидал.