问题
我已经可以检查每一个快照的文件系统单独地、手动地。
我希望一次性检查所有内容(使用单个命令或脚本)。请:
- 可以用脚本完成吗?
对于名称中带有空格的文件系统,答案应该是好的。
背景
来自 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]