如何在销毁池之前检查池中的所有ZFS快照是否已暂停

我已经可以手动检查每个文件系统的 快照了。

我宁愿一次检查所有(全部用一个命令脚本)。 请:

  • 可以用脚本来完成吗?

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

背景

从zfs(8)的手册页:

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

-r指定使用给定标记的保持recursion地应用于所有后代文件系统的快照。


我想知道最近的快照是否被视为旧快照的后代。 没有:

 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 nameoffilesystem | xargs zfs holds 

– 也就是说,没有-rrecursion到pipe道的右侧。

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 

有一个ControlT看看事情是如何运行的。

为了完整gjp22 ,我应该说有一个gjp22的孩子。 但是我想这个例子(不注意后人)certificate了命令的有效性。

非工作的例子

对于名为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 

… 等等。

这隐含地是一个答案中的问题,对不起……有一个具有良好的命令行知识(不是我)的人可能能够聪明地回答这个答案,而不会转移到一个单独的问题。 我会在聊天中寻求build议。

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

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

irc://irc.freenode.net/#zfs但是我不确定语法是否需要更多的工作。

对于我来说,只有一个简单的文件系统层次结构(只有一个孩子)和相对较less的快照(目前有十七个孩子),这个命令似乎还没有得出结论。 例:

 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。