Назад | Перейти на главную страницу

Есть ли способ создать копию каталога для копирования при записи?

Я думаю о ситуации, когда у меня было бы что-то, что создает копию каталога, настраивает несколько файлов, а затем выполняет некоторую обработку результата. Это будет происходить довольно часто, может быть, несколько десятков раз в день. (Точный вариант использования - это тестирование отправленных патчей; обманывайте код, исправляйте его, создавайте / тестируйте / отчет и т. Д.)

То, что я ищу, может быть сделано путем создания новой структуры каталогов и заполнения ее жесткими ссылками из оригинала. Однако это работает, только если все используемые вами инструменты удаляют и воссоздают файлы, а не редактируют их на месте.

Есть ли способ заставить файловую систему работать копирование при записи для файла?


Примечание: я знаю, что многие FS используют COW на уровне блоков (все обновления выполняются посредством записи в новые блоки), но это не то, что я хочу.

Если у вас есть выбор платформы для вашего файлового сервера, я бы пошел с недавней сборкой OpenSolaris и использовал функцию дедупликации ZFS. Таким образом, копии файлов не будут занимать дополнительное место, и даже общие сегменты между файлами не будут реплицироваться.

Вы можете прочитать все о дедупликации ZFS на этот пост в блоге Джеффа Бонвика.

Наиболее решения для виртуализации Linux предложить COW на уровне файлов среди виртуализированных ОС (скопировано из WP):

  • ДА:
    • Docker, Linux-VServer, lmctfy, LXC, Singularity, Virtuozzo, Sandboxie, systemd-nspawn, контейнеры Solaris (ZFS), FreeBSD jail (ZFS), OpenVZ
  • НЕТ:
    • chroot, sysjail, WPAR, виртуальные учетные записи iCore, Turbo

Я нахожу этот вопрос при поиске лучшего решения вместо моего текущего, например: cp -al SOURCEDIRNAME copy.SOURCEDIRNAME или

find SOURCEDIRNAME -type d -exec mkdir -p copy.{} ';'
find SOURCEDIRNAME -type f -exec ln {} copy.{} ';'

На данный момент у меня есть копия структуры с кучей жестких ссылок. Это работает относительно быстро и не требует дополнительного места на диске, потому что мы не копируем все файлы. Теперь я могу делать кое-что (например, patch или построить) в каталоге копий. Если они не изменяют исходные файлы, только переименуйте их и / или создайте новые файлы. После работы у меня есть некоторые результаты, и я могу удалить каталог копий и начать заново.

Если вы используете более сложные инструменты и не доверяете им (или знаете, что они пытаются перезаписать существующие файлы), вам может потребоваться пастушок.

Попробуйте использовать одну из UniouFS, AUFS или Наложенная файловая система (зависит от того, что поддерживается в вашем дистрибутиве)

Например, OverlayFS используется докером как один из драйверов для объединения слоев.

Наложенная файловая система

Наложение в основном касается каталогов. Если данное имя появляется как в верхней, так и в нижней файловой системе и относится к каталогу, не являющемуся каталогом в любой из них, то нижний объект скрыт - имя относится только к верхнему объекту.

Если и верхний, и нижний объекты являются каталогами, создается объединенный каталог.

Во время монтирования два каталога, указанные как параметры монтирования «lowerdir» и «upperdir», объединяются в объединенный каталог:

mount -t overlay overlay -olowerdir=/lower,upperdir=/upper,workdir=/work /merged

«Workdir» должен быть пустым каталогом в той же файловой системе, что и upperdir.

Может быть SVN или другой инструмент для управления версиями (git, cvs)?