最近在公司内部的 FreeBSD 上搭建了一个 samba 服务用于内网 smb 文件存储与共享,共享的文件位于独立的 ZFS 数据集上,有的数据集是游客权限都可写的,为了保证数据的安全决定使用 ZFS 的快照功能来防止数据的误删改等等,ZFS 的快照可以做到只占用差异的空间并且能够在瞬间建立从而保留某一刻的完整数据,虽然可以使用 zfs snapshot 命令来创建快照,但如果可以象 FreeNAS 那样建立自动快照任务并且指定保存时间,管理起来就轻松多了。
可以办到这样功能的工具很多,pkg search zfs 就能看到好几个,有 zfs-periodic、zfs-snapshot-mgmt、zfsnap、zfstools。经过各种对比后发现 zfsnap2 这款工具最为简单易用,完全满足需求。其它的工具则是要么功能过多,依赖也过多,要么使用过于复杂。
首先了解一下需求,我希望对指定的数据集进行定期的创建快照,并指定快照保留的时长。
比如:
为数据集 tank/docs 每隔 8 小时创建一次快照,快照总共保留一周。
为 tank/public 每个周一到周五的每天下午 6 点创建一次快照,同样保留一周。
每天 23 点清理过期快照。
步骤如下:
1、安装 zfsnap2
pkg install zfsnap2
2、为数据集建立计划任务
在 /etc/crontab 中加入以下内容
# # Auto ZFS Snapshot 0 */8 * * * root zfsnap snapshot -v -a 1w tank/docs >> /var/log/zfsnap.log 0 18 * * 1-5 root zfsnap snapshot -v -a 1w tank/public >> /var/log/zfsnap.log 0 23 * * * root zfsnap destroy -rv tank >> /var/log/zfsnap.log
这样就搞定了。
crontab 的内容不用过多介绍 ,主要是如何使用 zfsnap 命令,zfsnap 只是一堆 shell 脚本的集合,可以很轻松的查看它的源码,它主要的用法是 zfsnap snapshot (创建快照)和 zfsnap destroy(删除快照) 两个命令。
在上面的例子里 zfsnap snapshot -v -a 1w tank/docs 这里的 -v 代表输出执行结果,在计划任务中我使用 >> 将结果重定向到 /var/log/zfsnap.log 中以便记录,-a 代表创建的保留周期,1w 即一周,后面跟的是数据集或 zvol 的名称,如果要为 tank/docs 下的所有子数据集创建快照,则应该加上 -r 参数代表递归。
注意的是 zfsnap 并不会在创建时自动删除过期的快照,你需要向上面一样在计划任务中加入 zfsnap destroy 来删除过期的快照,我这里使用了 zfsnap destroy -rv tank 来递归删除 tank 池下的所有过期快照,如果你要删除指定数据集的快照,则应像这样使用:zfsnap destroy -v tank/docs,建议删除快照不要太频繁,一般一天一次即可(因为删除快照远比创建快照的开销要大)。
怎么样,使用起来是不是很简单,当发现有数据被误删或误改,只需要使用 zfs list -t snapshot 找到之前正确时间点的快照,然后 zfs rollback 或 zfs clone 到其它数据集找出当时的文件即可,当然你也可以把 snapdir 参数打开,直接进快照目录找文件。zfsnap 还有更多的使用方法和参数,想了解可以去它的网站上看看 。
参考网站:
https://github.com/zfsnap/zfsnap
https://www.freebsd.org/cgi/man.cgi?query=zfsnap&sektion=8&manpath=freebsd-release-ports
评论 共有 0 条评论
暂无评论,快发表你的评论吧。