我目前每晚和每周都快照我的基于ZFS的NAS,这个过程几次拯救了我的屁股。 但是,虽然快照的创build是自动的(来自cron),但删除旧快照仍然是一项手动任务。 很明显,如果我被公交车撞上了,或者没有执行手动任务,那么NAS将会耗尽磁盘空间。
有没有人有任何好的方法/脚本来pipe理存储在ZFS系统上的快照数量? 理想情况下,我想要一个脚本遍历给定的ZFS文件系统的所有快照,并删除除该文件系统的最后n个快照外的所有快照。
比如我有两个文件系统,一个叫tank
,另一个叫sastank
。 快照用它们的创builddate命名: sastank@AutoD-2011-12-13
所以一个简单的sort
命令应该按顺序列出它们。 我希望保留最近2周的tank
每日快照,但只有最后两天值得的快照。
你可能会发现这样更简单一些
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
输出快照列表(仅限zfs list -t snaphot -o name
grep ^tank@Auto
只保留那些与tank@Auto
匹配的文件 tac
反转列表(先前从最旧到最新) tail -n +16
xargs -n 1 zfs destroy -vr
按照相反的顺序删除快照据说更有效率。
或按照与创build相反的顺序进行sorting
zfs list -t snapshot -o name -S creation | grep ^tank@Auto | tail -n +16 | xargs -n 1 zfs destroy -vr
使用...|xargs -n 1 echo
testing它
根据创builddate而不是按名称获取最新快照的更一般情况。
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
表示降序sorting,基于创build时间。 这将最新的快照作为第一行。
-d1 TestOne
:说包括孩子,这似乎很混乱,但是因为就这个命令而言,TestOne的快照是孩子。 这不会列出TestOne内卷的快照,例如TestOne/SubVol@someSnapshot
。
| head -1
| head -1
:pipe头,只返回第一线。
growse的没有为我工作的OpenIndiana。 它不了解xargs。
如果使用sorting,请注意它按字母顺序sorting,这可能不是你想要的,因为你可能想find最新的。
这是删除除最后一个快照以外的所有代码。
删除'回声'上线。
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
这完全不能回答问题本身,但不要忘记你可以删除快照的范围。
zfs销毁zpool1 / dataset @ 20160918%20161107
将销毁从“20160918”到“20161107”的所有快照。 任何一端都可以留空,表示“最旧”或“最新”。 所以你可以做点什么,然后摧毁“…%n”。
对不起复活了一个老问题。
我可能用一些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"
哇。 这感觉是错的。
在Solaris上需要头部的path,但是应该在没有其他发行版的path上工作。
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