一个好用的Linux备份脚本

2021-03-02 | Tags: 源码

最近折腾了一下系统备份,搞了一个不错的备份脚本,分享一下

备份部分

#!/bin/bash

# Basic snapshot-style rsync backup script

# Config
OPT="-aAXv --delete"
LINK="--link-dest=/backup/last/" 
SRC="/"
SNAP="/backup/"
LAST="/backup/last"
date=`date "+%Y-%m-%d_%T"`

# Run rsync to create snapshot
rsync ${OPT} --exclude={"/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/media/*","/lost+found","/nfs/*","/backup/*","/data/*"} $LINK $SRC ${SNAP}$date


# Remove symlink to previous snapshot
rm -f $LAST

# Create new symlink to latest snapshot for the next backup to hardlink
ln -s ${SNAP}$date $LAST

这里使用rsync进行了增量备份,每次先将$SRC ${SNAP}$date的差异和$LINK进行比较,对于相同的部分使用硬连接表示,对于不同的部分才进行备份。其中 --exclude指定的是不需要备份的部分目录。

然后将最新的备份指定为$LAST,即为下一次备份的$LINK,可以节省很大的空间,听说Apple的时间胶囊也是用的类似的技术。

定时任务

使用的是每日定期任务,但是备份太多了也没有意义,所以自己写了一个python脚本来控制备份的清理:

import os
import datetime
import shutil

backup_dir = '/backup/'

today = datetime.datetime.today().date()

for backup in os.listdir(backup_dir):
    print(backup)
    if backup == 'last':
        continue

    try:
        backup_date = datetime.datetime(
                *map(int, backup.strip().split('_')[0].split('-'))
                ).date()
    except Exception as e:
        print(e.args, backup)
        continue

    delta = today - backup_date
    if delta.days > 30 and backup_date.weekday() != 0:
        print(os.path.join(backup_dir, backup))
        try:
            shutil.rmtree(os.path.join(backup_dir, backup))
            #os.system("rm -rf %s" % os.path.join(backup_dir, backup))
        except:
            print('delete', os.path.join(backup_dir, backup), 'failed')

if delta.days > 30 and backup_date.weekday() != 0:这里对时间距今大于30天的非周末备份进行了清理,即30天以上的备份仅每周保留一份。

最后在写一个脚本放在/etc/cron.daily/里每天执行这两个脚本就可以了。

现在已经用了一段时间了,效果如下,还是挺不错的:

dr-xr-xr-x. 19 root root 270 12月  6 23:25 2020-12-07_10:01:28
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2020-12-14_03:31:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2020-12-21_03:46:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2020-12-28_03:17:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-01-04_03:34:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-01-11_03:37:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-01-18_03:39:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-01-25_03:22:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-01-31_03:50:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-01_03:11:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-02_03:37:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-03_03:50:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-04_03:49:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-05_03:25:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-06_03:45:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-07_03:32:02
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-08_03:46:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-09_03:23:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-10_03:18:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-11_03:42:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-12_03:18:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-13_03:31:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-14_03:50:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-15_03:37:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-16_03:50:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-17_03:07:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-18_03:22:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-19_03:23:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-20_03:42:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-21_03:44:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-22_03:20:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-23_03:10:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-24_03:24:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-25_03:13:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-26_03:29:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-27_03:48:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-02-28_03:44:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-03-01_03:16:01
dr-xr-xr-x. 19 root root 270 12月  6 23:25 2021-03-02_03:14:01
lrwxrwxrwx   1 root root  27  3月  2 03:20 last -> /backup/2021-03-02_03:14:01