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


24

目前,我每天晚上和每周都对基于ZFS的NAS进行快照,此过程节省了很多时间。但是,虽然快照创建是自动的(从cron创建),但是删除旧快照仍然是手动任务。显然,如果我被公交车撞到,或者不执行手动任务,NAS将会耗尽磁盘空间。

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

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

Answers:


35

您可能会发现这样的简单一些

zfs list -t snapshot -o name | grep ^tank@Auto | tac | tail -n +16 | xargs -n 1 zfs destroy -r
  • 用以下命令输出快照列表(仅名称) zfs list -t snaphot -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

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


1
我认为这需要sort -rsed命令之前输入。sed似乎输出列表的底部超过前15行,默认情况下这是最新的。翻转列表意味着我在底部获得了最早的快照。
增长

1
他说:“以相反的顺序删除快照应该更有效”,因此是排序顺序。
tgunr

19

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

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:管道到头部,仅返回第一行。


1
谢谢你-d1。这就是问题“我如何获取给定数据集的所有快照?”的关键。
乔纳森·莱因哈特

8

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

zfs销毁zpool1 / dataset @ 20160918%20161107

将销毁从“ 20160918”到“ 20161107”(包括首尾)的所有快照。两端都可以留空,表示“最旧”或“最新”。因此,您可以煮一些东西弄清楚“ n”,然后销毁“ ...%n”。

抱歉,复活了一个老问题。


这就像魅力一样,比接受的答案快100倍!
NeilWang

5

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


2
支持,因为任何可以使用sed的人都应该这样做。
增长

2
在最近的软件更新之后,该sed字符串对我而言不再起作用,并且它开始删除所有快照!坏sed!幸运的是,生产服务器很旧,而且安全。我现在用sed -e -n:一-e '1,$ {} RETENTION {P,N; d;}; N; BA!'
丹布勒

我从未见过像这样的SED。
杰森

3

我可能已经通过一些bash-fu解决了这个问题。

 zfs list -t snapshot -o name | grep ^tank@AutoD- | sort -r | wc -l | xargs -n 1 expr -$NUM_TO_KEEP + | tr -d '\n' | xargs -0 -i bash -c "zfs list -t snapshot -o name | grep ^tank@AutoD- | sort -r | tail -n{} | sort |xargs -t -n 1 zfs destroy -r"

哇。感觉真不对劲。


1

在Solaris上需要head路径,但在其他发行版中无需使用该路径。

retention=14
dataset=vmstorage-17/824

zfs list -rt snap -H -o name ${dataset} | \
/usr/gnu/bin/head -n -${retention} | xargs -n 1 zfs destroy -r
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.