Как удалить большой файл из ZFS-снэпшотов и освободить место?

Вопрос или проблема

У меня есть серия ежедневных снимков ZFS размером 100 Мб для archive_zp/my_zfs, охватывающих 100 дней. На 60-й день (между @ss59%ss60) я добавил файл размером 10 ГиБ archive_zp/my_zfs/BIG.iso, и эти 10 ГиБ теперь присутствуют в 40 снимках, которые появились после этого, сохраняя оригинальное пространство в 10 ГиБ zpool’а archive_zp с тех пор.

Я не хочу сохранять файл BIG.iso ни в одном снимке и хочу вернуть использованное пространство в 10 ГиБ от BIG.iso. Однако я также хочу сохранить все остальные данные (файлы и ежедневные снимки и т.д.) во всех 40 ежедневных снимках, которые были сделаны с тех пор.

У меня есть предчувствие, что я мог бы пойти по следующему пути:

  • zfs clone archive_zp/my_zfs@ss60 my_zfs_clone,
  • rm archive_zp/my_zfs_clone60/BIG.iso,
  • zfs promote archive_zp/my_zfs_clone – это сохранит более ранние блоки zpool’а до @ss60.

Далее я немного теряюсь… (чтобы избежать проблем с UID снимка) Нужно ли мне использовать последовательность rsync типа:

  • rsync -av --progress /archive_zp/my_zfs/.zfs/snapshot/ss61 /archive_zp/my_zfs_clone
  • zfs snapshot archive_zp/my_zfs_clone@ss61
  • и так далее для @ss62 .. @ss100

Или я могу воспользоваться zfs replication, особенно учитывая, что BIG.iso не изменялся с ss61 по ss100? Например:

  • zfs send -I archive_zp/my_zfs@ss61 archive_zp/my_zfs@ss100 | zfs receive archive_zp/my_zfs_clone

С небольшим уборкой в конце:

  • просмотреть archive_zp/my_zfs_clone – а затем, если всё нормально…
  • zfs destroy archive_zp/my_zfs
  • переименовать archive_zp/my_zfs_clone в archive_zp/my_zfs

Существует ли лучшее решение или инструмент zfs reclaim, чтобы вернуть это пространство, занятую BIG.iso?

Может быть, zfs destroy archive_zp/my_zfs/BIG.iso@ss60٪ss100 мог бы решить проблему?

такой интересный вопрос: “как избавиться от нежелательного файла в снимках?”

Проблемы:

  1. найти затронутые снимки
  2. восстановить пространство

“Решения”:

  1. Существует .zfs/snapshots/<snapshots>/<fs-content>, где вы можете это найти.
  2. Предполагая, что у вас есть массив со всеми снимками, задача заключается в том, чтобы не вызвать требования к COW-пространству.

2.1) сделать снимок записываемым -> zfs clone <zfspath>@<snapname> <zfspath>/<clonename>

2.2) удалить нежелательные элементы из клона

2.3) удалить snapshot <zfs>@<snapname>

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

Резюме: Я не знаю способа сделать это, то, что было бы нужно, например, это функция фильтрации при zfs-send и zfs-receive, которая могла бы модифицировать цель, отфильтровывая/удаляя элементы, но даже это потребовало бы, как минимум, в 2 раза больше места для хранения. Пишу это, чтобы можно было подумать об альтернативе.

Альтернатива:
Поскольку оригинальный план не работает в любом случае, заканчивая с 2x потребностями в пространстве, можно просто продолжить, создав новый <zfspath>, – rsyncing с --exclude – нужные элементы, снова делать снимок, что приведет к тому же результату с тем же влиянием.

Ответ или решение

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

Проблема

У вас есть серия ежедневных снимков ZFS (размером 100 МБ) для файловой системы archive_zp/my_zfs, в которой 60 дней назад был добавлен файл BIG.iso объемом 10 ГБ. Этот файл теперь присутствует в 40 снимках, что удерживает пространство в пуле archive_zp. Вы хотите удалить BIG.iso из всех снимков и вернуть это пространство, сохранив при этом остальные данные в снимках.

Решение

  1. Контрольные точки:
    Чтобы освободить место, вам нужно удалить файл BIG.iso во всех снимках, начиная с ss61 и заканчивая ss100. При этом вы не хотите потерять другие файлы.

  2. Создание клона:
    Используйте команду создания клона, чтобы создать изменяемую копию состояния вашей файловой системы на момент снимка ss60:

    zfs clone archive_zp/my_zfs@ss60 my_zfs_clone
  3. Удаление файла:
    Удалите файл BIG.iso из клона:

    rm my_zfs_clone/BIG.iso
  4. Создание новых снимков:
    После удаления файла, вы можете создать новые снимки клона:

    for ((i=61; i<=100; i++)); do
       zfs snapshot my_zfs_clone@ss$i
    done
  5. Копирование других снимков:
    Если вы хотите сохранить изменения, которые были сделаны в archive_zp/my_zfs после ss60, вы можете использовать zfs send и zfs receive для передачи изменений из оригинала в клона. Например:

    zfs send -I archive_zp/my_zfs@ss61 archive_zp/my_zfs@ss100 | zfs receive my_zfs_clone
  6. Очистка и переименовывание:
    После того, как вы убедитесь, что все данные корректны в my_zfs_clone, вы можете удалить оригинальную файловую систему:

    zfs destroy archive_zp/my_zfs

    Затем переименуйте ваш клон обратно в оригинальное имя:

    zfs rename my_zfs_clone archive_zp/my_zfs

Заключение

Удалить файл из снимков ZFS можно, но это требует подхода с клонированием и пересозданием снимков. На данный момент не существует встроенной функции в ZFS, которая бы позволила напрямую удалять файлы из нескольких снимков одновременно. Поэтому использование клонирования и выполнения задач с помощью zfs send и zfs receive является оптимальным способом решения проблемы.

Использование команды zfs diff для идентификации различий между снимками может помочь вам в отслеживании файлов, однако это не освободит пространство. Способы работы с клонированием и перемещением данных — это наиболее надежный подход к вашей задаче.

Таким образом, данный процесс вполне подходит для профессионального управления объемами данных в ZFS и позволяет эффективно управлять пространством в пуле.

Оцените материал
Добавить комментарий

Капча загружается...