问题

问题

问题

我已经可以检查每一个快照文件系统单独地、手动地。

我希望一次性检查所有内容(使用单个命令或脚本)。请:

  • 可以用脚本完成吗?

对于名称中带有空格的文件系统,答案应该是好的。

背景

来自 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$ 

澄清

我不打算合并两张支票单个命令或脚本中的销毁。这个问题本质上是关于检查的。

答案1

不确定 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

答案2

对于具有单个文件系统的池

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

– 也就是说,不需要-r递归到管道的右侧。

感谢 calmhirc://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

有一个Control——T看看事情进展得如何。

为了完整起见,我应该声明的一个孩子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

… 等等。

这隐含着一个答案中的问题,抱歉……某些具有丰富命令行知识的人(不是我)可能能够巧妙地回答这个问题,而我无需再提出另一个问题。我会在聊天中寻求建议。

答案3

对于具有多个文件系统的池

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

感谢 calmh,irc://irc.freenode.net/#zfs但我不确定语法是否需要进一步改进。

对我来说,由于文件系统层次结构简单(只有一个子级)且快照相对较少(当前有 17 个子级快照),该命令似乎无法得出结论。示例:

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 社区版 1.1.1。

答案4

以下命令将显示 [pool](<-将其替换为您的池名称)的所有快照,这些快照具有保留

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

(将“property:stuff”替换为保存数据集的任何内容)

..最后删除它们

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

相关内容