如何删除除最后 [n] 个 ZFS 快照之外的所有快照?

如何删除除最后 [n] 个 ZFS 快照之外的所有快照?

我目前每晚和每周都会对基于 ZFS 的 NAS 进行快照,这个过程曾救过我好几次。然而,虽然快照的创建是自动的(从 cron 开始),但删除旧快照仍然是一项手动任务。显然,如果我被公交车撞到,或者没有执行手动任务,NAS 就会耗尽磁盘空间,这是有风险的。

有没有人有什么好的方法/脚本来管理存储在 ZFS 系统上的快照数量?理想情况下,我想要一个脚本,它可以遍历给定 ZFS 文件系统的所有快照,并删除除最后一个之外的所有快照n该文件系统的快照。

例如,我有两个文件系统,一个叫tank,另一个叫sastank。快照以创建日期命名:sastank@AutoD-2011-12-13因此一个简单的sort命令应该按顺序列出它们。我希望保留 上最近 2 周的每日快照tank,但 上只保留 上最近两天的快照sastank

答案1

你可能会发现这样的事情更简单一点

zfs list -t snapshot -o name | grep ^tank@Auto | tac | tail -n +16 | xargs -n 1 zfs destroy -r
  • 输出快照列表(仅限名称)zfs list -t snapshot -o name
  • 过滤仅保留匹配tank@Autogrep ^tank@Auto
  • 使用以下方法反转列表(之前按从最旧到最新排序)tac
  • 将输出限制为第 16 个最旧的结果,然后tail -n +16
  • 然后销毁xargs -n 1 zfs destroy -vr

按照相反的顺序删除快照据称更有效率,或者按照创建的相反顺序排序。

zfs list -t snapshot -o name -S creation | grep ^tank@Auto | tail -n +16 | xargs -n 1 zfs destroy -vr

用 测试它...|xargs -n 1 echo

答案2

这完全没有回答问题本身,但不要忘记您可以删除快照范围。

zfs 销毁 zpool1/dataset@20160918%20161107

将销毁从“20160918”到“20161107”的所有快照(含)。两端均可留空,表示“最旧”或“最新”。因此,您可以想出一些办法来计算“n”,然后销毁“...%n”。

很抱歉再次提起这个老问题。

答案3

更常见的情况是根据创建日期而不是名称获取最新快照。

zfs list -H -t snapshot -o name -S creation | head -1

范围为特定的文件系统名称TestOne

zfs list -H -t snapshot -o name -S creation -d1 TestOne | head -1

-H:无标题,因此第一行是快照名称

-t snapshot:列出快照(列表可以列出其他内容,如池和卷)

-o name:显示快照名称属性。

-S creation: 大写S表示降序根据创建时间排序。这会将最近的快照放在第一行。

-d1 TestOne:说包括子项,这似乎令人困惑,但这是因为就此命令而言,TestOne 的快照是子项。这将不是列出 TestOne 内的卷快照,例如TestOne/SubVol@someSnapshot

| head -1:管道到头部并且只返回第一行。

答案4

对我来说,growse 在 OpenIndiana 上不起作用。它无法理解 xargs 的 -0。

如果使用排序,请注意它按字母顺序排序,这可能不是您想要的,因为您可能想要找到最新的。

以下代码将删除除最后的快照之外的所有快照。

删除‘回声’即可上线。

RETENTION=5
FS=tank1/test
SNAPNAME=daily-

zfs list -t snapshot -o name | grep ^$FS@${SNAPNAME} |  sed -n -e :a -e '1,${RETENTION}!{P;N;D;};N;ba' | xargs -n 1 echo zfs destroy -r

资料来源: http://sed.sourceforge.net/sed1line.txt

相关内容