mergerfs из восьмого выпуска складывает несколько дисков в один пул по свободному месту — а unionfs-fuse решает другую задачу: накладывает каталоги друг на друга по приоритету, как слои. Файл ищется сначала в верхней ветке, и только если его там нет — в следующей, и так вниз по списку.

Ветки перечисляются через двоеточие, у каждой можно явно задать режим — =RW (можно писать) или =RO (только читать), приоритет у той, что указана первым:

unionfs -o cow,max_files=32768 \
        -o allow_other,suid,dev,nonempty \
        /u/host/etc=RW:/u/group/etc=RO:/u/common/etc=RO \
        /u/union/etc

Главный флаг тут — -o cow (copy-on-write). Без него правило простое и неприятное: read-only ветки по сути не поддерживаются, поведение при записи не определено. С cow всё иначе — если приложение пытается изменить файл, физически лежащий в нижней RO-ветке, unionfs-fuse сначала копирует его в самую верхнюю RW-ветку и уже там применяет изменение, оригинал внизу остаётся нетронутым. Удаления работают похоже: вместо реального rm на RO-ветке создаётся служебный whiteout-файл в скрытом каталоге .unionfs/ той же ветки — он просто прячет файл из нижних слоёв при обходе.

Практический сценарий — Live CD/USB: корень системы собирается из read-only образа плюс пустой RW-ветки для временных изменений, которые не переживут перезагрузку (ровно так, как работает оверлей у большинства live-дистрибутивов). Для / отдельно есть опция -o chroot=path, иначе pivot_root на самой точке монтирования встанет намертво. Ставится пакет из репозитория (apt install unionfs-fuse в Debian-семействе) либо собирается из исходников через cmake — так можно гибко включать или выключать xattr и выбирать libfuse2 или libfuse3.

#linux #fuse #unionfs