Сжатие в btrFS

Многие из нас, вероятно, уже сталкивались с проблемой нехватки места для хранения данных. Может быть, вы хотите скачать большой файл из интернета или вам нужно быстро скопировать несколько фотографий с телефона. Несмотря на то, что дисковое пространство постоянно дешевеет, все больше устройств либо выпускаются с фиксированным объемом памяти, либо с трудом расширяются конечными пользователями.

Но что делать, когда места для хранения не хватает? Возможно, вы воспользуетесь облачным хранилищем или найдете какое-нибудь внешнее средство для хранения данных, которое можно носить с собой.

В этой статье я рассмотрю другое решение этой проблемы: прозрачное сжатие файловой системы, функцией, встроенная в Btrfs. В идеале, это решит ваши проблемы с хранением данных и при этом не потребует практически никаких изменений в вашей системе! Давайте посмотрим, как это сделать.

Прозрачное сжатие

Сначала давайте разберемся, что значит прозрачное сжатие. Вы можете сжимать файлы с помощью таких алгоритмов сжатия, как gzip, xz или bzip2. Обычно это явная операция: Вы берете утилиту сжатия и позволяете ей работать с вашим файлом. Хотя это обеспечивает экономию места, в зависимости от содержимого файла, у этого есть существенный недостаток: Когда вы захотите получить доступ к файлу, чтобы прочитать или изменить его, вам придется сначала распаковать его.

Это не только утомительный процесс, но и временная потеря экономии места, достигнутой ранее. Более того, в итоге сжимаются те части файла, которые вы вообще не собирались трогать. Очевидно, есть что-то лучше этого!

Прозрачное сжатие, с другой стороны, происходит на уровне файловой системы. Здесь сжатые файлы выглядят для пользователя как обычные несжатые файлы. Однако на диске они хранятся с примененным сжатием. Это работает потому, что файловая система выборочно распаковывает только те части файла, к которым вы обращаетесь, и обязательно сжимает их снова при записи изменений на диск.

Сжатие здесь прозрачно, так как оно не заметно для пользователя, за исключением, возможно, небольшого увеличения нагрузки на процессор во время доступа к файлу. Следовательно, его можно применять в существующих системах, не проводя аппаратных модификаций и не прибегая к облачному хранению.

Настройка сжатия в Btrfs

Прозрачное сжатие файловой системы в Btrfs настраивается несколькими способами:

  • Как опция монтирования при монтировании файловой системы (применяется ко всем подтомам одной файловой системы Btrfs)
  • С помощью свойств файлов Btrfs
  • Во время дефрагментации файловой системы btrfs (не постоянно, здесь не показано)
  • С помощью интерфейса атрибутов файлов chattr (здесь не показано)

Я рассмотрю только первые два из них.

Включение сжатия при монтировании

В Btrfs есть опция монтирования, которая включает сжатие файлов:

sudo mount -o compress=<ALGORITHM>:<LEVEL> ...

Например, чтобы смонтировать файловую систему и сжать ее алгоритмом zstd на уровне 3, нужно написать:

sudo mount -o compress=zstd:3 ...

Установка уровня сжатия необязательна. Важно отметить, что опция монтирования compress применяется ко всей файловой системе Btrfs и всем ее подтомам. Кроме того, это единственный поддерживаемый в настоящее время способ указать используемый уровень сжатия.

Для применения сжатия к корневой файловой системе, она должна быть указана в /etc/fstab. Программа установки Fedora Linux, например, по умолчанию включает сжатие zstd на уровне 1, что выглядит следующим образом в /etc/fstab:

cat /etc/fstab
[ ... ]
UUID=47b03671-39f1-43a7-b0a7-db733bfb47ff  /  btrfs   subvol=root,compress=zstd:1,[ ... ] 0 0

Включение сжатия для каждого файла

Другой способ указания сжатия – через свойства файловой системы Btrfs. Чтобы прочитать настройки сжатия для любого файла, папки или подтома, используйте следующую команду:

btrfs property get <PATH> compression

Так же вы можете настроить сжатие следующим образом:

sudo btrfs property set <PATH> compression <VALUE>

Например, чтобы включить сжатие zlib для всех файлов под /etc:

sudo btrfs property set /etc compression zlib

Вы можете получить список поддерживаемых значений с помощью man btrfs-property. Имейте в виду, что этот интерфейс не позволяет указать уровень сжатия. Кроме того, если свойство сжатия установлено, оно переопределяет другое сжатие, настроенное во время монтирования.

Сжатие существующих файлов

На данном этапе, если вы примените сжатие к существующей файловой системе и проверите использование пространства с помощью df -h или аналогичных команд, вы заметите, что ничего не изменилось. Это потому, что Btrfs сама по себе не «пересжимает» все существующие файлы. Сжатие происходит только при записи новых данных на диск. Есть несколько способов выполнить явную перекомпрессию:

  1. Ждать и ничего не делать: По мере изменения файлов и записи их обратно на диск Btrfs сжимает содержимое вновь записанных файлов в соответствии с настройками. В какой-то момент, если мы будем ждать достаточно долго, все большая часть наших файлов будет переписана и, следовательно, сжата.
  2. Переместите файлы в другую файловую систему и обратно: В зависимости от того, к каким файлам вы хотите применить сжатие, это может стать довольно утомительной операцией.
  3. Выполнить дефрагментацию Btrfs

Последний вариант, вероятно, самый удобный, но он сопровождается оговоркой для файловых систем Btrfs, которые уже содержат снимки: он нарушит общий объем между снимками. Другими словами, все общее содержимое между двумя моментальными снимками или моментальным снимком и его родительским субтомом будет присутствовать несколько раз после операции дефрагментации.

Следовательно, если в вашей файловой системе уже есть много снимков, не стоит запускать дефрагментацию всей файловой системы. В этом нет необходимости, поскольку в Btrfs вы можете дефрагментировать конкретные каталоги или даже отдельные файлы, если вы этого хотите.

Для выполнения дефрагментации вы можете использовать следующую команду:

sudo btrfs filesystem defragment -r /path/to/defragment

Например, вы можете дефрагментировать ваш домашний каталог следующим образом:

sudo btrfs filesystem defragment -r "$HOME"

В случае сомнений, хорошей идеей будет начать с дефрагментации отдельных больших файлов и продолжать со все более большими каталогами, контролируя свободное пространство в файловой системе.

Измерение сжатия файловой системы

В какой-то момент вам может стать интересно, сколько места вы сэкономили благодаря сжатию файловой системы. Но как это определить? Во-первых, чтобы определить, смонтирована ли файловая система Btrfs со сжатием, вы можете использовать следующую команду:

findmnt -vno OPTIONS /path/to/mountpoint | grep compress

Если вы получите результат, то файловая система в данной точке монтирования использует сжатие! Далее, с помощью команды compsize можно узнать, сколько места требуется вашим файлам:

sudo compsize -x /path/to/examine

В моем домашнем каталоге результат выглядит следующим образом:

sudo compsize -x "$HOME"
Processed 942853 files, 550658 regular extents (799985 refs), 462779 inline.
Type       Perc     Disk Usage   Uncompressed Referenced
TOTAL       81%       74G          91G         111G
none       100%       67G          67G          77G
zstd        28%      6.6G          23G          33G

В отдельных строках указывается «Тип» сжатия, примененного к файлам. «ИТОГО» – это сумма всех строк под ней. Колонки, с другой стороны, показывают, сколько места требуется нашим файлам:

  • «Disk Usage» – фактический объем памяти, выделенный на жестком диске,
  • «Uncompressed» – объем памяти, который потребовался бы файлам без применения сжатия,
  • «Referenced» – общий размер всех несжатых файлов.

«Referenced» может отличаться от цифр в «Uncompressed», если, например, ранее были дедуплицированы файлы, или если есть снимки, разделяющие экстенты. В приведенном выше примере видно, что несжатые файлы объемом 91 ГБ занимают на моем диске всего 74 ГБ! В зависимости от типа файлов, хранящихся в каталоге, и применяемого уровня сжатия эти цифры могут значительно отличаться.

Дополнительные замечания о сжатии файлов

Btrfs использует эвристический алгоритм для обнаружения сжатых файлов. Это делается потому, что сжатые файлы обычно сжимаются плохо, поэтому нет смысла тратить циклы процессора на попытки дальнейшего сжатия. Для этого Btrfs измеряет коэффициент сжатия при сжатии данных перед записью их на диск. Если первые части файла сжимаются плохо, файл помечается как несжимаемый и дальнейшего сжатия не происходит.

Если по какой-то причине вы хотите, чтобы Btrfs сжимала все записываемые данные, вы можете смонтировать файловую систему Btrfs с опцией compress-force, например, так:

sudo mount -o compress-force=zstd:3 ...

При такой конфигурации Btrfs будет сжимать все записываемые на диск данные алгоритмом zstd с уровнем сжатия 3.

Важно отметить, что файловая система Btrfs с большим объемом данных и включенным сжатием может монтироваться на несколько секунд дольше, чем без сжатия. Это имеет технические причины и является нормальным поведением, которое не влияет на работу файловой системы.

Заключение

В этой статье мы подробно рассмотрели прозрачное сжатие файловой системы в Btrfs. Это встроенный и сравнительно дешевый способ получить дополнительное место для хранения данных на существующем оборудовании без необходимости модификации.

Зарубин Иван Эксперт по Linux и Windows

Парашютист со стажем. Много читаю и слушаю подкасты. Люблю посиделки у костра, песни под гитару и приближающиеся дедлайны. Люблю путешествовать.

Вдохновлен fedoramagazine.org

Похожие статьи

Комментарии (0)