介绍
Restic是用Go语言编写的安全高效的备份客户端,可以将本地文件备份到多种不同的后端存储库,如本地目录、SFTP服务器或S3兼容的对象存储服务。
在本教程中,我们将安装Restic并在对象存储服务上初始化一个存储库,然后将一些文件备份到存储库,最后,我们将自动化我们的备份以拍摄每小时的快照,并在需要时自动切割旧的快照。
前提条件
虽然Restic适用于Mac,Linux和Windows,但本教程中使用的命令和技术只会在MacOS和Linux上工作。
Restic 需要大量的内存运行,所以您应该有 1 GB 或更多 RAM 以避免收到错误。
您还需要了解有关您的对象存储服务的下列细节:
- 访问密钥 * 秘密密密钥 * 服务器 URL * 桶名称
如果您正在使用 DigitalOcean Spaces对象存储服务,您可以设置空间并通过遵循我们的教程(How to Create a DigitalOcean Space and API Key)获取上述所有信息(https://andsky.com/tech/tutorials/how-to-create-a-digitalocean-space-and-api-key)。
一旦你有你的对象存储信息,继续到下一个部分来安装Restic软件。
安装 Restic 备份客户端
Restic 可作为许多平台的预编译执行程序提供,这意味着我们可以下载单个文件并运行它,无需包管理器或依赖性。
要找到正确的文件来下载,首先使用您的网页浏览器导航到GitHub上的Restic的发布页面(https://github.com/restic/restic/releases/latest)。
对于 64 位 Linux 系统(最常见的服务器环境),您想要的文件以 _linux_amd64.bz2
结束。
对于 macOS,请寻找包含 _darwin_amd64.bz2
的文件。
右键单击正确的文件为您的系统,然后选择 Copy Link Address (文本可能在您的浏览器中略有不同)。
接下来,在您正在备份的计算机上的终端会话中(如果是远程计算机,您可能需要先通过SSH登录),请确保您在您的主目录中,然后下载文件以弯曲
:
1cd ~
2curl -LO https://github.com/restic/restic/releases/download/v0.7.3/restic_0.7.3_linux_amd64.bz
删除我们下载的文件:
1bunzip2 restic*
然后将文件复制到 /usr/local/bin
,并更新其权限以使其可执行. 我们需要使用 sudo' 来执行这两个操作,因为正常用户没有权限来写到
/usr/local/bin`:
1sudo cp restic* /usr/local/bin/restic
2sudo chmod a+x /usr/local/bin/restic
测试安装是否成功,通过呼叫restic
命令而没有参数:
1restic
一些帮助文本应该打印到您的屏幕上。如果是这样,则restic
二进制已经正确安装了。接下来,我们将为Restic创建一个配置文件,然后初始化我们的对象存储库。
创建配置文件
Restic 需要知道我们的访问密钥、秘密密钥、对象存储连接细节和存储密码,以便初始化我们可以备份的存储库。
环境变量是您可以在壳中定义的信息,这些信息被传递给您运行的程序,例如,您在命令行上运行的每个程序都可以看到您的$PWD
环境变量,其中包含当前目录的路径。
将敏感代币和密码放在环境变量中是常见的做法,因为在命令行中指定它们是不安全的,因为我们将在以后自动化我们的备份,我们将将这些信息保存到一个文件中,我们的脚本可以访问它。
首先,在您的家庭目录中打开一个文件:
1nano ~/.restic-env
这将打开一个带有nano
文本编辑器的空格文件。当我们完成时,该文件将由四个出口
命令组成。
1[label .restic-env]
2export AWS_ACCESS_KEY_ID="your-access-key"
3export AWS_SECRET_ACCESS_KEY="your-secret-key"
4export RESTIC_REPOSITORY="s3:server-url/bucket-name"
5export RESTIC_PASSWORD="a-strong-password"
访问和秘密密密钥将由您的对象存储服务提供,您可能希望仅为 Restic 生成一个独特的密钥集,以便在密钥丢失或被破坏的情况下,可以轻松撤销访问。
例如,RESTIC_REPOSITORY 的值是: s3:nyc3.digitaloceanspaces.com/example-bucket
. 如果您需要连接到非标准端口或仅通过不安全的 HTTP 连接到服务器,请将此信息包含在 URL 中,例如 s3:http://example-server:3000/example-bucket
。
「RESTIC_PASSWORD」定义了一个密码,Restic将使用它来加密您的备份. 此加密发生在本地,所以您可以备份到一个不受信任的离岸服务器,而不必担心您的文件的内容被曝光。
您应该在这里选择一个强大的密码,并将其复制到安全的地方进行备份。 生成强大的随机密码的一种方法是使用openssl
命令:
1openssl rand -base64 24
1[secondary_label Output]
2j8CGOSdz8ibUYK137wtdiD0SJiNroGUp
这会输出一个24个字符的随机字符串,您可以复制并粘贴到配置文件中。
一旦所有变量都正确填写,保存并关闭文件。
初始化存储器
要将配置加载到我们的壳环境中,我们源
我们刚刚创建的文件:
1source ~/.restic-env
您可以检查通过打印其中一个变量来确保此工作:
1echo $RESTIC_REPOSITORY
现在我们可以用 Restic 命令初始化我们的仓库:
1restic init
1[secondary_label Output]
2created restic backend 57f73c1afc at s3:nyc3.digitaloceanspaces.com/example-bucket
3
4Please note that knowledge of your password is required to access
5the repository. Losing your password means that your data is
6irrecoverably lost.
存储器现在已经准备好接收备份数据,我们将接下来发送这些数据。
备份一个目录
现在,我们的远程对象存储库已初始化,我们可以将备份数据推向它。除了加密,Restic在备份时还会变异,并且在备份时会消除重复性。这意味着我们的第一份备份将是所有文件的完整备份,后续备份只需要传输新文件和更改。
在我们备份之前,如果您在裸体系统上测试东西,需要一些示例文件来备份,请在您的主目录中创建一个简单的文本文件:
1echo "sharks have no organs for producing sound" >> ~/facts.txt
这将创建一个facts.txt
文件,现在将其备份,以及您的家庭目录的其他部分:
1restic backup ~
1[secondary_label Output]
2scan [/home/sammy]
3scanned 4 directories, 14 files in 0:00
4[0:04] 100.00% 2.558 MiB/s 10.230 MiB / 10.230 MiB 18 / 18 items 0 errors ETA 0:00
5duration: 0:04, 2.16MiB/s
6snapshot 427696a3 saved
Restic将工作一段时间,在途中向您显示实时状态更新,然后输出新快照的ID(上面强调)。
<$>[注] 注: 如果您想备份不同的目录,请用上面的~
代替目录路径。如果目标目录不属于您的用户,您可能需要使用sudo
在restic backup
前面。
接下来,我们将学习如何了解存储在我们的存储库中的快照的更多信息。
列出Snapshots
要列出存储在存储库中的备份,请使用snapshots
子命令:
1restic snapshots
1[secondary_label Output]
2ID Date Host Tags Directory
3----------------------------------------------------------------------
4427696a3 2017-10-23 16:37:17 restic-test /home/sammy
您可以看到我们第一次备份时收到的快照ID、拍摄快照时刻标记、主机名称、标签和备份的目录。
我们的 标签 列是空的,因为我们在本示例中没有使用任何标签。您可以通过添加一个 --tag
旗帜,然后是标签名称,将标签添加到快照中。
标签可用于在稍后设置保留策略时过滤即时截图,或在手动搜索某个特定的即时截图以恢复时。
您需要将存储密码复制到每个机器,您还可以为您的存储设置多个密码,以便获得更精确的访问控制。您可以在 [官方的 Restic 文件] 中找到有关管理存储密码的更多信息(https://restic.readthedocs.io/en/stable/manual.html# manage-repository-keys)。
现在,我们已经上传了一个快照,并知道如何列出我们的存储库内容,我们将使用我们的快照ID来测试恢复备份。
恢复一个 Snapshot
我们将恢复一个完整的快照到一个临时目录,以确认一切正常工作. 使用从上一步的列表中的快照ID. 我们将将恢复的文件发送到新目录中的 /tmp/restore
:
1restic restore 427696a3 --target /tmp/restore
1[secondary_label Output]
2restoring <Snapshot 427696a3 of [/home/sammy] at 2017-10-23 16:37:17.573706791 +0000 UTC by sammy@restic-test> to /tmp/restore
更改目录并列出其内容:
1cd /tmp/restore
2ls
您应该看到我们备份的目录. 在本示例中,它将是用户 sammy 的首页目录. 输入恢复的目录并列出内部的文件:
1cd sammy
2ls
1[secondary_label Output]
2facts.txt restic_0.7.3_linux_amd64
我们的facts.txt
文件在那里,以及我们在教程开始时提取的残留的二进制文件,在屏幕上打印facts.txt
,以确保它是我们期望的:
1cat facts.txt
你应该看到鲨鱼的事实,我们把它放在文件之前。
如果您不想在一张照片中恢复所有文件,您可以使用 --包括
和 --排除
选项来精确调整您的选择。阅读 Restic 文档中的 Restore**部分以了解更多信息。
现在我们知道备份和恢复工作了,让我们自动创建新的快照。
自动备份
Restic 包含一个忘记
命令,以帮助维护正在运行的快照档案。 您可以使用忘记 – prune
来设置每日、每小时、每周等备份的数量的策略。
我们将使用cron
系统服务每小时执行备份任务. 首先,打开用户的crontab:
1crontab -e
您可能会被要求选择文本编辑器。 选择您最喜欢的 - 或者nano
如果您没有意见 - 然后按ENTER
。 您的用户的默认 crontab 将在文本编辑器中打开。
1[label crontab]
2. . .
342 * * * * . /home/sammy/.restic-env; /usr/local/bin/restic backup -q /home/sammy; /usr/local/bin/restic forget -q --prune --keep-hourly 24 --keep-daily 7
让我们通过这个命令步骤. 该 42 *** **
定义了什么时候 cron
应该运行任务. 在这种情况下,它将运行在每一个** 小时** ,** 日** ,** 月** ,和** 周日** 的第42** 分钟。 有关这个语法的更多信息,请阅读我们的教程 如何使用 Cron 来自动化任务。
接下来, . /home/sammy/.restic-env;
等同于 source ~/.restic-env
,我们先前运行,将我们的密钥和密码加载到我们的壳环境中。
「/usr/local/bin/restic backup -q /home/sammy;」是我們的 Restic 備份命令. 我們使用到「restic」二進制的完整路徑,因為「cron」服務不會自動尋找「/usr/local/bin」的命令。 同樣地,我們用「/home/sammy」來明確地寫出主文件夾的路徑,而不是使用「~」的捷徑。 在寫作「cron」命令時,最好盡可能明確。
最后, /usr/local/bin/restic forget -q --prune --keep-hourly 24 --keep-daily 7
将根据指定保留旗帜不再需要的旧快照剪除。
当您更新命令以满足您的需求时,保存文件并离开文本编辑器. crontab 将被安装和激活. 几小时后,再次运行restic snapshots
,以验证新 snapshots 正在上传。
结论
在本教程中,我们创建了对象存储身份验证细节的Restic配置文件,使用Restic初始化一个存储库,备份了一些文件,并测试了备份。