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

gro*_*wse 36 solaris zfs snapshot

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

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

例如,我有两个文件系统,一个tank称为sastank. 快照以它们的创建日期命名:sastank@AutoD-2011-12-13因此一个简单的sort命令应该按顺序列出它们。我希望将过去 2 周的每日快照保持在 上tank,但仅将过去两天的快照保持在 上sastank

use*_*517 48

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

zfs list -t snapshot -o name | grep ^tank@Auto | tac | tail -n +16 | xargs -n 1 zfs destroy -r
Run Code Online (Sandbox Code Playgroud)
  • 输出快照列表(仅限名称) zfs list -t snapshot -o name
  • 过滤以仅保留匹配的tank@Auto那些grep ^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
Run Code Online (Sandbox Code Playgroud)

...|xargs -n 1 echo.

  • 他说“以相反的顺序删除快照应该更有效”,因此是排序顺序。 (2认同)

小智 27

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

zfs 销毁 zpool1/dataset@20160918%20161107

将销毁从“20160918”到“20161107”(含)的所有快照。任何一端都可以留空,表示“最旧”或“最新”。所以你可以做一些事情来计算“n”然后销毁“...%n”..

很抱歉重新提出一个老问题。

  • 这就像魅力一样,比接受的答案快 100 倍! (2认同)

Aar*_*nLS 23

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

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:No header 所以第一行是快照名称

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

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

-S creation: 大写S表示降序排序,基于创建时间。这会将最新的快照作为第一行。

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

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


小智 8

您可能还想查看zfs-prune-snapshots

从一个或多个符合给定条件的 zpool 中删除快照

它有一个相当强大的基于时间的机制来删除快照,文档中的一个示例:

删除储罐池上两个月以上以字符串“_frequent”结尾的快照

zfs-prune-snapshots -s '_frequent' 2M tank


Dan*_*ler 5

成长对我来说在 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
Run Code Online (Sandbox Code Playgroud)

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

  • 点赞,因为任何可以像这样使用 sed 的人都应得的。 (3认同)
  • 在最近的软件更新后,该 sed 字符串停止为我工作并开始删除所有快照!坏sed!幸运的是,生产服务器很旧并且保持安全。我现在使用 sed -n -e :a -e '1,${RETENTION}!{P;N;D;};N;ba' (3认同)