如何删除最后的 ZFS快照?

我目前每晚和每周都快照我的基于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反转列表(先前从最旧到最新)
    • 将输出限制为第16个最早的结果,并跟随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 echotesting它

    根据创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