Btrfs

Обновлено 7 апреля 2021

Btrfs

Введение

Btrfs - файловая система, предназначенная для удовлетворения растущих требований к масштабируемости больших подсистем хранения. Имя файловой системы Btrfs происходит от имени структуры данных B-деревьев, которые в ней используются. B-дерево это древовидная структура данных, которая позволяет файловым системам и базам данных эффективно получать доступ и обновлять большие блоки данных независимо от размера дерева.

Во время разметки дика, при установке Calculate Linux, Вы можете выбрать файловую систему Btrfs, и установщик автоматически отформатирует выбранный Вами раздел. Кроме того, вы можете использовать команду mkfs.btrfs для создания файловой системы Btrfs, расположенной на одном или нескольких блочных устройствах. Конфигурация по умолчанию состоит в разделении данных и зеркалировании метаданных файловой системы. Когда вы указываете одно устройство, метаданные дублируются на этом устройстве, если только вы не указали, что должна использоваться только одна копия метаданных. Устройствами могут быть простые разделы диска, loopback устройства (то есть образы дисков в памяти), multipath устройства или устройства LUN, которые реализуют RAID на аппаратном уровне.

Возможности

Файловая система Btrfs предоставляет следующие важные функции:

  • Функция Copy-on-write позволяет создавать как читаемые, так и записываемые снапшоты, а также откатывать файловую систему к предыдущему состоянию, даже после преобразования ее из файловой системы ext3 или ext4.
    Создать снапшот можно командой: btrfs subvolume snapshot <source> <[dest/]name>
    Если Вам необходимо заблокировать снапшот от изменений, добавьте ключ -r
  • Функциональность контрольной суммы обеспечивает целостность данных.
  • Интегрированное сжатие экономит дисковое пространство.
    Сжатие можно включить опцией compress=zlib или compress=lzo при монтировании диска.
    Сжатие также можно включить для каждого файла без использования опции монтирования, для этого примените chattr +c <[dest/]name> к файлу. При применении к каталогам новые файлы будут автоматически сжиматься по мере их поступления.
  • Интегрированная дефрагментация улучшает производительность.
  • Интегрированное управление логическими томами позволяет реализовывать конфигурации RAID, а также динамически добавлять и удалять емкость хранилища.

Btrfs поддерживает RAID0, RAID1, RAID10, RAID5 и RAID6, а также может дублировать метаданные или данные на одном шпинделе или нескольких дисках.

Предупреждение

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

При выполнении команды mkfs.btrfs может быть указано более одного устройства в командной строке. Для управления конфигурацией рейда используются следующие ключи: для данных (-d) и метаданных (-m). Допустимые варианты: RAID0, RAID1, RAID10, RAID5, RAID6, single и dup. Опция "-m single" означает, что дублирование не выполняется, это необходимо при использовании аппаратного рейда.

Balance

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

В отличие от большинства обычных файловых систем, Btrfs использует двухступенчатый распределитель. На первом этапе выделяются большие области пространства, известные как чанки (chunks) для определенных типов данных, затем на втором этапе выделяются блоки (blocks). В этих больших областях существует три типа чанков:

  • Data chunks хранят обычные данные файла.
  • Metadata Chunks хранят метаданные о файлах, включая, метки времени, контрольные суммы, имена файлов, владельца, разрешения и расширенные атрибуты.
  • System Chunks это особый тип чанков, которые хранят данные о том, где находятся все остальные чанки.

Только тот тип данных, для которого выделен блок, может быть сохранен в этом блоке. В наши дни наиболее распространенным случаем, когда вы получаете ошибку ENOSPC в Btrfs, является то, что файловая система исчерпала пространство для данных или метаданных в существующих чанках и не может выделить новый чанк. Вы можете убедиться, что это так, запустив btrfs fi df <путь> в файловой системе, которая вызвала ошибку. Если в строке "Данные" или "Метаданные" отображается значение "Итого", которое значительно отличается от значения "Используется", то это, вероятно, является причиной.

Команда btrfs balance отправляет данные обратно через распределитель (allocator), что приводит к более компактному использованию чанков. Например, если у вас есть два блока метаданных, которые заполнены на 40%, баланс приведет к тому, что они станут одним блоком метаданных, который заполнен на 80%. Благодаря такому сокращению использования пространства, операция балансировки может затем удалить пустые блоки освободив место для размещения новых блоков, которые впоследствии можно будет назначить на необходимые чанки. Если запустить btrfs fi df <путь> после запуска баланса, значения Total и Used станут намного ближе друг к другу, так как баланс удаляет фрагменты, которые больше не нужны.

Важно

Стоит помнить что для btrfs balance, требуется временно создать новую группу блоков и переместить туда старые данные. Для этого системе требуется свободная память, в противном случае вы получите ошибку ENOSPC. Решить данную проблему можно временно подключив дополнительный накопитель.

Scrub

Команда btrfs scrub start <путь> считывает все блоки данных и метаданных со всех устройств и проверяет контрольные суммы. Автоматически восстанавливает поврежденные блоки, если есть правильная копия.

Заметка

Scrub не является средством проверки файловой системы (fsck) и не проверяет и не устраняет структурные повреждения в файловой системе.

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

В зависимости он настроек Вашего диска, btrfs scrub исправит поврежденные данные, скопировав неповреждённую версию с другого диска при настройке RAID1. Если данные хранятся в единственном экземпляре или все копии повреждены btrfs scrub уведомит о повреждении данных. При отсутствии ошибок утилита возвратит 0.

Дефрагментация

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

В Btrfs для борьбы с фрагментацией существует несколько методов:

  • дефрагментация с помощью команды btrfs filesystem defragment <путь>

Важно

Copy-on-Write механизм записывает изменения данных каждый раз новое место, вследствие чего они обладают повышенной фрагментацией. Кроме того, дефрагментация разорвёт ссылки на данные COW (например, файлов копируемых с помощью cp --reflink, снапшотов или дедуплицированных данных). Это может привести к значительному увеличению использованного дискового пространства.

  • опция монтирования -o nodatacow , которая отключает COW для данных. Дефрагментацию можно применять к отдельному файлу либо к подтому/директории, в т. ч. рекурсивно. Атрибут nocow можно также выставить новому или пустому файлу. Он отключает механизм copy on write, благодаря чему Btrfs при обновлении содержимого файла будет всегда работать с фиксированной дисковой областью, записывая данные поверх существующих (на физическом уровне).

Важно

Включенный атрибут nocow - отключает проверку контрольной суммы файлов.

  • опция монтирования -o autodefrag . Этот механизм обнаруживает небольшие случайные записи в файлы и ставит их в очередь для автоматического дефрагментации, поэтому файловая система будет дефрагментировать себя, пока она используется. Данная опция не подходит для виртуализации или высоконагруженных баз данных, но хорошо работает для небольших файлов, таких как rpm, SQLite или базы данных bdb.

Заметка

Оценить фрагментированность файлов можно при помощи утилиты filefrag.

Trim

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

Btrfs автоматически определяет при монтировании твердотельные накопители, однако для работы fstrim необходим ручной запуск или установка опции -o discard, которая будет запускать утилиту fstrim после каждого удаления файла.

Следует обратить внимание что частое выполнение fstrim или даже использование -o discard может отрицательно повлиять на срок службы бюджетных SSD-устройств. Подробнее о данной проблеме написано в следующей статье. Кроме того, CoW (копирование при записи) Btrfs уменьшает количество перезаписи, так что TRIM на самом деле не так необходим для Btrfs.