Если требуется протестировать изменения в большом каталоге с данными, конфигурацией или файлами приложения, необязательно предварительно создавать его полную физическую копию.
Обычный подход потребует скопировать всё содержимое каталога независимо от того, сколько файлов фактически будет изменено:
cp -a /opt/app /tmp/app-test
В Linux для такой задачи можно использовать OverlayFS: исходный каталог подключается как нижний слой
lowerdir, а все изменения, выполняемые через объединённое дерево, записываются в отдельный верхний слой upperdir.Подготовим каталоги для writable-слоя, служебного
workdir и итоговой объединённой точки монтирования:mkdir -p /tmp/overlay/{upper,work,merged}Для writable OverlayFS каталоги
upperdir и workdir должны находиться на одной файловой системе. Файловая система верхнего слоя также должна поддерживать необходимые OverlayFS extended attributes и корректный d_type.Монтируем
/opt/app как нижний слой:sudo mount -t overlay overlay \
-o lowerdir=/opt/app,upperdir=/tmp/overlay/upper,workdir=/tmp/overlay/work \
/tmp/overlay/merged
После монтирования
/tmp/overlay/merged представляет объединённое дерево: неизменённые объекты читаются из lowerdir, а новые и изменённые объекты обслуживаются верхним слоем.Работать с каталогом можно как с обычным writable-деревом:
echo "test=true" >> /tmp/overlay/merged/config.ini
При первой модификации существующего файла OverlayFS выполняет
copy_up: файл копируется из lowerdir в upperdir, после чего операция записи применяется уже к верхней копии. Поэтому OverlayFS не исключает копирование отдельных изменяемых файлов, но устраняет необходимость заранее копировать весь каталог.В результате изменённая версия файла будет находиться в верхнем слое:
/tmp/overlay/upper/config.ini
Запись через
/tmp/overlay/merged при этом не изменяет исходный файл:/opt/app/config.ini
Важно то, что сам каталог
/opt/app от этого физически read-only не становится. Другой процесс по-прежнему может изменить его напрямую. Изменять содержимое используемого lowerdir напрямую во время работы смонтированного OverlayFS не следует — это может привести к неопределённому поведению overlay.Для завершения работы достаточно размонтировать объединённое представление:
sudo umount /tmp/overlay/merged
Размонтирование не удаляет содержимое
upperdir: накопленные изменения сохраняются там до явной очистки каталога. Если слой действительно нужен только на время эксперимента, после успешного umount его можно удалить:rm -rf /tmp/overlay
🔥 OverlayFS полезен, когда исходное дерево велико, а изменяется только небольшая его часть: дисковое пространство расходуется преимущественно на новые и модифицированные объекты, а запись через объединённое дерево не затрагивает исходные файлы
lowerdir. Этот же механизм copy-on-write лежит в основе многих работ с контейнерными слоями и изолированными файловыми окружениями.🚪 Linux Ready | #практика