«

使用TrueNAS的定时任务自动删除旧快照的方法

izilzty 发布于 阅读:854


我知道很多朋友可能会问,truenas不是有自动快照任务吗,在那里创建的快照可以自动删除,为什么还要手动删呢?所以,我先说明一下原因。
我有一台机器用来每天自动开机备份主服务器的数据,但是我又希望备份完成后它可以自动关机,所以整套备份和创建快照的命令都是在定时任务里面创建的,命令如下:

logger -s "start daily task";logger -s "create snapshot";zfs snapshot Data@$(date +auto-%Y.%m.%d_%H:%M:%S);logger -s "start rsync";rsync -a --delay-updates --delete-delay -X -p -r -t root@TrueNAS.lan::Share_RO /mnt/Data/Backup;logger -s "all done, auto poweroff after 300 seconds";sleep 300;poweroff

关于命令的具体含义应该都能看懂吧,我就偷个懒不解释了,如果有问题可以在评论里回复。把它直接填进计划任务里,就能实现创建快照->开始rsync备份->自动关机的操作。但是这样快照就没办法被truenas管理了,哪怕用了相同的命名方式。这时候就需要自己手动删除快照了,但是怎么实现呢?那当然是直接问咕噜咕噜啦!
找了一会,发现有命令可以满足需求,再通过细微的更改,就得到了下面的一行命令:

zsh -c 'zfs list -t snapshot -o name | grep ^Data@auto | sed -n -e :a -e "1,30!{P;N;D;};N;ba" | xargs -n 1 zfs destroy -r'

这里解释一下吧,计划任务,也就是cron只执行第一个命令,所以像这种用管道符连接起来的多个命令需要用zsh -c来合并成一个命令执行。然后Data@auto代表仅处理Data数据集里面以auto开头的快照,最后的30代表要保留多少个最新的快照。由于我是每天创建一个快照,所以这里保留30个就刚好是一个月的快照了。

参考链接:

https://serverfault.com/questions/340837/how-to-delete-all-but-last-n-zfs-snapshots

如果有朋友需要,这里是我用于每日备份的完整命令:

logger -s "start daily task";logger -s "create snapshot";zfs snapshot Data@$(date +auto-%Y.%m.%d_%H:%M:%S);logger -s "delete old snapshot";zsh -c 'zfs list -t snapshot -o name | grep ^Data@auto | sed -n -e :a -e "1,30!{P;N;D;};N;ba" | xargs -n 1 zfs destroy -r';logger -s "start rsync";rsync -a --delay-updates --delete-delay -X -p -r -t root@TrueNAS.MisakaNetwork::Share_RO /mnt/Data/Backup;logger -s "all done, auto poweroff after 300 seconds";sleep 300;poweroff

由于机器平时处于关机状态,不能自动维护,所以每月一号使用带清理池的备份命令:

logger -s "start monthly task";logger -s "create snapshot";zfs snapshot Data@$(date +auto-%Y.%m.%d_%H:%M:%S);logger -s "delete old snapshot";zsh -c 'zfs list -t snapshot -o name | grep ^Data@auto | sed -n -e :a -e "1,30!{P;N;D;};N;ba" | xargs -n 1 zfs destroy -r';logger -s "start rsync";rsync -a --delay-updates --delete-delay -X -p -r -t root@TrueNAS.lan::Share_RO /mnt/Data/Backup;logger -s "start scrub zpool Data";zpool scrub -w Data;logger -s "start scrub zpool boot-pool";zpool scrub -w boot-pool;logger -s "all done, auto poweroff after 300 seconds";sleep 300;poweroff