将你的旧 Raspberry Pi 变成自动备份服务器

目前还没有读者喜欢这个。
open source button on keyboard

Opensource.com

如果你是那些升级到 Raspberry Pi 3 的人之一,你可能会想知道如何处理你旧的、性能较差的 Pi。除了把它变成一堆闪烁的 LED 灯来取悦你的猫之外,你还可以考虑将其配置为微控制器

正如我们大多数人勉强承认的那样,备份我们的数字生活是我们日常计算中最重要的事情,但我们却都不愿意去做。这是因为执行备份过程需要我们记住去做,这需要付出努力,并且需要时间。而这正是为什么最好的备份解决方案是根本无需做的解决方案;它是你自动化的解决方案。

当系统始终开启并在后台运行时,这种系统是最好的。而这正是 Raspberry Pi 最擅长的。你可以让 Pi 整天整夜开着,而永远不会注意到它对你的电费账单有任何影响,并且你可以让它执行简单的任务,即在你的家庭网络中运行备份。你只需要一个 Raspberry Pi 和一个大硬盘,你就基本上构建了一个定制版本的那些烦人的“简易备份”系统,这些系统是硬盘公司每隔几年就会推出的(你知道那些系统吗?就是那些你连接到你的网络,浪费一个周末试图配置,结果在一个隐藏的在线论坛中发现,由于固件中的错误,广告宣传的功能都无法实现,而硬盘公司两年前就承诺他们会“很快”修复)。

rdiff-backup

首先,你需要选择一些备份软件,让你的备份服务器(你的 Pi)和你的客户端(你的笔记本电脑、台式机以及其他设备)运行。

有很多用于自动备份的工具,但我多年来发现,大多数漂亮的图形化备份解决方案最终都会停止维护,直到它们消失,迫使我切换到其他不同的方案。过一段时间后,这会变得很烦人,所以我开始使用 rsync,这个受人尊敬的旧 UNIX 命令已经存在了几十年。它为我提供了很好的服务,但我开始发现自己想要某些文件的版本化备份;rsync 会为已更改的文件进行备份,但它会用新版本覆盖旧版本,所以如果我的问题不是文件被删除了,而是我把一个文件搞砸到无法识别的地步,那么拥有 rsync 备份的文件对我一点用处都没有,因为备份几乎总是最终成为我想要替换的文件的错误版本。

然后我找到了 rdiff-backup,这是一个基于 rsync 的简单备份工具(它使用 librsync),因此继承了它的可靠性(但是,它自 2001 年才出现,所以它没有 rsync 那样的历史)。Rdiff-backup 使用标准的 UNIX 工具(tarrdiffrsync 等)在本地或通过网络执行增量备份,所以即使它消失了,它创建的备份文件仍然有用。它很轻量级,并且可以在 Linux 和 FreeBSD 上运行,所以在最老的 Raspberry Pi 上运行它也很容易。

服务器安装

你不需要任何特殊的设置来将你的 Raspberry Pi 变成备份服务器。假设你的 Pi 已经启动并运行,你只需要从你的软件仓库、端口或 extras 站点安装 rdiff-backup

客户端安装

至于你的客户端(也就是,将被你的 Pi 备份的计算机),rdiff-backup 可以在 Linux、BSD、Windows 和 Mac OS X 上运行,所以你很有可能可以在你家中的所有计算机上使用它。

大硬盘

即使是 64GB 的 SD 卡对于增量备份来说也不够用,所以你需要一个大硬盘来连接到你的 Pi。你最了解你自己的数据,所以在购买硬盘时,让你的数据成为你的指南。对于我的家庭网络,我有一个相对较小的(考虑到我处理的媒体数据文件的数量)3TB 硬盘;我这样做有很多原因,但主要是因为我实际上并没有备份我拥有的所有数据。我处理的很多数据无论如何都存在于其他地方,所以没有必要备份它,而且像我的音乐和电影收藏之类的东西,我认为它们也不够重要到需要备份。所以不要觉得你必须字面上跟踪每一个千字节;只要了解你的数据以及对你来说最重要的是什么。

一旦你有了硬盘,把它连接到你的 Pi 并格式化它。严格来说,你可能不一定需要格式化它,但如果你要让 Linux 管理数据,那么你最好将数据存储在原生文件系统上。这假设你的备份驱动器是新的,或者是一个你想完全擦除的驱动器。如果不是,你可以跳过这一步。

要在 Linux 上格式化驱动器,你必须使用 root 权限。这在某种程度上取决于你在你的 Pi 上运行的发行版(Raspbian、Pidora 等),但通常 sudo 命令是调用此权限的方式。无论如何,要使用的工具是 parted,只要你没有其他驱动器连接到你的 Pi(除了它从中启动的 SD 卡),那么你的驱动器的位置就是 /dev/sda。为了安全起见,我将使用 /dev/sdx,只是为了避免潜在的复制粘贴失误。

首先,确认你的驱动器的位置

$ sudo ls -1 /dev/sd*
/dev/sdX
/dev/sdX1
/dev/sdX2

然后运行 parted 在驱动器上以确认其总大小

  $ sudo parted /dev/sdX unit MB print
Model: Tycoon hard drive Corp. (scsi)
Disk /dev/sda: 1985442MB
Sector size (logical/physical): 512B/512B
Partition Table: msdos

查看以 Disk 开头的行;这会告诉你驱动器的总大小,以兆字节为单位。把这个记下来,因为你稍后会用到它。

接下来,在驱动器上创建一个新分区,跨越整个驱动器。只有当你想要完全擦除备份驱动器以为你的所有备份腾出空间时才这样做。如果驱动器上有任何你永远消失的数据,那么不要这样做

  $ sudo parted /dev/sdX mklabel gpt
Warning: The existing disk label on /dev/sdX will be destroyed
and all data on this disk will be lost. Do you want to continue?
Yes/No? Yes
Information: You may need to update /etc/fstab.
$ sudo parted /dev/sdx mkpart primary 1 1985442
Information: You may need to update /etc/fstab.

你的新分区现在存在了,所以在其中创建一个文件系统。请注意,对于此命令,你使用的是分区而不是磁盘位置。所以例如,你将使用 /dev/sda1 而不是 /dev/sda。为了获得最佳效果,还要为磁盘提供一个标签(-L 选项),我们稍后将使用它来自动挂载驱动器。

$ sudo mkfs.ext4 -L backupdrive /dev/sdx1

你的驱动器现在已经准备好作为备份驱动器使用了。

自动挂载备份驱动器

使用 Pi 作为你的备份服务器的想法,部分原因在于它会始终开启。但是如果发生了一些事情(例如,电源故障或意外关机),那么你希望你的备份驱动器能够自动重新挂载,否则任何备份尝试都会失败。

要为你的驱动器设置自动挂载,首先创建一个标准位置来挂载它。驱动器通常挂载到像 /media/run/media 这样的位置,这很好,但为了简单起见,只需在你的文件系统的根目录创建一个目录

$ sudo mkdir /backupdrive

然后使用 root 权限在你的选择的文本编辑器中编辑 /etc/fstab。添加这一行

LABEL=backupdrive     /backupdrive    ext4   user,rw  0 0

最后挂载驱动器

$ sudo mount -a

初始备份

你做的第一次备份是最大和最慢的备份,因为你想要备份的所有内容都会被复制到你的驱动器。随后的备份会小得多且快得多,因为只有新文件(或 blob)或文件的更改会被复制过来。

首先,在客户端计算机(要备份到 Pi 的计算机)上安装 rdiff-backup。它适用于主要的操作系统。

为了确保你未来的备份如期进行,使用与你打算用于增量备份的相同命令和相同设置进行首次备份。这意味着你不应该从 Pi 上断开大驱动器并将其插入到客户端,以便它更快地运行;每次都以相同的方式执行每次备份,以便你确切地知道以后如何自动化它。

在 Pi 上,为你即将从客户端备份的文件夹创建一个目录。假设你想备份客户端的主目录,在备份驱动器上创建该文件夹的镜像

$ sudo mkdir -p /backupdrive/home/seth

然后确保同一个用户拥有该目录

$ chown seth:users /backupdrive/home/seth

这假设用户 seth 同时存在于客户端和 Pi 上。你不必这样做(rdiff-backup 可以作为不同的用户登录到 Pi),但当备份是源的镜像时,有时会更容易管理。

这也假设你正在备份你的主目录。这通常是一个好的开始(我假设如果你运行 Linux,那么你可以免费下载和替换基本系统),但你可能想要排除你不需要备份的大文件。在你主目录中名为 .excludes 的文件中列出要从备份中排除的文件和文件夹。至少,你可能可以安全地排除你的回收站目录

$ echo "$HOME/.local/.local/share/Trash" && $HOME/.excludes

来自你的客户端计算机的基本 rdiff-backup 命令,其中 192.168.3.14 是你的 Pi 的 IP 地址

$ rdiff-backup --terminal-verbosity 8 --print-statistics \
--exclude-globbing-filelist $HOME/.excludes \
/home/seth/ seth@192.168.3.14::/backupdrive/home/seth/

该命令应该启动一个漫长的 rsync 进程,在该进程中,所有文件都被发现不存在于备份驱动器上,因此从客户端复制到 Pi。如果它失败了,请检查所涉及的权限;你的用户(在 Pi 上)必须能够写入备份驱动器。此外,你的用户必须能够成功地 SSH 远程登录到 Pi。

自动登录

由于我们的目标是自动化这个过程,因此启动备份的登录过程也必须在无需干预的情况下发生。使 SSH 登录自动化很容易;只需使用 ssh 密钥登录。这可以使用 ssh-copy-id 一步完成,它应该在你的 Pi 发行版的软件仓库中)。要为此备份服务器使用专用密钥,请使用 ssh config 文件来指定要使用的密钥。

Cron 任务

假设到目前为止一切正常,那么无人值守的备份应该不会失败。为了实现这一点,使用你用于初始备份的相同命令,并将其分配给 cron 任务。这通常使用命令 cronjob -e 完成

0 */6 * * * rdiff-backup --exclude-globbing-filelist /home/seth/.excludes \
/home/seth/ seth@192.168.3.14::/backupdrive/seth/

该 cron 任务每六小时(在整点)运行备份命令。你可以根据你的需要调整频率。

恢复数据

现在备份已经自动化了,你实际上只需要记住一个命令:如何从你如此尽职尽责地进行的备份中恢复文件。

最简单的恢复命令就像 rsyncscp 一样简单

$ rdiff-backup --restore-as-of now \
seth@192.168.3.14::/backupdrive/seth/paint/tux.svg \
~/paint/tux.svg

此命令从备份服务器将最新版本的 tux.svg 恢复到你的客户端计算机上的相同路径。请注意,你无需担心特殊的文件路径来考虑版本;如果你想要最新版本,你只需恢复丢失或已损坏的相同路径,并让 rdiff-backup 将该请求解析为最新版本。

但是 --restore-as-of 选项比这更灵活。也许你需要的文件版本是五天前的

$ rdiff-backup --restore-as-of 5D
seth@192.168.3.14::/backupdrive/seth/paint/tux.svg \
~/paint/tux.svg

还有其他几种恢复文件的方法,它们都列在官方 rdiff-backup 文档中,但在实践中,我发现 --restore-as-of 选项是最常用的。在不太常见的情况下,你知道文件的最后一个好版本的确切日期和时间,并且需要非常具体地从你的备份中提取它,rdiff-backup 也可以为你处理;你只需要获得相当笨拙的 diff 文件名,它与你的备份数据一起存储在备份驱动器上。

例如

$ rdiff-backup 192.168.3.14::/backupdrive/seth/rdiff-backup-data/increments/ \
paint.2016-01-24T06:06:00-07:00.diff.gz $HOME

这将从 1 月 24 日上午 6:06 执行的备份中恢复文件 paint。当然,它不会只将该文件的 diff 数据放入你的主目录,而是完全重建的文件版本。这就是 rdiff-backup 的用途。

备份它

备份很重要,你的旧 Pi 可以提供帮助。今天就设置它,你不会后悔的。

标签
Seth Kenlon
Seth Kenlon 是一位 UNIX 极客、自由文化倡导者、独立多媒体艺术家和 D&D 爱好者。他曾在电影和计算机行业工作,经常同时从事这两个行业。

16 条评论

不错的文章,Seth。我仍然有一两个 Pi 等待着做一些有用的事情。这会是一个很好的方法。

我使用一套我自己多年来创建的基于 rsync 的脚本。我每天创建一个新路径,并使用 link-dest 参数指向最近的前一个备份。然后,我的脚本中的 rsync 命令在今天的备份目录中创建到昨天目录的硬链接。然后,它检查所需的更新,并在今天的目录中添加新文件并修改现有文件,只留下昨天的目录,只为那些已更改的链接文件创建新副本,从而切断与昨天目录的链接。然后,它修改新创建的未链接文件,将以前的版本作为存档保留。我保留 30 天的存档。

你的解决方案看起来也很优雅。

再次,开源的力量通过几乎任何任务可用的许多强大且可定制的替代方案得以展现。

嘿,David,那个脚本可能值得在某个地方公开发布!听起来真不错,我一直对大型不可 diff 数据 blob 的效率感到好奇。听起来你的脚本可能值得尝试。

回复 作者:dboth

很棒的文章,Seth!我一直在绞尽脑汁寻找更好的方法来管理我的备份,这篇文章为我指明了一条新的道路,让我可以去探索!

它让我的家庭网络得到了很好的备份。显然,它没有解决的一个问题是异地备份,但我正在考虑与在美国的家庭成员启动一个“备份交换”计划;我会在我家的 Pi 上驱动他的备份,他会在他家的 Pi 上驱动和托管我的备份。异地,我们各自信任的数据中心。

回复 作者:druthb

好项目,我会尝试 asp..

备份永远不是坏主意,而且让旧 Pi 工作肯定比让它闲置和积灰更好!

回复 作者:Hamdta Paulo (未验证)

这很棒,Seth,谢谢。

备份可以加密吗?

我加密了一些驱动器,但如果备份未加密,那就有点毫无意义了。

当然可以!我认为,最简单的方法是加密卷本身。我使用 LUKS 来实现这一点。我会记下这一点,这会是一个很好的未来文章的主题,但简短的版本是 LUKS 是 Linux 原生的,所以只要你的 Pi 和计算机都配置为挂载和解密驱动器,它们都可以自由地从卷中读取和写入。没问题。由于 rsync 使用 SSH,因此流量本身也是加密的。

当然,任何其他插入驱动器的计算机都无法解密该驱动器,除非你自己提供凭据。

回复 作者:Dave McIntyre (未验证)

只是想知道这是否可以被巧妙地用来自动化来自几个班级的 Raspberry Pi 的备份。我在中学教计算机科学,每天可能有最多 45 名学生使用 Pi,尽管不是同时使用...... 这听起来可行吗?

真的不需要任何巧妙的方法。它绝对可以做到这一点。我的家庭网络有两位用户,分布在四台机器上(显然远不及 45 位用户);每台机器都生成自己的 rdiff-backup 进程,并且通常的数据量不会导致出现瓶颈。我不认为教室里也可能出现交通堵塞,除非你的学生正在创建大量数据。但我可能会做的是,只是使用 git 并教学生备份他们自己的工作!Git 很容易在 Pi 或备用机器上设置。由于 45 名学生需要管理很多用户帐户,我(再次,在较小的环境中;通常每次不超过 10 名学生的班级),只是为每个班级创建了一个 git 仓库,然后让每个学生在班级仓库中创建自己的分支。虽然不完全是预期的设计,但对于简单的学生作业来说,它往往可以正常工作。对于高级班级,我只是让他们 SSH 连接到服务器并自己创建他们的 git 仓库。这一切都是在教室专用的服务器上完成的,显然是在一个私人的班级局域网内。

回复 作者:Bob Irving (未验证)

嗯... 如果你需要文件版本控制,那么也许更容易添加到 rsync 的正确文件系统 - BTRFS?
前段时间我一直在使用 Backuppc,它也使用 rsync,但也有一些重复数据删除选项。

好主意。使用 BTRFS 将是一件很棒的事情,值得在未来进行研究。

回复 作者:asd (未验证)

图片中的 Raspberry Pi 是哪个版本的?我的看起来不一样。

我是最初发帖的人。我们明年有 20 个 RPi,我被提醒我们需要一个解决方案。我查看了 PiNet,它可能很完美,只是我们所有的东西都在 wifi 上运行,而 PiNet 不支持 wifi。所以现在我重新审视这个问题。由于学生将共享 Pi(可能多达 60 名学生使用 20 个 Pi),我也担心学生会互相覆盖彼此的东西。如果 PiNet 支持 wifi 就好了....

Bob,PiNet 实际上并不知道你是否正在使用 wifi(网络上的节点就是网络上的节点),但 PiNet 正在警告你,如果你的 wifi 性能很慢,那么你的系统性能也会很慢。所以,如果你的 wifi 足够好,那么理论上你可以尝试一下。
.
如果不是,那么请记住 Pi 是一个 Linux 系统;它本身就是多用户的。为什么不给每个学生一个唯一的登录名,这样他们就不会互相覆盖彼此的东西?如果没有身份管理,你必须在一个主 SD 卡上创建用户一次,然后为所有其他 Pi 复制该卡(假设无论如何你都必须这样做)。使用这些登录凭据作为你的共享文件备份和版本控制的基础。
.
另外,不要低估孩子们。一个当地组织 Makerbox.org.nz 运营着许多关于 Linux 计算机的课程,学生轮换。老师们使用一个通用的登录名,只是强制要求孩子们将他们的作品保存在一个以他们名字命名的文件夹中(这通常会在每天结束时“备份”,因为老师必须将目录复制到拇指驱动器上,以便她可以检查他们的作品),并且效果很好。没有人删除任何其他人的目录。
.
你可以尝试在 http://linuxquestions.org 上发布你的问题和想法;这是一个支持论坛,所以那里可能有更好的想法。无论如何,我确实想知道“课堂管理”文章是否会在我的未来出现....

回复 作者:Bob Irving (未验证)

© . All rights reserved.