Александр Ларсон (Alexander Larsson), создатель Flatpak, работающий в компании Red Hat, представил первый стабильный выпуск файловой системы Composefs, оптимизированной для эффективного совместного хранения содержимого нескольких примонтированных дисковых образов. На практике ФС Composefs может оказаться полезной для монтирования образов контейнеров и размещения Git-подобного репозитория OSTree. Код проекта написан на языке Си и распространяется под лицензией GPLv2.
Изначально реализация Composefs представляла собой отдельный модуль ядра Linux, но понимая сложность продвижения новой ФС в основной состав ядра, разработчики сменили тактику и переработали проект в виде надстройки над уже присутствующими в ядре ФС OverlayFS и EROFS, функциональность которых частично пересекается с Composefs. Таким образом работа по интеграции поддержки Composefs в ядро Linux свелась к продвижению в OverlayFS и EROFS патчей, реализующих необходимые для
Composefs специфичные возможности.
Функциональность EROFS (Extendable Read-Only File System) отвечает требованиям Composefs начиная с 5.15. В OverlayFS изменения вносились в несколько этапов: в ядро 6.5 была включена поддержка слоёв “data-only”, используемых только для данных (отдельно от метаданных). Оставшаяся часть изменений, связанная с возможностью сохранения хэшей fs-verity в расширенном атрибуте (xattr) overlay.verity, была недавно принята в состав тестового выпуска ядра 6.6-rc1, что ознаменовало включение в основной состав ядра Linux всей функциональности, необходимой для работы Composefs.
Принятие в состав ядра всех необходимых изменений позволило определить и зафиксировать финальный формат образов Composefs и опубликовать версию 1.0, стабилизирующую формат хранения и библиотечный API и ABI. Из функциональных отличий версии 1.0 от прошлого тестового выпуска упоминается внесение оптимизаций, повышающих эффективность формата хранилища; уход от использования встроенных в подсистеме ядра fs-verity средств для верификации цифровых подписей в пользу работающих в пространстве пользователя библиотек; добавление утилиты composefs-info для инспектирования файлов с образами Composefs и выявления несоответствий между метаданными и отдельно хранимыми данными.
Функциональность Composefs сводится к построению многослойных ФС, в которых произвольные деревья ФС в режиме только для чтения накладываются поверх штатных ФС Linux, выступающих в качестве нижнего слоя. От уже существующих похожих файловых систем, таких как SquashFS и EROFS, Composefs отличает поддержка совместного хранения содержимого разных образов и наличие функций для проверки подлинности читаемых данных. В Composefs применяется модель хранения с адресацией на основе содержимого, т.е. первичным идентификатором является не имя файла, а хэш от содержимого файла. Подобная модель обеспечивает дедупликацию и позволяет хранить только одну копию одинаковых файлов, встречающихся в разных примонтированных разделах.
Образы контейнеров содержат множество типовых системных файлов и в случае применения Composefs каждый из этих файлов будет совместно использован всеми примонтированными образами, без применения таких трюков, как проброс при помощи жёстких ссылок. При этом общие файлы не только хранятся в виде одной копии на диске, но и обходятся одной записью в страничном кэше, что даёт возможность экономить как дисковую, так и оперативную память.
Для экономии дисковой памяти данные и метаданные в Composefs разделены и при монтировании отдельно указывается бинарный индекс, в котором содержатся все метаданные файловой системы, имена файлов, права доступа и другие сведения. Индексы с метаданными создаются для каждого образа ФС и хранится в отдельном файле в формате EROFS (образ контейнера представляет собой монтируемый в loopback-режиме образ EROFS, в котором присутствуют только метаданные). Непосредственно файлы всех монтируемых образов хранятся в общем базовом каталоге в обычной ФС (ext4, xfs, btrfs) и связываются с образом при помощи расширенного атрибута rusted.overlay.redirect, на базе которого OverlayFS находит необходимые файлы по хэшу содержимого.
Для монтирования Composefs применяется загружаемый в пространстве пользователя FUSE-модуль composefs-fuse, а для создания и монтирования ФС из пространства пользователя предоставляются утилиты mkcomposefs и mount.composefs. Для верификации содержимого отдельных файлов и всего образа в условиях общего хранения применяется механизм fs-verity, который при обращении к файлам проверяет соответствие указанных в бинарном индексе хэшей с фактическим содержимым – если злоумышленник внесёт изменение в файл в базовом каталоге или данные повредятся в результате сбоя, то подобная сверка выявит расхождение.
Из проектов, которые уже применяют Composefs упоминаются Ostree и Container Storage Library. В git-подобном хранилище Ostree полная поддержка Composefs, включая возможности верификации содержимого, реализована в выпусках Ostree 2023.6 и rpm-ostree 2023.6, но код пока остаётся помечен как экспериментальный. В Container Storage Library предложена начальная реализация бэкенда, использующего Composefs для хранения образов контейнеров. После завершения работы бэкенд можно будет использовать для применения Composefs для дедупликации и защиты от подмены образов, управляемых при помощи инструментария Podman.