Изначально реализация 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.
Источник: http://www.opennet.ru/opennews/art.shtml?num=59822