可配置的bash脚本,使用rsync将数据的增量备份发送到本地或远程目标。
这里只针对rsync-incremental-backup-remote
远程备份脚本谈一下自己的理解。
我想把A机器的/personal
文件夹备份到B机器的/store
文件夹。
首先将rsync-incremental-backup-remote
脚本复制到A机器的/usr/bin
目录。
如果不想每次备份时都输入密码,需要配置A机器免密登入到B机器,这里不展开说明,主要步骤就是将A机器用户的id_rsa.pub
添加到B机器用户的authorized_keys
中。
可以输入下面的命令:
rsync-incremental-backup-remote /software /store user@ip_of_machineB
/store
|--backup
|--backup.1
|--backup.2
|--backup.3
|--backup.N
|--log
|--data
data
文件夹中是文件的最新版本,对应下面配置中的pathBak0
。
backup
文件夹里是文件的历史备份版本,对应下面配置中的pathBakN
。
backup.1
是具体的版本,每一个文件中都是完整备份,不需要额外合成操作,数字越小,版本越新,对应下面配置中的nameBakN
。
log
文件夹存放的是备份的日志。
该脚本使用rsync
进行增量备份,只传输文件改变的部分,目标目录里面的相同文件采用硬链接
,相同的文件只有保存一份,以节省空间。
但是如果变化的是一个很大的文件,虽然每次备份传输的都是增量部分,但是目标端会根据增量变化和之前的文件版本合成文件的最新版本。
如果一直变化的都是这个很大的文件,虽然传输节省了流量,但是目标端并不会节省太多空间。
因为我这边的机器是24小时开机,所以没有使用anacron
,直接使用的crontab
。
我们将需要备份的多条命令都写在backup.sh
脚本中:
#!/bin/bash
# gerrit
rsync-incremental-backup-remote /software/gerrit /workspace/backup/1_gerrit [email protected]
# gitlab
rsync-incremental-backup-remote /software/gitlab /workspace/backup/2_gitlab [email protected]
# openldap
rsync-incremental-backup-remote /software/openldap /workspace/backup/3_openldap [email protected]
# self-service-password
rsync-incremental-backup-remote /software/self-service-password /workspace/backup/4_self-service-password [email protected]
使用crontab -e
创建定时任务:
0 3 * * * /root/backup.sh
意思每天凌晨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密钥来识别你,并设置一个ssh主机来正确地使用它们。
有很多教程专门介绍这些主题,你可以遵循其中之一。我不会对此做更详细的解释,但这里有一些很好的参考资料:
之后,应该使用ssh配置文件中的Host
值作为脚本中的remote
值。
如果你确实需要在没有SSH密钥身份验证的情况下使用这个脚本,请不要担心。可以将interactiveMode
配置变量设置为yes
,如果需要,将提示输入密码(仅一次)。当远程服务器需要通过密码进行身份验证时,这对于手动备份非常有用。
你至少需要配置src
和dst
(远程版本中还必须要配置remote
)的值,可以在脚本里配置或者在运行时传参:
$ ./rsync-incremental-backup-local /new/path/to/source /new/path/to/target
(src
and dst
).$ ./rsync-incremental-backup-remote /new/path/to/source /new/path/to/target new_ssh_remote
(src
, dst
and remote
).$ ./rsync-incremental-backup-system /mnt/new/path/to/target
(only dst
, src
is always root on this case).如果要从备份中排除某些文件或目录,请将其路径(相对于备份根目录)添加到引用的文本文件中exclusionFileName
。
配置好自己的变量值后,您只需运行脚本即可开始备份过程。
此外,所有的配置变量,除了那些是由参数重写(src
,dst
和remote
),都可以从外部通过脚本执行之前设置变量(或导出为环境变量)改变。例如,在ownFolderName
不编辑脚本的情况下更改变量:
$ 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,必须遵循以下步骤:
.anacron
,并使用子文件夹etc
和spool
。$ mkdir -p ~/.anacron/etc ~/.anacron/spool
使用以下内容在~/.anacron/etc
创建anacrontab
文件。(或等效文件,请确保指定正确的脚本路径):
# /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
~/.profile
文件的末尾:# User anacron
/usr/sbin/anacron -s -t ${HOME}/.anacron/etc/anacrontab -S ${HOME}/.anacron/spool
如果使用默认文件夹名称,则最新的数据备份将位于
中。 第二个最新备份位于
内部,下一个位于
中,依此类推。每个备份操作的日志文件将存储在
中。
-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
:发送方删除同步文件(非目录)。灵感来自于: