跳至内容

备份解决方案 - rsnapshot

先决条件

  • 了解如何从命令行安装附加存储库和快照
  • 了解挂载机器外部的文件系统(外部驱动器、远程文件系统等)
  • 了解如何使用编辑器(此处使用 vi,但您也可以使用您喜欢的编辑器)
  • 了解一些 Bash 脚本知识
  • 了解如何更改 root 用户的 crontab
  • 了解 SSH 公钥和私钥(仅当您计划从另一台服务器运行远程备份时)

简介

rsnapshot 是一个强大的备份工具,可以在任何基于 Linux 的机器上进行安装。它可以本地备份一台机器,也可以从一台机器备份多台服务器。

rsnapshot 完全用 Perl 编写,使用 rsync 且没有任何库依赖。安装没有任何特殊要求。对于 Rocky Linux,您可以通过 EPEL(企业 Linux 附加包)存储库安装 rsnapshot。如果您愿意,也可以选择从源代码安装。

本文档仅涵盖 rsnapshot 在 Rocky Linux 上的安装。

安装 rsnapshot

除非另有说明,否则此处的所有命令均从命令行调用。

安装 EPEL 存储库

您需要来自 Fedora 的 EPEL 软件存储库。要安装该存储库,只需使用此命令:

sudo dnf install epel-release -y

现在该存储库将处于活动状态。

安装 rsnapshot

安装 rsnapshot 和一些其他需要的工具

sudo dnf install rsnapshot openssh-server rsync

如果存在任何缺失的依赖项,它们会显示出来,您只需按提示继续即可。例如:

dnf install rsnapshot rsync
Last metadata expiration check: 2:03:40 ago on Fri 19 Sep 2025 03:54:16 PM UTC.
Package rsync-3.4.1-2.el10.x86_64 is already installed.
Dependencies resolved.
==============================================================================================================================
Package                         Architecture            Version                             Repository                  Size
==============================================================================================================================
Installing:
rsnapshot                       noarch                  1.5.1-1.el10_0                      epel                       112 k
Installing dependencies:
perl-DirHandle                  noarch                  1.05-512.2.el10_0                   appstream                   12 k

Transaction Summary
==============================================================================================================================
Install  2 Packages

Total download size: 124 k
Installed size: 388 k
Is this ok [y/N]: y

从源代码安装 rsnapshot

从源代码安装 rsnapshot 并不困难。但它有一个缺点,那就是如果发布了新版本,它将需要从源代码重新安装才能更新版本,而 EPEL 安装方法可以通过简单的 dnf upgrade 使您保持最新。

安装开发工具并下载源代码

这里的第一个步骤是安装“开发工具”组。

dnf groupinstall 'Development Tools'

您还需要一些其他包。

dnf install wget unzip rsync openssh-server

接下来,从 GitHub 存储库下载源代码文件。您可以通过多种方式完成此操作,但在本例中最简单的方法可能是直接下载存储库中的 ZIP 文件。

  1. 访问 https://github.com/rsnapshot/rsnapshot
  2. 点击右侧的绿色“Code”按钮 Code
  3. 右键单击“Download ZIP”并复制链接位置 Zip
  4. 使用 wgetcurl 下载复制的链接。示例:
    wget https://github.com/rsnapshot/rsnapshot/archive/refs/heads/master.zip
    
  5. 解压 master.zip 文件。
    unzip master.zip
    

构建源代码

下一步是构建。当您解压 master.zip 文件时,您会得到一个 rsnapshot-master 目录。在您的构建过程中,请进入该目录。请注意,您的构建使用了所有包的默认设置,因此如果您想要其他设置,则需要进行一些研究。此外,这些步骤直接取自 GitHub 安装页面。

cd rsnapshot-master

运行 autogen.sh 脚本来生成 configure 脚本。

./autogen.sh

技巧

您可能会看到几行如下所示的内容:

fatal: not a git repository (or any of the parent directories): .git

这些都不是致命的。

接下来,您需要运行 configure 并设置配置目录。

./configure --sysconfdir=/etc

最后,运行 make install

sudo make install

在此过程中,rsnapshot.conf 文件将被创建为 rsnapshot.conf.default。将此文件复制到 rsnapshot.conf,然后根据您的系统需求进行编辑。

sudo cp /etc/rsnapshot.conf.default /etc/rsnapshot.conf

这涵盖了复制配置文件。下面的“配置 rsnapshot”部分将介绍此配置文件中所需的更改。

挂载驱动器或文件系统以进行备份

在此步骤中,我们将展示如何挂载用于备份系统的驱动器,例如外部 USB 驱动器。此步骤仅在备份单个机器或服务器时(如我们在第一个示例中所见)是必需的。

  1. 连接 USB 驱动器。
  2. 键入 dmesg | grep sd,它将显示您要使用的驱动器。在本例中,它是 sda1
    示例:EXT4-fs (sda1): mounting ext2 file system using the ext4 subsystem
  3. 不幸的是(或者幸运的是,取决于您的看法),大多数现代 Linux 桌面操作系统都可以自动挂载驱动器。这意味着,根据各种因素,rsnapshot 可能会丢失驱动器的跟踪。您希望驱动器每次都“挂载”或使其文件可用在同一位置。
    为此,请获取 dmesg 命令显示的驱动器信息,并输入 mount | grep sda1,它将显示:/dev/sda1 on /media/username/8ea89e5e-9291-45c1-961d-99c346a2628a
  4. 键入 sudo umount /dev/sda1 来卸载您的外部驱动器。
  5. 接下来,创建一个挂载点用于备份:sudo mkdir /mnt/backup
  6. 将驱动器挂载到您的备份文件夹位置:sudo mount /dev/sda1 /mnt/backup
  7. 再次键入 mount | grep sda1,您将看到:/dev/sda1 on /mnt/backup type ext2 (rw,relatime)
  8. 接下来,在挂载的驱动器上创建一个目录,该目录必须存在才能继续备份。在此示例中,您可以使用一个名为“storage”的文件夹:sudo mkdir /mnt/backup/storage

对于单台机器,您必须在每次连接驱动器或每次系统重启时重复 umountmount 步骤,或者使用脚本自动化这些命令。

建议使用自动化。

配置 rsnapshot

这是最重要的一步。更改配置文件时可能会出错。rsnapshot 配置要求使用制表符分隔任何元素,并且配置文件顶部有相应的警告。

空格字符会导致整个配置——以及您的备份——失败。例如,在配置文件顶部附近有一个用于 # SNAPSHOT ROOT DIRECTORY # 的部分。如果您是从头开始添加的,您将键入 snapshot_root,然后 Tab,然后键入 /whatever_the_path_to_the_snapshot_root_will_be/

最好的地方是 rsnapshot 附带的默认配置只需进行少量更改即可用于本地机器的备份。然而,在开始编辑之前备份一份配置文件副本总是一个好主意。

cp /etc/rsnapshot.conf /etc/rsnapshot.conf.bak

基本机器或单服务器备份

在这种情况下,rsnapshot 将在本地运行以备份特定机器。在此示例中,配置文件细分向您展示了需要更改的内容。

您将需要使用 vi(或使用您喜欢的编辑器进行编辑)来打开 /etc/rsnapshot.conf 文件。

首先要更改的是 snapshot_root 设置。默认值为:

snapshot_root   /.snapshots/

您需要将其更改为您创建的挂载点,并添加“storage”。

snapshot_root   /mnt/backup/storage/`

您还希望指示备份在驱动器未挂载时不要运行。为此,请删除 no_create_root 旁边的注释(“#”符号),它看起来像这样:

no_create_root 1

接下来转到标题为 # EXTERNAL PROGRAM DEPENDENCIES # 的部分,并删除此行(再次是“#”符号)的注释。

#cmd_cp         /usr/bin/cp

现在它显示为:

cmd_cp         /usr/bin/cp

虽然您在此特定配置中不需要 cmd_ssh,但对于我们的其他选项,您将需要它,并且启用它也没有坏处。找到写着:

#cmd_ssh        /usr/bin/ssh

删除“#”符号。

cmd_ssh        /usr/bin/ssh

接下来,您需要跳到标题为 # BACKUP LEVELS / INTERVALS # 的部分。

早期版本的 rsnapshothourly, daily, monthly, yearly,但现在是 alpha, beta, gamma, delta。这有点令人困惑。您需要做的是为任何不使用的增量添加注释。在配置中,delta 已经被注释掉了。

在此示例中,您除了夜间备份外,不会运行任何其他增量。只需为 alpha 和 gamma 添加注释。完成后,您的配置文件将是:

#retain  alpha   6
retain  beta    7
#retain  gamma   4
#retain delta   3

跳到 logfile 行,默认情况下它是:

#logfile        /var/log/rsnapshot

删除注释。

logfile        /var/log/rsnapshot

最后,跳到 ### BACKUP POINTS / SCRIPTS ### 部分,并在 # LOCALHOST 部分添加任何您想要添加的目录。请记住,在元素之间使用 Tab 而不是 Space

现在保存您的更改(对于 vi,使用 Shift+:+wq!)并退出配置文件。

检查配置

您需要确保在编辑配置文件时没有添加空格或其他明显的错误。为此,请运行 rsnapshot 并使用 configtest 选项来检查您的配置。

如果不存在错误,rsnapshot configtest 将显示 Syntax OK

养成对特定配置运行 configtest 的习惯。这样做的原因将在您进入“多台机器或多台服务器备份”部分时更加明显。

要对特定配置文件运行 configtest,请使用 -c 选项指定配置。

rsnapshot -c /etc/rsnapshot.conf configtest

首次运行备份

configtest 验证一切正常后,现在是首次运行备份的时候了。您可以先在测试模式下运行它,以便查看备份脚本将执行的操作。

同样,在这种情况下,您不必一定指定配置,但养成这样做的好习惯。

rsnapshot -c /etc/rsnapshot.conf -t beta

这将返回类似以下内容的内容,显示备份实际运行时将发生什么:

echo 1441 > /var/run/rsnapshot.pid
mkdir -m 0755 -p /mnt/backup/storage/beta.0/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
    /home/ /mnt/backup/storage/beta.0/localhost/
mkdir -m 0755 -p /mnt/backup/storage/beta.0/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded /etc/ \
    /mnt/backup/storage/beta.0/localhost/
mkdir -m 0755 -p /mnt/backup/storage/beta.0/
/usr/bin/rsync -a --delete --numeric-ids --relative --delete-excluded \
    /usr/local/ /mnt/backup/storage/beta.0/localhost/
touch /mnt/backup/storage/beta.0/

当测试符合您的预期时,首次手动运行它,不带测试参数。

rsnapshot -c /etc/rsnapshot.conf beta

备份完成后,浏览到 /mnt/backup 并检查它在那里创建的目录结构。将有一个 storage/beta.0/localhost 目录,后跟您指定的备份目录。

进一步说明

每次备份运行时,它都会创建一个另一个 beta 增量,即 0-6,或 7 天的备份。最新的备份将始终是 beta.0,而昨天的备份将始终是 beta.1。

这些备份的大小看起来会占用相同的(或更多的)磁盘空间,但这是因为 rsnapshot 使用了硬链接。要从昨天的备份还原文件,只需将它们从 beta.1 的目录结构复制回来即可。

每次备份只是相对于上一次运行的增量备份,但是,由于使用了硬链接,每个备份目录都包含文件或指向实际备份到的目录中文件的硬链接。

要还原文件,您不必决定从哪个目录或增量还原它们,只需确定您要还原的备份的时间戳即可。这是一个很棒的系统,并且比许多其他备份解决方案占用的磁盘空间少得多。

设置自动运行备份

在完成测试并确信一切正常后,下一步是为 root 用户设置 crontab 以每天自动化该过程。

sudo crontab -e

如果您以前没有运行过此命令,请在出现 Select an editor 行时选择“vim.basic”作为您的编辑器或您自己的编辑器首选项。

要将备份设置为晚上 11 点自动运行,请将以下内容添加到 crontab

## Running the backup at 11 PM
00 23 *  *  *  /usr/bin/rsnapshot -c /etc/rsnapshot.conf beta`

多台机器或多台服务器备份

从具有 RAID 阵列或大容量存储驱动器的机器备份多台机器(本地或通过互联网连接)效果很好。

如果通过互联网运行这些备份,您需要确保每个地点都有足够的带宽来完成备份。您可以使用 rsnapshot 将本地服务器与异地备份阵列或备份服务器同步,以提高数据冗余性。

假设

从本地机器远程运行 rsnapshot。运行此确切配置也可以在远程异地运行。

在这种情况下,您需要将 rsnapshot 安装在进行备份的机器上。其他假设是:

  • 您将要备份的服务器上的防火墙规则允许远程机器 SSH 登录。
  • 您将要备份的每台服务器都安装了最新版本的 rsync。对于 Rocky Linux 服务器,运行 dnf install rsync 来更新您系统的 rsync 版本。
  • 您已以 root 用户身份连接到该机器,或者您已运行 sudo -s 切换到 root 用户。

SSH 公钥或私钥

对于将要运行备份的服务器,您需要生成一个 SSH 密钥对以在备份期间使用。在我们的示例中,您将创建 RSA 密钥。

如果您已经生成了一组密钥,可以跳过此步骤。您可以通过执行 ls -al .ssh 并查找 id_rsaid_rsa.pub 密钥对来查看。如果不存在,请使用以下链接为您的机器和要访问的服务器设置密钥:

SSH 公钥私钥对

rsnapshot 配置

配置文件需要与我们为“基本机器或单服务器备份”创建的几乎相同,只是您需要更改一些选项。

快照根目录是默认的:

snapshot_root   /.snapshots/

注释掉此行。

no_create_root 1
#no_create_root 1

另一个不同之处在于,每台机器都有自己的配置。当您熟悉之后,您只需将现有的配置文件复制到另一个名称,然后更改它以适应您想要备份的任何其他机器。

现在,您需要更改配置文件并保存它。将该文件复制为我们第一台服务器的模板:

cp /etc/rsnapshot.conf /etc/rsnapshot_web.conf

更改配置文件并使用机器名称创建日志和 lockfile

logfile /var/log/rsnapshot_web.log
lockfile        /var/run/rsnapshot_web.pid

接下来,更改 rsnapshot_web.conf 以包含您要备份的目录。唯一不同之处是目标。

以下是“web.ourdomain.com”配置的示例:

### BACKUP POINTS / SCRIPTS ###
backup  root@web.ourourdomain.com:/etc/     web.ourourdomain.com/
backup  root@web.ourourdomain.com:/var/www/     web.ourourdomain.com/
backup  root@web.ourdomain.com:/usr/local/     web.ourdomain.com/
backup  root@web.ourdomain.com:/home/     web.ourdomain.com/
backup  root@web.ourdomain.com:/root/     web.ourdomain.com/

检查配置并运行初始备份

您现在可以检查配置以确保其在语法上是正确的。

rsnapshot -c /etc/rsnapshot_web.conf configtest

您正在寻找 Syntax OK 消息。如果一切顺利,您可以手动运行备份。

/usr/bin/rsnapshot -c /etc/rsnapshot_web.conf beta

假设一切正常,您可以为邮件服务器(rsnapshot_mail.conf)和门户服务器(rsnapshot_portal.conf)创建配置文件,进行测试,并进行试运行备份。

自动化备份

自动化多台机器或服务器版本的备份略有不同。您需要创建一个 bash 脚本来按顺序调用备份。当一个完成时,下一个将开始。此脚本将如下所示:

vi /usr/local/sbin/backup_all

内容如下:

#!/bin/bash/
# script to run rsnapshot backups in succession
/usr/bin/rsnapshot -c /etc/rsnapshot_web.conf beta
/usr/bin/rsnapshot -c /etc/rsnapshot_mail.conf beta
/usr/bin/rsnapshot -c /etc/rsnapshot_portal.conf beta

将脚本保存到 /usr/local/sbin 并使脚本可执行。

chmod +x /usr/local/sbin/backup_all

创建 root 的 crontab 来运行备份脚本。

crontab -e

添加此行:

## Running the backup at 11 PM
00 23 *  *  *  /usr/local/sbin/backup_all

报告备份状态

为了确保一切都按计划备份,您可能希望将备份日志文件发送到您的电子邮件。如果您正在使用 rsnapshot 进行多台机器备份,每个日志文件将有自己的名称,您可以通过 使用 postfix 进行服务器进程报告 的程序发送到您的电子邮件进行审查。

还原备份

还原少量文件或整个备份涉及将您想要的文件从具有您想要还原的日期的目录(时间戳)复制回机器。

结论和其他资源

使用 rsnapshot 正确设置可能有点令人生畏,但它可以为您节省大量备份机器或服务器的时间。

rsnapshot 功能强大、快速且在磁盘空间使用方面经济高效。您可以通过访问 rsnapshot github 来了解更多关于 rsnapshot 的信息。

作者:Steven Spencer

贡献者:Ezequiel Bruni, Ganna Zhyrnova