Вопрос или проблема
У меня есть серия ежедневных снимков 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
мог бы решить проблему?
такой интересный вопрос: “как избавиться от нежелательного файла в снимках?”
Проблемы:
- найти затронутые снимки
- восстановить пространство
“Решения”:
- Существует
.zfs/snapshots/<snapshots>/<fs-content>
, где вы можете это найти. - Предполагая, что у вас есть массив со всеми снимками, задача заключается в том, чтобы не вызвать требования к 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
из всех снимков и вернуть это пространство, сохранив при этом остальные данные в снимках.
Решение
-
Контрольные точки:
Чтобы освободить место, вам нужно удалить файлBIG.iso
во всех снимках, начиная сss61
и заканчиваяss100
. При этом вы не хотите потерять другие файлы. -
Создание клона:
Используйте команду создания клона, чтобы создать изменяемую копию состояния вашей файловой системы на момент снимкаss60
:zfs clone archive_zp/my_zfs@ss60 my_zfs_clone
-
Удаление файла:
Удалите файлBIG.iso
из клона:rm my_zfs_clone/BIG.iso
-
Создание новых снимков:
После удаления файла, вы можете создать новые снимки клона:for ((i=61; i<=100; i++)); do zfs snapshot my_zfs_clone@ss$i done
-
Копирование других снимков:
Если вы хотите сохранить изменения, которые были сделаны в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
-
Очистка и переименовывание:
После того, как вы убедитесь, что все данные корректны в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 и позволяет эффективно управлять пространством в пуле.