使用rsync每天自动进行远程增量备份的shell脚本
可配置的bash脚本,使用rsync将数据的增量备份发送到本地或远程目标。
- 项目地址:https://github.com/pedroetb/rsync-incremental-backup
- 码云fork: https://gitee.com/shangyexin/rsync-incremental-backup
译者理解
这里只针对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 |  | 
- 文件列表
 这时候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 |  | 
step2:
使用crontab -e创建定时任务:
| 1 |  | 
意思每天凌晨3点执行一次backup.sh。
添加完成后可以使用crontab -l查看创建的任务。
下面是完整的翻译:
一、描述
这些脚本执行目标目录到另一个本地或远程目录的增量备份(数量不限)。第一个目录充当主目录(不进行修改),在第二个目录(从目录)中复制自己。然后,你可以浏览从目录并将任何文件包含到任何以前的备份中。
仅存储新的或修改的数据(因为它们是增量数据),因此备份的大小不会增加太多。
如果备份过程被中断,请不要担心。你可以在脚本的下一次运行中继续执行此操作,而不会丢失数据,也不会重新发送以前传输的数据。
此外,还有一个具有特殊配置的本地备份脚本,用于为GNU/Linux文件系统进行备份。例如,它已经省略了临时路径,可移动路径和其他有问题的路径,并且打算备份到外部挂载点(位于/mnt)。
二、配置
你可以设置一些配置变量来自定义脚本:
- src:源目录的路径。将对目录里内容进行备份。可以是相对或绝对路径。可被参数覆盖。
- dst:目标目录的路径。备份将放置在这里。必须是绝对路径。可被参数覆盖。
- remote:ssh_config连接到远程主机的主机名(仅适用于远程版本)。可被参数覆盖。
- backupDepth:要保留的备份数量。当达到限制时,最早的备份将被删除。
- timeout:备份超时时间,如果超时备份进程没有响应,备份将被取消。
- pathBak0:- dst存储最新备份的目录。
- partialFolderName:- dst存储部分文件的目录。
- rotationLockFileName:锁定文件的名称,用于检测先前的备份失败。
- pathBakN:- dst存放其余备份的目录。
- nameBakN:增量备份目录的名称。最后会添加一个索引来显示文件的新旧。
- logName:给备份时生成的日志文件的名称。
- exclusionFileName:排除模式的文本文件的名称。 你必须在- ownFolderName定义的目录中创建它。
- ownFolderName:用于在备份进行时保存配置文件和日志的文件夹。
- logFolderName:- dst存储日志文件的目录。
- dateCmd:为GNU运行的命令- date
- interactiveMode:当设置为yes时,标志允许密码登录(仅用于远程版本)。
备份中的所有文件和文件夹(仅本地和远程)对所有用户具有读权限,因为不可读的备份是无用的。如果你担心权限问题,可以在备份访问级别上添加一个安全层(例如,使用密码保护的FTP帐户)。你还可以保留原始文件和文件夹的权限,从脚本中删除--chmod=+r标志。在系统备份中,默认情况下保留原始权限。
三、用法
(一)设置ssh_config(对于远程版本)
这个脚本是在没有用户干预的情况下运行的,因此需要授权源机器访问远程机器。要做到这一点,你应该使用ssh密钥来识别你,并设置一个ssh主机来正确地使用它们。
有很多教程专门介绍这些主题,你可以遵循其中之一。我不会对此做更详细的解释,但这里有一些很好的参考资料:
之后,应该使用ssh配置文件中的Host值作为脚本中的remote值。
如果你确实需要在没有SSH密钥身份验证的情况下使用这个脚本,请不要担心。可以将interactiveMode配置变量设置为yes,如果需要,将提示输入密码(仅一次)。当远程服务器需要通过密码进行身份验证时,这对于手动备份非常有用。
(二)自定义配置值
你至少需要配置src和dst(远程版本中还必须要配置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。
配置好自己的变量值后,您只需运行脚本即可开始备份过程。
此外,所有的配置变量,除了那些是由参数重写(src,dst和remote),都可以从外部通过脚本执行之前设置变量(或导出为环境变量)改变。例如,在ownFolderName不编辑脚本的情况下更改变量:
| 1 |  | 
(三)自动备份
就我个人而言,我将它安排为每周在anacron的用户模式下运行。这样,我就不需要记得运行它了。
要在用户模式下使用anacron,必须遵循以下步骤:
- 在home目录创建.anacron,并使用子文件夹etc和spool。使用以下内容在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:发送方删除同步文件(非目录)。