使用rsync每天自动进行远程增量备份的shell脚本

可配置的bash脚本,使用rsync将数据的增量备份发送到本地或远程目标。

译者理解

这里只针对rsync-incremental-backup-remote远程备份脚本谈一下自己的理解。

1.使用说明

  • 需求

我想把A机器的/personal文件夹备份到B机器的/store文件夹。

  • 复制脚本

首先将rsync-incremental-backup-remote脚本复制到A机器的/usr/bin目录。

  • 配置免密登入

如果不想每次备份时都输入密码,需要配置A机器免密登入到B机器,这里不展开说明,主要步骤就是将A机器用户的id_rsa.pub添加到B机器用户的authorized_keys中。

  • 执行备份

可以输入下面的命令:

1
rsync-incremental-backup-remote /software /store user@ip_of_machineB
  • 文件列表
    这时候B机器的文件结构如下:
    1
    2
    3
    4
    5
    6
    7
    8
    /store
    |--backup
    |--backup.1
    |--backup.2
    |--backup.3
    |--backup.N
    |--log
    |--data

data文件夹中是文件的最新版本,对应下面配置中的pathBak0

backup文件夹里是文件的历史备份版本,对应下面配置中的pathBakN

backup.1是具体的版本,每一个文件中都是完整备份,不需要额外合成操作,数字越小,版本越新,对应下面配置中的nameBakN

log文件夹存放的是备份的日志。

2.增量备份的含义

该脚本使用rsync进行增量备份,只传输文件改变的部分,目标目录里面的相同文件采用硬链接相同的文件只有保存一份,以节省空间。

但是如果变化的是一个很大的文件,虽然每次备份传输的都是增量部分,但是目标端会根据增量变化和之前的文件版本合成文件的最新版本。

如果一直变化的都是这个很大的文件,虽然传输节省了流量,但是目标端并不会节省太多空间。

3.定时任务

因为我这边的机器是24小时开机,所以没有使用anacron,直接使用的crontab

step1:

我们将需要备份的多条命令都写在backup.sh脚本中:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

# gerrit
rsync-incremental-backup-remote /software/gerrit /workspace/backup/1_gerrit root@114.114.114.114
# gitlab
rsync-incremental-backup-remote /software/gitlab /workspace/backup/2_gitlab root@114.114.114.114
# openldap
rsync-incremental-backup-remote /software/openldap /workspace/backup/3_openldap root@114.114.114.114
# self-service-password
rsync-incremental-backup-remote /software/self-service-password /workspace/backup/4_self-service-password root@114.114.114.114

step2:

使用crontab -e创建定时任务:

1
0 3 * * * /root/backup.sh

意思每天凌晨3点执行一次backup.sh

添加完成后可以使用crontab -l查看创建的任务。


下面是完整的翻译:

一、描述

这些脚本执行目标目录到另一个本地或远程目录的增量备份(数量不限)。第一个目录充当主目录(不进行修改),在第二个目录(从目录)中复制自己。然后,你可以浏览从目录并将任何文件包含到任何以前的备份中。

仅存储新的或修改的数据(因为它们是增量数据),因此备份的大小不会增加太多。

如果备份过程被中断,请不要担心。你可以在脚本的下一次运行中继续执行此操作,而不会丢失数据,也不会重新发送以前传输的数据。

此外,还有一个具有特殊配置的本地备份脚本,用于为GNU/Linux文件系统进行备份。例如,它已经省略了临时路径,可移动路径和其他有问题的路径,并且打算备份到外部挂载点(位于/mnt)。

二、配置

你可以设置一些配置变量来自定义脚本:

  • src:源目录的路径。将对目录里内容进行备份。可以是相对或绝对路径。可被参数覆盖。
  • dst:目标目录的路径。备份将放置在这里。必须是绝对路径。可被参数覆盖。
  • remote:ssh_config连接到远程主机的主机名(仅适用于远程版本)。可被参数覆盖。
  • backupDepth:要保留的备份数量。当达到限制时,最早的备份将被删除。
  • timeout:备份超时时间,如果超时备份进程没有响应,备份将被取消。
  • pathBak0dst存储最新备份的目录。
  • partialFolderNamedst存储部分文件的目录。
  • rotationLockFileName:锁定文件的名称,用于检测先前的备份失败。
  • pathBakNdst存放其余备份的目录。
  • nameBakN:增量备份目录的名称。最后会添加一个索引来显示文件的新旧。
  • logName:给备份时生成的日志文件的名称。
  • exclusionFileName:排除模式的文本文件的名称。 你必须在ownFolderName定义的目录中创建它。
  • ownFolderName:用于在备份进行时保存配置文件和日志的文件夹。
  • logFolderNamedst存储日志文件的目录。
  • dateCmd:为GNU运行的命令date
  • interactiveMode:当设置为yes时,标志允许密码登录(仅用于远程版本)。

备份中的所有文件和文件夹(仅本地和远程)对所有用户具有读权限,因为不可读的备份是无用的。如果你担心权限问题,可以在备份访问级别上添加一个安全层(例如,使用密码保护的FTP帐户)。你还可以保留原始文件和文件夹的权限,从脚本中删除--chmod=+r标志。在系统备份中,默认情况下保留原始权限。

三、用法

(一)设置ssh_config(对于远程版本)

这个脚本是在没有用户干预的情况下运行的,因此需要授权源机器访问远程机器。要做到这一点,你应该使用ssh密钥来识别你,并设置一个ssh主机来正确地使用它们。

有很多教程专门介绍这些主题,你可以遵循其中之一。我不会对此做更详细的解释,但这里有一些很好的参考资料:

之后,应该使用ssh配置文件中的Host值作为脚本中的remote值。

如果你确实需要在没有SSH密钥身份验证的情况下使用这个脚本,请不要担心。可以将interactiveMode配置变量设置为yes,如果需要,将提示输入密码(仅一次)。当远程服务器需要通过密码进行身份验证时,这对于手动备份非常有用。

(二)自定义配置值

你至少需要配置srcdst(远程版本中还必须要配置remote)的值,可以在脚本里配置或者在运行时传参:

  • $ ./rsync-incremental-backup-local /new/path/to/source /new/path/to/target(srcand dst).
  • $ ./rsync-incremental-backup-remote /new/path/to/source /new/path/to/target new_ssh_remote(src, dstand remote).
  • $ ./rsync-incremental-backup-system /mnt/new/path/to/target(only dst, srcis always root on this case).

如果要从备份中排除某些文件或目录,请将其路径(相对于备份根目录)添加到引用的文本文件中exclusionFileName

配置好自己的变量值后,您只需运行脚本即可开始备份过程。

此外,所有的配置变量,除了那些是由参数重写(srcdstremote),都可以从外部通过脚本执行之前设置变量(或导出为环境变量)改变。例如,在ownFolderName不编辑脚本的情况下更改变量:

1
2
3
4
5
$ ownFolderName=".backup" rsync-incremental-backup-remote /path/to/src /path/to/dst user@remote

# Or using an environment variable (maybe set at user session startup)
$ export ownFolderName=".backup"
$ rsync-incremental-backup-remote /path/to/src /path/to/dst user@remote

(三)自动备份

就我个人而言,我将它安排为每周在anacron的用户模式下运行。这样,我就不需要记得运行它了。

要在用户模式下使用anacron,必须遵循以下步骤:

  • 在home目录创建.anacron,并使用子文件夹etcspool
    1
    $ mkdir -p ~/.anacron/etc ~/.anacron/spool
    使用以下内容在~/.anacron/etc创建anacrontab文件。(或等效文件,请确保指定正确的脚本路径):
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # /etc/anacrontab: configuration file for anacron

    # See anacron(8) and anacrontab(5) for details.

    SHELL=/bin/bash
    PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
    START_HOURS_RANGE=8-22

    # period delay job-identifier command
    7 5 weekly_backup ~/bin/rsync-incremental-backup-remote
  • 让你的anacron在登录时开始。将以下内容添加到~/.profile文件的末尾:
    1
    2
    # User anacron
    /usr/sbin/anacron -s -t ${HOME}/.anacron/etc/anacrontab -S ${HOME}/.anacron/spool

(四)检查备份内容

如果使用默认文件夹名称,则最新的数据备份将位于<dst>/data中。 第二个最新备份位于<dst>/backup/backup.1内部,下一个位于<dst> /backup/backup.2中,依此类推。每个备份操作的日志文件将存储在<dst>/log中。

四、rsync参数说明

  • -a:存档模式;等于-rlptgoD(无-H,-A,-X)。强制使用备份。

  • -c:根据校验和而不是修改时间和大小跳过。更可信,但速度较慢。如果要更快地备份,请忽略此标志,但是不会检测到未更改修改时间或大小的文件是否包含在备份中。

  • -h:以易于阅读的格式输出数字。

  • -v:增加日志记录的详细程度。

  • -z:在传输过程中压缩文件数据。传输的数据较少,但速度较慢。当备份目标是本地设备或本地网络中的计算机(或远程计算机的带宽较高)时,请忽略此标志。

  • --progress:显示传输过程中每个文件的进度。仅用于交互式使用。

  • --timeout:以秒为单位设置I/O超时。如果在指定时间内未传输任何数据,则备份将中止。

  • --delete:从目标目录中删除无关的文件。强制使用主从备份。

  • --link-dest:在未更改的情况下硬链接到指定目录中的文件,以减少备份之间重复文件的存储使用量。

  • --log-file:将我们正在执行的操作记录到指定的文件中。

  • --chmod:影响文件和/或目录权限。

  • --exclude:排除文件匹配模式。

  • --exclude-from:同--exclude,但从指定的文件获取模式。

  • 仅用于远程备份:

    • --no-W:确保使用rsync的增量传输算法,因此如果目标处存在整个文件,则永远不会传输整个文件。仅当您具有高带宽目标时才省略,备份可能会更快。
    • --partial-dir:将部分传输的文件放入指定目录,而不是在传输文件的原始路径中使用隐藏文件。强制允许部分传输以避免文件不完整或者文件损坏造成的误导。
  • 仅用于本地备份:

    • -W:忽略rsync的增量传输算法,因此它始终传输整个文件。当目标带宽较高(本地文件系统或LAN)时,备份可能会更快。
  • 仅用于系统备份:

    • -A:保留ACL(表示-p)。
  • 仅用于日志发送:

    • -r:递归到目录中。
    • --remove-source-files:发送方删除同步文件(非目录)。

五、参考文献


使用rsync每天自动进行远程增量备份的shell脚本
https://www.shangyexin.com/2020/05/14/rsync/
作者
Yasin
发布于
2020年5月14日
许可协议