LINUX.ORG.RU

Дедупликация в Btrfs

 ,

Дедупликация в Btrfs

4

5

Btrfs — это замечательная файловая система, главными фишками которой являются легковесные снапшоты, реализуемые через Copy-On-Write (COW), и сжатие. Она показала высокую надежность и стабильность, и именно поэтому она включена в ядро Linux. Однако, даже наличие COW не позволяет избежать избыточности данных на уровне блоков.

Как возникает дублирование данных?

Дубликаты данных могут существовать, даже если не используются снапшоты

Типичная ситуация:

Когда вы обновляете пакет и создаете снимок файловой системы, фиксируется текущее состояние данных. Затем, если вы снова скачиваете обновление, оно может содержать почти те же самые данные, как предыдущее, с небольшими изменениями. Механизм Copy-On-Write отслеживает изменение файлов, помогая избежать дублирования блоков данных. Но простое переименование файла или его перемещение в другое место при обновлении (установка по другому пути) ломают этот механизм: и уже появляются одинаковые блоки с данными. С каждым новым обновлением и снимком количество таких одинаковых данных увеличивается. Эти дубликаты занимают место на диске, пока вы не удалите старые снимки, либо не выполните дедупликацию.

Дедупликация

Дедупликация — это процесс нахождения дубликатов данных и их удаления.

Существует два основных типа дедупликации:

  • In-band (онлайн) — когда данные перед записью проверяются на существование дубликатов. Такой метод требует значительных вычислительных ресурсов и памяти.
  • Out-of-band (офлайн) — дедупликация происходит после записи и является менее затратной по ресурсам.

Btrfs, в отличие от ZFS, реализует только офлайн-дедупликацию.

Сам Btrfs (обычно пакет btrfs-progs) не имеет встроенных утилит для дедупликации, но предоставляет все необходимые средства для ее реализации сторонними утилитами.

Дедупликация бывает на уровне файлов и на уровне блоков. Чтобы найти и удалить одинаковые файлы, вы, конечно, можете использовать duperemove. Но у него применение довольно специфическое, что делает его практически бесполезным для наших целей, тем более cp в Btrfs не приводит к реальному копированию данных (копии файлов ничего не весят). Строго говоря, Btrfs работает не с файлами, а с блоками данных (экстентами), поэтому и дедупликацию в ней нужно проводить на этом уровне. Для этих целей и существует bees.

Bees — блочный дедупликатор

BEES — это не пчелы, а аббревиатура от Best-Effort Extent-Same. Эту идиому можно перевести как науличший достижимый одинаковый диапазон. Звучит бредово, если не знать, что экстенты-диапазоны — это просто блоки данных. Данная утилита проверяет чексумы этих блоков, которые иногда называют хешами, если она находит совпадение, то копия блока заменяется на ссылку на него.

Установка:

yay -S bees

Для начала нужно узнать UUID корневой файловой системы:

$ sudo btrfs fi show /
Label: none  uuid: 83ba9a0a-7858-48f0-b679-618954059b1a
        Total devices 2 FS bytes used 153.13GiB
        devid    2 size 449.98GiB used 223.03GiB path /dev/mapper/root1
        devid    3 size 449.98GiB used 223.03GiB path /dev/mapper/root2

Затем создайте конфигурационный файл для bees, например, /etc/bees/root.conf.

Укажите в нем UUID:

UUID=83ba9a0a-7858-48f0-b679-618954059b1a

Задайте размер базы экстентов:

DB_SIZE=$((256*1024*1024)) # 256MiB в байтах

Рекомендованный размер базы экстентов («хеш-таблицы») приведен в документации:

unique data size |  hash table size |average dedupe extent size
    1TB          |      4GB         |        4K
    1TB          |      1GB         |       16K
    1TB          |    256MB         |       64K
    1TB          |    128MB         |      128K <- рекомендуется
    1TB          |     16MB         |     1024K
   64TB          |      1GB         |     1024K

Эта таблица показывает рекомендованные размеры для различных объемов уникальных данных. База хешей экстентов полностью грузится в оперативную память и периодически сбрасывается на диск, так что можно сказать, что вы тут указываете сколько вам не жалко выделить оперативной памяти для дедупликации. 128K — это стандартный размер экстента, но учтите, что это не постоянная величина. Чтобы не ошибиться, можно просто задать размер хеш-таблицы в 1 GB, если, конечно, количество RAM позволяет.

Для вывода только предупреждений и ошибок при работе beesd добавьте в конфиг:

OPTIONS="-P -v 6"

Проверьте перед этим файловую систему на ошибки и обязательно исправьте их перед запуском

Запуск дедупликации вручную:

sudo beesd 83ba9a0a-7858-48f0-b679-618954059b1a

Не ждите окончания процесса дедупликации. Он будет продолжаться бесконечно и в начале будет очень сильно грузить процессор.

В Arch вместе с пакетом идет systemd-юнит. Если хотите чтобы сервис запускался автоматически при старте системы выполните:

sudo systemctl enable --now beesd@83ba9a0a-7858-48f0-b679-618954059b1a

Проверка статуса дедупликации:

cat /run/bees/83ba9a0a-7858-48f0-b679-618954059b1a.status

Плюсы и минусы блочной дедупликации

Дедупликация позволяет значительно экономить место. Запуск beesd гарантированно увеличит свободное место на разделе и уменьшит занятое на 25-30%. Но она требует памяти и CPU. На очень слабых машинах это может быть критичным.

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

Ссылки

★★

Проверено: hobbit ()
Последнее исправление: rtxtxtrx (всего исправлений: 19)

Для проверки целостности файловой системы и исправления ошибок:

~/workspace
❯ sudo btrfs scrub start -Bd /
Starting scrub on devid 2
Starting scrub on devid 3
Scrub device /dev/mapper/root1 (id 2) done
Scrub started:    Tue Dec  3 07:19:01 2024
Status:           finished
Duration:         0:02:28
Total to scrub:   125.94GiB
Rate:             871.38MiB/s
Error summary:    no errors found

Scrub device /dev/mapper/root2 (id 3) done
Scrub started:    Tue Dec  3 07:19:01 2024
Status:           finished
Duration:         0:03:03
Total to scrub:   125.94GiB
Rate:             704.72MiB/s
Error summary:    no errors found
rtxtxtrx ★★
() автор топика
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.