从 Linux 进行增量备份

从 Linux 进行增量备份

我想在 Linux 机器上进行增量备份,方法如下:

BACKUP1                BACKUP2
|                      |
|                      |
|--- file1             |--- file1 (symlink to file1 in backup1 because it hasn't changed)
|                      |
|                      |
|--- file2             |--- file2 (is copied again because it has changed)
|                      |
|                      |
|--- file3             |--- file 3 (same as file1, a symlink)

有什么简单的方法可以做到这一点?我正在使用这个脚本:

#!/bin/sh

date=`date "+%Y-%m-%dT%H:%M:%S"`
rsync -aP --link-dest=~/Backups/current ~/Documents ~/Backups/back-$date
rm -f ~/Backups/current
ln -s back-$date ~/Backups/current

但这只是再次复制了所有内容。谢谢 :D

答案1

我使用 rsync 和 cpio 编写了一个 bash 脚本:http://pastebin.com/uRdH2uQf

因此,我做的第一件事就是创建一个目录结构。我的工作方式如下:每天创建一个备份,第 7 天(星期日)我获取最后一次备份(上一周的星期日)并将其放入每周备份中。每 4 周我进行一次月度备份。

所有这些备份都是增量的,并且基于 1 次完整备份。

我的目录结构基于 /mnt/backups,如下所示:

--- SERVER1
   |--- daily
        |  --- 0
        |  --- 1
        |  --- 2
        |  --- 3
        |  --- 4
        |  --- 5
        |  --- 6
    |--- weekly
        |--- 0
        |--- 1
        |--- 2
        |--- 3
    |--- monthly
        |  --- 0
        |  --- 1
        |  --- 10
        |  --- 2
        |  --- 3
        |  --- 4
        |  --- 5
        |  --- 6
        |  --- 7
        |  --- 8
        |  --- 9

我还使用脚本快速创建此结构:http://pastebin.com/LyFLBZGx

因此,我的所有脚本都位于 /root/backup_tools 中。backup.sh 脚本被放入 crontab 中,每天运行。我从备份服务器到所有需要备份的服务器进行密钥交换。在我的工具目录中,我将排除文件(我不想备份的文件夹/文件)放在以下格式中:

rsync.exclude.server1

这些文件包含不备份的目录:

/proc
/sys
/tmp

我还使用我的 /.ssh/config 文件来添加主机(例如:server1.example.com 定义为具有 ssh 端口 xxxx 和用户名 foo 的 server1)。这使得在脚本的第一行中添加要备份的服务器变得容易得多。

Host server1
        User root
        Port 31337
        Hostname server1.example.com

该脚本将检查规则 SERVERS="",并且对于在那里定义的每个服务器(以空格分隔),它将启动增量备份(并排除排除文件中的所有目录)。

它将使用 cpio 来旋转目录(cpio 允许复制链接到磁盘上的实际块,因此文件将在您的硬盘上出现两次,并且只使用一次空间。它也不是符号链接,因为当您删除原始文件时,副本仍然可以读取)

我希望这有点清楚。bash 脚本并不完美,但它确实能完成工作。我每晚都用它备份 4 台服务器。我现在有几个月的备份,它们并不大。它确实节省空间。

答案2

在您的示例中,您提到了符号链接,但 rsync 处理的是硬链接。您在评论中提到您不确定链接是什么,因此读者文摘版本为:

  • 符号链接就像 Windows 中的“快捷方式”——它只是告诉你“你想要的文件在那里”
  • 硬链接与 Windows 没有直接关联 —— 至少在常见用法中没有。硬链接实际上是同一个文件的另一个“入口点”;在文件系统中,它似乎是链接文件的精确副本,但在物理磁盘上只有文件的副本,无论有多少个硬链接。

rsync 的“--link-dest”选项会为不会改变的文件创建硬链接。这在尝试确定脚本是否按预期工作时会有些令人困惑,因为如果您要检查备份目录中所有文件的大小(例如使用du -sh [directory]或通过检查 GUI 中的属性),它看起来会与原始目录的大小相同,无论这些文件中有多少实际上是硬链接,因此不会占用任何额外空间。

使用或通过查看实际磁盘空间的 GUI 工具检查磁盘空间df。然后,运行备份脚本并再次检查 - 如果没有文件更改,则磁盘使用量根本不会改变(好吧,有一点点 - 硬链接本身占用少量空间);如果文件确实发生了变化,则磁盘使用量将增加仅有的哪些文件发生了变化。

无论哪种情况,rsync 的输出都会列出它正在检查的文件,无论它是否真的在复制这些文件。查看末尾的“加速”值 - 如果该数字小于 1,则表明您至少获得了一些硬链接,因为这表示与 rsync 估计的复制所有文件所需的时间之间的百分比差异。

答案3

您实际上想使用硬链接来执行此操作。在 Linux 机器上执行此类备份的最佳工具是快照确实如此确切地正如您所描述的,设置起来非常简单。

相关内容