跳至内容

备份解决方案 - rsnapshot

先决条件

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

介绍

rsnapshot 是一款功能强大的备份实用程序,可以在任何基于 Linux 的机器上安装。它可以本地备份机器,或者您可以从一台机器备份多台机器,例如服务器。

rsnapshot 使用rsync,并且完全用 Perl 编写,没有库依赖项。安装没有特殊要求。在 Rocky Linux 的情况下,您可以使用 EPEL 存储库安装rnapshot。在 Rocky Linux 9.0 最初发布之后,EPEL 中有一段时间没有包含rsnapshot 包。现在这种情况不再存在,但这些说明包括一种从源代码安装的方法,以防这种情况再次发生。

本文档仅介绍在 Rocky Linux 上安装rsnapshot

安装rsnapshot

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

安装 EPEL 存储库

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

sudo dnf install epel-release -y

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

安装rsnapshot

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

sudo dnf install rsnapshot openssh-server rsync

如果有任何缺少的依赖项,这些依赖项将会显示出来,您只需要回答提示以继续即可。例如

dnf install rsnapshot
Last metadata expiration check: 0:00:16 ago on Mon Feb 22 00:12:45 2021.
Dependencies resolved.
========================================================================================================================================
Package                           Architecture                 Version                              Repository                    Size
========================================================================================================================================
Installing:
rsnapshot                         noarch                       1.4.3-1.el8                          epel                         121 k
Installing dependencies:
perl-Lchown                       x86_64                       1.01-14.el8                          epel                          18 k
rsync                             x86_64                       3.1.3-9.el8                          baseos                       404 k

Transaction Summary
========================================================================================================================================
Install  3 Packages

Total download size: 543 k
Installed size: 1.2 M
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
  3. 右键点击“下载 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

运行authogen.sh脚本以生成配置脚本

./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,然后按制表符,然后键入/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!)并退出配置文件。

检查配置

您希望确保在编辑配置文件时,没有添加空格或任何其他明显的错误。为此,您需要使用configtest选项对我们的配置运行rsnapshot

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 阵列或大型存储容量的机器上进行多台机器的备份,无论是在本地还是通过 Internet 连接从其他地方进行备份,效果都很好。

如果通过 Internet 运行这些备份,您需要确保每个位置都有足够的带宽,以便备份能够顺利进行。您可以使用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.org 上找到有关 rsnapshot 的更多信息。

作者:Steven Spencer

贡献者:Ezequiel Bruni,Ganna Zhyrnova