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

2023-05-16

rsync-incremental-backup

可配置的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中。

  • 执行备份

可以输入下面的命令:

rsync-incremental-backup-remote /software /store user@ip_of_machineB
  • 文件列表
    这时候B机器的文件结构如下:
/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脚本中:

#!/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创建定时任务:

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主机来正确地使用它们。

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

  • How To Set Up SSH Keys
  • OpenSSH Config File Examples

之后,应该使用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不编辑脚本的情况下更改变量:

$ 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
$ 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
  • 让你的anacron在登录时开始。将以下内容添加到~/.profile文件的末尾:
# 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:发送方删除同步文件(非目录)。

五、参考文献

灵感来自于:

  • Incremental Backups on Linux.
  • Rsync full system backup.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • Bash 方法的返回值总是模 256

    我有一个 bash 脚本方法 它返回输入值 然而 返回值始终是模 256 的值 我用 google 搜索了一段时间 发现this http www tldp org LDP abs html exitcodes html文章说它总是以 25
  • 如何在lua中获取shell脚本的返回码?

    我正在lua中执行一个脚本 os execute sh manager scripts update system sh f 我想获得脚本的输出 如果退出状态为 7 则返回 7 I tried local output os execute
  • bash 变量中的 Linux 鞭尾/对话框参数错误

    有人可以解释为什么下面的代码不起作用吗 我要疯狂地想找出答案 bin bash TEST M1 1 wire Interface ON echo TEST RESULT dialog title Config Modules State c
  • 仅当重复行与模式匹配时才删除它们

    这个问题 https stackoverflow com questions 1444406 how can i delete duplicate lines in a file in unix有一个很好的答案说你可以使用awk seen
  • Bash 解析和 shell 扩展

    我对 bash 解析输入和执行扩展的方式感到困惑 对于输入来说 hello world 作为 bash 中的参数传递给显示其输入内容的脚本 我不太确定 Bash 如何解析它 Example var hello world displaywh
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • 有没有办法让我简化这些回声? [复制]

    这个问题在这里已经有答案了 我仍在学习如何编写 shell 脚本 并且我面临着一个挑战 让我更容易回显 Name1 Name2 Name15 我不太确定从哪里开始 我已经想法 但如果我搞砸了 我不想看起来很傻 有什么帮助吗 我实际上还没有尝
  • 添加要在给定命令中运行的 .env 变量

    我有一个 env 文件 其中包含如下变量 HELLO world SOMETHING nothing 前几天我发现了这个很棒的脚本 它将这些变量放入当前会话中 所以当我运行这样的东西时 cat env grep v xargs node t
  • sed 错误“未终止的 's' 命令”故障排除

    我正在构建一个script https stackoverflow com questions 4036832 replacing a specific term in an xml file其中 它将用文件夹路径替换 XML 文件中的模式
  • 使用 awk 读取文件并搜索另一个文件

    我正在读取一个文件 每行都有数字 我需要搜索另一个满足这些数字和其他条件的文件 我正在尝试使用 awk 来做到这一点 但遇到了问题 File a txt 1476 1477 1497 现在我需要打印第 12 列包含这些数字的行以及第 3 列
  • 从 UNIX 命令行向串行端口发送字节?

    我想使用命令行将字节流发送到串行端口 这可能吗 我的串口位于 dev cu usbserial A700dYoR在我的 Mac 上 例如 如果我想将整数 50 或字符串 data 发送到该串行端口 我该怎么做 我对 UNIX 的了解非常有限
  • 分叉/多线程进程|重击

    我想让我的代码的一部分更加高效 我正在考虑让它分叉成多个进程 并让它们一次执行 50 100 次 而不是只执行一次 例如 伪 for line in file do foo foo2 foo3 done 我希望这个 for 循环运行多次 我
  • 通过 sed 使用 unix 变量将数据附加到每行末尾[重复]

    这个问题在这里已经有答案了 我有一个文件 我想使用 SED 将值附加到每行末尾的 unix 变量中 我已经通过 AWK 实现了这一点 但我想在 SED 中实现 像这样的东西 我已经尝试过以下命令 但它不起作用 sed i s BATCH R
  • 在退出脚本之前等待后台进程完成

    在退出脚本 TCL Bash 之前 如何确保所有后台进程已完成执行 我正在考虑将所有后台进程 pid 写入 pid 文件 然后最后 pgrep pidfile 以查看在退出之前是否有任何进程仍在运行 有一些更简单的方法可以做到这一点吗 TC
  • bash循环跳过注释行

    我正在循环文件中的行 我只需要跳过以 开头的行 我怎么做 bin sh while read line do if line doesn t start with then echo line fi done lt tmp myfile 谢
  • 每个命令都返回“bash:<命令>:找不到命令...”[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我刚刚安装了 Scala 并添加了路径gedit bashrc export SCALA HOME home avijit sca
  • Shell 脚本中的块注释

    有没有一种简单的方法可以注释掉 shell 脚本中的代码块 In bash bin bash echo before comment lt lt END bla bla blurfl END echo after comment The a
  • java Runtime.getRunTime().exec 和通配符?

    我正在尝试使用删除垃圾文件 Process p Runtime getRuntime exec 只要我不使用通配符 它 就可以正常工作 即 Process p Runtime getRuntime exec bin rm f specifi
  • 如何让 STDOUT 和 STDERR 都转到终端和日志文件?

    我有一个脚本 将由非技术用户交互式运行 该脚本将状态更新写入 STDOUT 以便用户可以确定脚本运行正常 我希望将Stdout和STDERR重定向到终端 以便用户可以看到脚本正在工作 并查看是否存在问题 我还希望将两个流都重定向到日志文件
  • 这种 bash 文件名提取技术有何用途?

    我有一部分 bash 脚本正在获取不带扩展名的文件名 但我试图了解这里到底发生了什么 是做什么用的 有人可以详细说明 bash 在幕后做了什么吗 如何在一般基础上使用该技术 bin bash for src in tif do txt sr

随机推荐

  • TCP和UDP协议发送数据包的大小

    在进行UDP编程的时候 我们最容易想到的问题就是 一次发送多少bytes好 当然 这个没有唯一答案 xff0c 相对于不同的系统 不同的要求 其得到的答案是不一样的 这里仅对像ICQ一类的发送聊天消息的情况作分析 xff0c 对于其他情况
  • Nodejs开发:如何让node app的程序一直运行?

    情境 运行nodejs的程序 xff0c 使用命令 xff1a node xxx js xff0c 但是关掉终端 xff0c 程序也关闭了 xff0c 如何让node app的程序一直运行 xff1f 解决 1 安装forever npm
  • Godot基础教程02:全都是节点

    在这里先劝退一波人 xff1a 本教程只会涉及2D内容 xff0c 不会涉及3D内容 创建节点 接上一章 xff0c 在左侧的场景面板中 xff0c 可以看到 xff1a 由于本教程只讲2D内容 xff0c 所以这里我们应该选择2D场景 x
  • docker安装gitlab-ce镜像,使用其他端口,亲测可用

    首先鄙视一下那些直接复制粘贴当自己博文的 xff0c 误导别人 xff0c 害我改了好久T T 安装步骤 xff1a 创建数据目录 mkdir p data gitlab config mkdir p data gitlab logs mk
  • iOS 录音,播放,转码MP3,上传语音文件

    语音文件 AVAudioRecorder recorder NSTimer timer NSString urlPlay BOOL isPlay pragma mark 61 61 61 61 61 61 61 61 61 语音文件 61
  • CentOS使用yum安装MySQL5.7报检索密钥错误解决方法

    在CentOS上使用yum安装MySQL时检索密钥错误的解决方法 参考 使用yum安装MySQL时报错 yum y install mysql mysql server yum y install mysql community serve
  • 安装django

    使用pip安装 pip install django 61 61 span class hljs string 39 1 8 39 span 检查django版本 python c span class hljs string 39 imp
  • python,pycharm报错 ModuleNotFoundError: No module named PIL最简单的解决方法

    python pycharm报错 ModuleNotFoundError No module named 39 PIL 最简单的解决方法 1进入cmd命令 2输入pip install Pillow即可 如图 如果对你有帮助 xff0c 请
  • docker中使用Ubuntu中文乱码问题解决

    一 前言 最近在docker中使用Ubuntu作为编译环境 xff0c 遇到了中文乱码情况 xff0c 分为不同的解决场景 xff0c 下面分别给出解决方法 下面的方法都不是将系统的语言修改为中文 xff0c 而是能够正确显示和输入中文 g
  • 在docker的centos镜像中使用systemctl启动slapd服务报错

    前言 使用docker搭建服务环境 xff0c 拉取了一个Centos7镜像 xff0c 在镜像中使用systemctl命令启动sladpd服务 xff0c 已经使用 privileged 61 true启用特权模式 xff0c 但还是报错
  • 逻辑卷管理器(LVM)

    一 什么是LVM xff1f LVM Logical Volume Manager 逻辑卷管理是在Linux2 4内核以上实现的磁盘管理技术 它是Linux环境下对磁盘分区进行管理的一种机制 现在不仅仅是Linux系统上可以使用LVM这种磁
  • Ubuntu使用Docker搭建编译环境完整教程

    前言 因为只有一台编译服务器 xff0c 但是我们需要在服务器上搭建不同的编译环境 xff0c 不同的编译环境区别巨大 xff0c 甚至可能需要是不同的Ubuntu版本 xff0c 所以我们可以使用Docker xff0c 搭建不同的编译环
  • 最新Gerrit2.16.15版本用户指南-中文文档

    这是为Gerrit最终用户准备的Gerrit指南 它说明了标准的Gerrit工作流程以及指导用户可以根据个人喜好来设置并使用Gerrit 为了更好地理解本指南 xff0c 读者最好了解Git xff0c 并熟悉基本的git命令和工作流程 什
  • Ubuntu 14.04安装Sambaf服务并设置为开机启动

    1 需求 我的需求是将Ubuntu服务器上的用户目录 xff08 比如 home yasin xff09 映射给Windows访问 xff0c 这样就可以在Windows下编辑代码 xff0c 修改完成后在Linux环境编译 2 安装 sp
  • Git Commit message编写指南

    一 Commit message 的作用 格式化的Commit message xff0c 有几个好处 1 提供更多的历史信息 xff0c 方便快速浏览 比如 xff0c 下面的命令显示上次发布后的变动 xff0c 每个commit占据一行
  • Windows下写代码并使用 SSHFS快速部署到 Linux 进行调试

    前言 很多时候 xff0c 因为不熟悉vim或者更喜欢Windows下的一些IDE xff0c 我们需要在Windows写代码并部署到Linux服务器上进行调试 相信很多程序员都有这个需求 xff0c 也有很多自己的解决方法 常见的有使用G
  • Android开发——java.lang.SecurityException: Permission Denial

    记录一个在日常开发当中遇到的错误 xff1a java lang SecurityException Permission Denial startForeground from pid 61 2345 uid 61 10395 requi
  • OpenWrt打开和关闭指定端口shell脚本

    最近使用小米路由器插件Misstar Tools xff0c 因为它在小米路由器3上使用的端口为1024 xff0c 而且没有密码 xff0c 所以把这个端口暴露在公网上就非常不安全 但有时候我们确实就想在公网上使用这个插件 xff0c 比
  • Windows使用阿里云RAM访问控制API实现自建DDNS动态域名解析

    前言 因为最近将家里的电信宽带换成了公网IP xff0c 在二手鱼上面淘了点破烂 xff0c 搭建了一些服务 xff08 比如NAS xff09 而电信的公网IP并不是固定的 xff0c 要想持续稳定的访问到搭建的服务 xff0c 我们可以
  • 使用rsync每天自动进行远程增量备份的shell脚本

    rsync incremental backup 可配置的bash脚本 xff0c 使用rsync将数据的增量备份发送到本地或远程目标 项目地址 xff1a https github com pedroetb rsync increment