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

Как проверить, что все снимки ZFS в пуле не содержат удержаний, прежде чем уничтожать этот пул

Вопрос

Я уже могу проверить каждую снимок из файловая система индивидуально, вручную.

Я бы предпочел проверить все сразу (все с помощью одной команды или сценария). Пожалуйста:

Ответ должен быть хорош для файловых систем с пробелом в имени.

Задний план

На странице руководства по zfs (8):

zfs holds [-H] [-r] snapshot…

-r Указывает, что удержание с данным тегом рекурсивно применяется к снимкам всех потомков. файловые системы.


Интересно, недавно ли снимки рассматриваются как потомки более старого снимка. Нет:

Last login: Sat Dec  8 09:02:26 on ttys003
macbookpro08-centrim:~ gjp22$ zfs holds -r gjp22@2012-12-08-081957
NAME                     TAG  TIMESTAMP
macbookpro08-centrim:~ gjp22$ zfs holds -r gjp22@2012-10-28-212255
NAME                     TAG                                           TIMESTAMP
gjp22@2012-10-28-212255  problem with LocalStorage for WOT for Safari  Mon Oct 29  6:44 2012
macbookpro08-centrim:~ gjp22$ zfs hold experiment gjp22@2012-12-08-081957
macbookpro08-centrim:~ gjp22$ zfs holds -r gjp22@2012-10-28-212255
NAME                     TAG                                           TIMESTAMP
gjp22@2012-10-28-212255  problem with LocalStorage for WOT for Safari  Mon Oct 29  6:44 2012
macbookpro08-centrim:~ gjp22$ zfs holds -r gjp22@2012-12-08-081957
NAME                     TAG         TIMESTAMP
gjp22@2012-12-08-081957  experiment  Sat Dec  8  9:04 2012
macbookpro08-centrim:~ gjp22$ zfs holds -r gjp22@2012-10-28-212255
NAME                     TAG                                           TIMESTAMP
gjp22@2012-10-28-212255  problem with LocalStorage for WOT for Safari  Mon Oct 29  6:44 2012
macbookpro08-centrim:~ gjp22$ 

Разъяснение

Совмещать обе проверки не планирую и разрушение одной командой или скриптом. Этот вопрос по существу касается проверок.

Не уверен, как это выглядело в 2012 году, но теперь вы можете проверить userrefs свойство:

zfs get userrefs

Чтобы перечислить все удержания во всех пулах:

zfs get -Ht snapshot userrefs | grep -v $'\t'0 | cut -d $'\t' -f 1 | tr '\n' '\0' | xargs -0 zfs holds

Для пула с несколькими файловыми системами

zfs list -H -r -d 1 -t snapshot -o name nameoffilesystematroot | xargs -n1 zfs holds -H -r

Кредит, чтобы успокоиться irc://irc.freenode.net/#zfs но я не уверен, нужно ли доработать синтаксис.

Для меня с простой иерархией файловой системы (только один дочерний элемент) и относительно небольшим количеством моментальных снимков (в настоящее время семнадцать дочерних) команда, похоже, не приходит к выводу. Пример:

macbookpro08-centrim:~ gjp22$ zfs list -H -r -d 1 -t snapshot -o name gjp22 | xargs zfs holds -r
load: 4.94  cmd: zfs 39152 running 17.80u 112.52s
load: 3.73  cmd: zfs 39152 running 55.01u 349.29s
load: 3.15  cmd: zfs 39152 running 167.48u 1061.47s
load: 4.59  cmd: zfs 39152 running 267.57u 1697.49s
load: 5.19  cmd: zfs 39152 running 372.19u 2355.99s
load: 5.29  cmd: zfs 39152 running 432.89u 2736.79s

Заимствование из другой ответ, уделяя внимание только дочерней файловой системе:

macbookpro08-centrim:~ gjp22$ zfs list -H -r -d 1 -t snapshot -o name gjp22/intrigue | xargs zfs holds
NAME                              TAG  TIMESTAMP
macbookpro08-centrim:~ gjp22$ 

- и этот результат почти мгновенен.

ZFS - это ZEVO Community Edition 1.1.1.

Для пула с единой файловой системой

zfs list -H -r -d 1 -t snapshot -o name nameoffilesystem | xargs zfs holds

- то есть без -r рекурсия справа от трубы.

Кредит, чтобы успокоиться irc://irc.freenode.net/#zfs

Рабочий пример

Для файловой системы без пробела в имени:

macbookpro08-centrim:~ gjp22$ zfs list -H -r -d 1 -t snapshot -o name gjp22 | xargs zfs holds
load: 4.82  cmd: zfs 43038 running 0.59u 3.28s
NAME                     TAG                                           TIMESTAMP
gjp22@2012-10-28-212255  problem with LocalStorage for WOT for Safari  Mon Oct 29  6:44 2012
gjp22@2012-12-08-081957  experiment                                    Sat Dec  8  9:04 2012

Был один Контроль-Т чтобы увидеть, как дела идут.

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

Нерабочие примеры

Для файловой системы с именем Pocket Time Machine (пробелы в имени), ни одна из следующих команд не завершится успешно:

zfs list -H -r -d 1 -t snapshot -o name "tall/backups/zhandy/Pocket Time Machine" | xargs zfs holds

zfs list -H -r -d 1 -t snapshot -o name tall/backups/zhandy/Pocket\ Time\ Machine | xargs zfs holds

Вывод:

'tall/backups/zhandy/Pocket' is not a snapshot
'Time' is not a snapshot
cannot open 'tall/backups/zhandy/Pocket': dataset does not exist
cannot open 'Time': dataset does not exist
cannot open 'Machine@2012-09-18-210251': dataset does not exist
cannot open 'tall/backups/zhandy/Pocket': dataset does not exist
cannot open 'Time': dataset does not exist
cannot open 'Machine@2012-09-23-0330': dataset does not exist

… и так далее.

Это неявно вопрос в ответе, извините… кто-то с хорошими знаниями командной строки (не я) мог бы придумать этот ответ без того, чтобы я переходил к отдельному вопросу. Поищу совета в чате.

Следующая команда покажет все снимки [пула] (<-замените это на имя вашего пула), у которых есть удержания

zfs list -H -o name -t snapshot -r pool | xargs -n1 zfs holds -H

свойства будут перечислены как property:stuff

с этой информацией мы можем освободить снимки ..

zfs list -H -o name -t snapshot -r pool | xargs -n1 zfs holds -H | awk '{print $1}' | xargs -n1 zfs release property:stuff

(замените свойство: вещи на то, что содержит ваш набор данных)

..и наконец удалить их

zfs destroy -r [pool]/[dataset][@snapshot]