Новая файловая система Composefs для Linux: что это такое и как она работает
В ноябре 2022 года Александр Ларсон, сотрудник Red Hat, разработавший Flatpack, предложил реализацию файловой системы Composefs. Она в некоторых моментах похожа на Squashfs, подходит для монтирования образов в режиме «Только для чтения». Особенности новой ФС — совместное хранение содержимого нескольких примонтированных дисковых образов и поддержка проверки подлинности читаемых данных. Позиционируется она как инструмент для монтирования образов контейнеров, а также применения для Git-подобного репозитория OSTree.
Что это за система?
В Composefs используется модель хранения с адресаций на основе содержимого. В этом случае идентификатор — хэш содержимого файла, а не его имя. Такой подход даёт возможность обеспечить дедупликацию с хранением лишь одной копией одинаковых файлов, которые есть в разных примонтированных разделах.
Так, образы контейнеров содержат большое количество типовых системных файлов. Если использовать Composefs, каждый из них будет совместно использоваться всеми примонтированными образами, без применения трюков вроде проброса посредством жёстких ссылок. Ещё одна особенность в том, что общие файлы хранятся в виде одной копии на диске плюс обходятся одной записью в страничном кэше. Это даёт возможность экономить и оперативную, и дисковую память.
Что касается второго типа, то данные и метаданные разделяются в монтируемых образах. При монтировании указываются:
бинарный индекс, в котором содержатся все метаданные файловой системы, имена файлов, права доступа и другие сведения, за исключением непосредственно содержимого файлов
базовый каталог, в котором хранится содержимое файлов всех монтируемых образов. Файлы хранятся в привязке к хэшу от их содержимого
Бинарный индекс создаётся для каждого нового образа ФС, причём базовый каталог един для всех образов. Верификация содержимого файлов в этом случае реализуется посредством механизма fs-verity, который при обращении к файлам проверяет соответствие указанных в бинарном индексе хэшей с фактическим содержимым. В чём достоинство такого подхода? Если всё же злоумышленнику удастся внести изменения в файл в базовом каталоге либо данные будут повреждены из-за какого-то сбоя, то сверка сможет выявить расхождение.
Нужно больше подробностей!
Да, и они есть. Так, в самом начале реализации Composefs была создана в виде отдельного модуля ядра Linux. Но потом команда разработчиков решила изменить реализацию, представив новую версию уже в виде надстройки над имеющимися в ядре ФС OverlayFS и EROFS. Их функциональность частично пересекается с новой ФС. Сейчас работа по интеграции Composefs заключается в продвижении в OverlayFS и EROFS патчей, реализующих необходимые для Composefs специфичные возможности.
Extendable Read-Only File System полностью отвечает требованиям ФС начиная с версии ядра 5.15. В OverlayFS изменения вносили в несколько этапов. Сначала разработчики добавили поддержку слоёв data-only, используемых только для данных (отдельно от метаданных), в ядро 6.5. Потом велась работа над возможностью сохранения хэшей fs-verity в расширенном атрибуте (xattr) overlay.verity, и эти изменения уже добавлены в состав тестового выпуска ядра 6.6-rc1. Соответственно, в ядре Linux, в основном составе, появилась поддержка функций Composefs.
Всё это дало возможность финализировать формат образов Composefs и опубликовать версию 1.0, стабилизирующую формат хранения и библиотечный API/ABI. Отличие релиза от предыдущих версий заключается в добавлении различных оптимизаций, включая:
повышение эффективности формата хранилища
переход в пользу работающих в пространстве пользователей библиотек
добавление утилиты composefs-info для инспектирования файлов с образами Composefs
выявление несоответствий между метаданными и отдельно хранимыми данными
Что касается функциональности новой файловой системы, то она заключается в построении многослойных ФС, где как произвольные деревья ФС накладываются на стандартные ФС Linux.
Разработчики ФС позаботились об экономии дисковой памяти. Для этого реализована следующая схема: данные и метаданные разделены, в случае монтирования отдельно указывается бинарный индекс. В нём есть все метаданные, имена файлов, права доступа к ним и другие сведения. Индексы же с метаданными генерируются для каждого образа ФС и хранятся в отдельном файле с форматом EROFS. Файлы монтируемых образов хранятся в общем базовом каталоге в обычной файловой системе. Они связываются с образом посредством расширенного атрибута rusted.overlay.redirect, на базе которого OverlayFS находит необходимые файлы по хэшу содержимого.
Для того чтобы выполнить операцию монтирования, используются FUSE-модуль composefs-fuse и утилита mount.composefs, а для создания ФС предоставляется утилита mkcomposefs.
Стоит отметить, что Composefs уже используется несколькими проектами. Разработчики упоминают два из них — Ostree и Container Storage Library. В первом случае поддержка ФС добавлена в выпуски Ostree 2023.6 и rpm-ostree 2023.6 в качестве экспериментального кода. Во втором — применяется начальная реализация бэкенда, использующего Composefs для хранения образов контейнеров.