在 Raspberry Pi NAS 上自动备份

将你的 Raspberry Pi 变成你数据的安全港湾。
325 位读者喜欢这个。
Getting started with SQL

Opensource.com

在使用 Raspberry Pi 进行网络附加存储 (NAS) 的三部分系列第一部分中,我们介绍了 NAS 设置的基础知识,连接了两个 1TB 硬盘驱动器(一个用于数据,一个用于备份),并通过网络文件系统 (NFS) 将数据驱动器挂载到远程设备上。在第二部分中,我们将着眼于自动备份。自动备份使您能够持续保护您的数据,并从硬件缺陷或意外文件删除中恢复。

Raspberry Pi NAS infrastructure

备份策略

让我们首先为我们的小型 NAS 制定一个备份策略。我建议创建数据的每日备份,并将其安排在不会干扰其他 NAS 活动的时间,包括您需要访问或存储文件的时间。例如,您可以每天凌晨 2 点触发备份活动。

您还需要决定每个备份保留多长时间,因为如果您无限期地保留每个每日备份,您很快就会耗尽存储空间。将每日备份保留一周可以让您在意识到过去七天内出现问题时回溯到最近的历史记录。但是,如果您需要更早以前的东西怎么办?将每周一的备份保留一个月,并将每月备份保留更长时间就足够了。让我们将每月备份保留一年,并将每年备份保留一个以进行长期的时光旅行,例如,过去五年。

这将在五年期间在您的备份驱动器上产生大量备份

  • 7 个每日备份
  • 4 个(大约)每周备份
  • 12 个每月备份
  • 5 个年度备份

您可能还记得,您的备份驱动器和数据驱动器大小相等(均为 1TB)。来自数据驱动器的 1TB 的 10 多个备份如何装入 1TB 的备份磁盘?如果您创建完整备份,则无法装入。相反,您将创建增量备份,如果数据没有更改,则重用上次备份中的数据,并创建新的或已更改文件的副本。这样,备份不会每晚翻倍,而只会稍微增长,具体取决于您数据一天内发生的更改。

这是我的情况:我的 NAS 自 2016 年 8 月以来一直在运行,备份驱动器上有 20 个备份。目前,我在数据驱动器上存储了 406GB 的文件。备份在我的备份驱动器上占用了 726GB。当然,这在很大程度上取决于您数据的更改频率,但正如您所看到的,增量备份不会像 20 个完整备份那样占用太多空间。然而,随着时间的推移,1TB 磁盘可能不足以满足您的备份需求。一旦您的数据增长接近 1TB 限制(或任何备份驱动器容量),您应该选择更大的备份驱动器并将您的数据移至那里。

使用 rsync 创建备份

要创建完整备份,您可以使用 rsync 命令行工具。这是一个创建初始完整备份的示例命令。

pi@raspberrypi:~ $ rsync -a /nas/data/ /nas/backup/2018-08-01

此命令在备份驱动器上创建数据驱动器上存储的所有数据的完整副本,该数据驱动器挂载在 /nas/data 上。在那里,它将创建文件夹 2018-08-01 并在其中创建备份。-a 标志以存档模式启动 rsync,这意味着它保留所有类型的元数据,例如修改日期、权限和所有者,并将软链接复制为软链接。

现在您已经创建了截至 8 月 1 日的完整初始备份,在 8 月 2 日,您将创建您的第一个每日增量备份。

pi@raspberrypi:~ $ rsync -a --link-dest /nas/backup/2018-08-01/ /nas/data/ /nas/backup/2018-08-02

此命令告诉 rsync 再次创建 /nas/data 的备份。这次的目标目录是 /nas/backup/2018-08-02。该脚本还指定了 --link-dest 选项,并将上次备份的位置作为参数传递。指定此选项后,rsync 会查看文件夹 /nas/backup/2018-08-01 并检查与该文件夹内容相比,哪些数据文件发生了更改。未更改的文件将不会被复制,而是将被硬链接到昨天备份文件夹中的对应文件。

当使用来自备份的硬链接文件时,您不会注意到初始副本和链接之间有任何差异。它们的行为完全相同,如果您删除链接或初始文件中的任何一个,另一个仍然存在。您可以将它们想象为同一文件的两个相等入口点。这是一个例子

NAS backup flow

左侧的框反映了第二次备份后不久的状态。中间的框是昨天的副本。file2.txt 昨天不存在,但图像 file1.jpg 存在并已复制到备份驱动器。右侧的框反映了今天的增量备份。增量备份命令创建了 file2.txt,它昨天不存在。由于 file1.jpg 自昨天以来没有更改,因此今天创建了一个硬链接,因此它不会占用磁盘上太多的额外空间。

自动化您的备份

您可能不想每天凌晨 2 点手动执行每日备份命令。相反,您可以使用如下脚本自动化您的备份,您可能希望使用 cron 作业启动该脚本。

#!/bin/bash

TODAY=$(date +%Y-%m-%d)
DATADIR=/nas/data/
BACKUPDIR=/nas/backup/
SCRIPTDIR=/nas/data/backup_scripts
LASTDAYPATH=${BACKUPDIR}/$(ls ${BACKUPDIR} | tail -n 1)
TODAYPATH=${BACKUPDIR}/${TODAY}
if [[ ! -e ${TODAYPATH} ]]; then
	mkdir -p ${TODAYPATH}
fi

rsync -a --link-dest ${LASTDAYPATH} ${DATADIR} ${TODAYPATH} $@

${SCRIPTDIR}/deleteOldBackups.sh

第一个代码块计算上次备份的文件夹名称,用于链接和今天的备份文件夹名称。第二个代码块包含 rsync 命令(如上所述)。最后一个代码块执行 deleteOldBackups.sh 脚本。它将根据上面概述的备份策略清理旧的、不必要的备份。如果您希望清理脚本的运行频率较低,您也可以独立于备份脚本执行清理脚本。

以下脚本是本文中备份策略的示例实现。

#!/bin/bash
BACKUPDIR=/nas/backup/

function listYearlyBackups() {
	for i in 0 1 2 3 4 5
		do ls ${BACKUPDIR} | egrep "$(date +%Y -d "${i} year ago")-[0-9]{2}-[0-9]{2}" | sort -u | head -n 1
	done
}

function listMonthlyBackups() {
	for i in 0 1 2 3 4 5 6 7 8 9 10 11 12
		do ls ${BACKUPDIR} | egrep "$(date +%Y-%m -d "${i} month ago")-[0-9]{2}" | sort -u | head -n 1
	done
}

function listWeeklyBackups() {
	for i in 0 1 2 3 4
		do ls ${BACKUPDIR} | grep "$(date +%Y-%m-%d -d "last monday -${i} weeks")"
	done
}

function listDailyBackups() {
	for i in 0 1 2 3 4 5 6
		do ls ${BACKUPDIR} | grep "$(date +%Y-%m-%d -d "-${i} day")"
	done
}

function getAllBackups() {
	listYearlyBackups
	listMonthlyBackups
	listWeeklyBackups
	listDailyBackups
}

function listUniqueBackups() {
	getAllBackups | sort -u
}

function listBackupsToDelete() {
	ls ${BACKUPDIR} | grep -v -e "$(echo -n $(listUniqueBackups) |sed "s/ /\\\|/g")"
}

cd ${BACKUPDIR}
listBackupsToDelete | while read file_to_delete; do
	rm -rf ${file_to_delete}
done

此脚本将首先列出要保留的所有备份(根据我们的备份策略),然后它将删除所有不再必要的备份文件夹。

要每晚执行脚本以创建每日备份,请以 root 用户身份运行 crontab -e 来安排备份脚本。(您需要以 root 身份登录,以确保它有权读取数据驱动器上的所有文件,无论它们是谁创建的。)添加如下所示的一行,该行在每天晚上凌晨 2 点启动脚本。

0 2 * * * /nas/data/backup_scripts/daily.sh

有关更多信息,请阅读关于 使用 cron 调度任务

您可以采取其他措施来加强备份,以防止意外删除或损坏,包括以下内容

  • 在没有备份运行时,卸载您的备份驱动器或将其挂载为只读
  • 将备份驱动器连接到远程服务器,并通过互联网同步文件

此示例备份策略使您能够备份您的宝贵数据,以确保数据不会丢失。您还可以轻松地根据您的个人需求和偏好调整此技术。

在本系列的第三部分中,我们将讨论 Nextcloud,这是一种在 NAS 系统上存储和访问数据的便捷方式,它还提供离线访问,因为它将您的数据同步到客户端设备。

User profile image.
Manuel 于 2013 年在德国海德堡完成了应用计算机科学专业的学习,并获得了硕士学位,此后不久开始担任软件开发人员。他对使用和结合各种技术来构建新的酷炫事物感兴趣,并努力使生活(包括他自己的生活)更轻松。

10 条评论

或者您可以安装 rsnapshot,它可以为您完成所有这些工作。只需编辑 /etc/rsnapshot.conf 并通过 crontab 调用它

14 02 * * * /bin/rsnapshot daily;
30 03 * * Sun /bin/rsnapshot weekly
14 04 * 1 * /bin/rsnapshot monthly

嗨 Mike,

我不知道这个项目,谢谢你指出它!
据我所知,它不在 Raspbian Stretch 的默认 apt 存储库中,所以我认为安装它需要一些设置步骤,但这绝对值得一试!

此致,
Manuel

回复 作者:Mike Evans (未验证)

嗨 Tim,

我不太清楚更换 raspberry pi 如何有助于创建它的备份。 ;)
无论如何,我认为 RockPro64 可以成为 rapsberry pi 的一个很好的(但目前更昂贵的)替代品 - 是什么让它更适合您的 NAS?

此致,
Manuel

回复 作者:Tim (未验证)

根本不是一个有用的备份解决方案。根据我的经验,raspberry Pi 根本不可靠。它经常崩溃。然后需要恢复闪存盘。
我会做相反的事情:将 raspberry Pi 闪存的全部内容备份到可靠的主计算机或服务器上。这可能吗?

嗨 Igor,

感谢您的评论。根据我的经验,raspberry pi 崩溃通常是电源太小或连接到 USB 端口的设备太多的迹象。raspberry pi 3 至少尝试使用 3A 电源,并确保使用外部供电的硬盘驱动器。此外,您可以使用 dd 对整个 SD 卡进行自动备份,并将它们放在 USB 磁盘上,并且在 SD 卡的文件系统损坏的情况下,您可以从那里恢复它。或者使用与本文中的脚本类似的脚本来远程创建备份。

此致,
Manuel

回复 作者:igor (未验证)

谢谢。

只是想确认一下。第一个脚本名为 daily.sh,第二个脚本名为 deleteOldBackups.sh?所以第一个脚本调用了第二个脚本。

我计划将服务器备份到我的 NAS。我想你的脚本可以工作,我只需要更改目录路径并使用 ssh 登录到服务器?

嗨 jag101,

感谢您的评论。是的,这就是我使用脚本的方式,当然您应该能够根据您的用例调整它们。要远程进行备份,您可以使用 rsync 通过 ssh 进行备份,或者按照上面链接的第一部分所述通过 NFS 挂载 NAS。

此致,
Manuel

回复 作者:jag101 (未验证)

这对于对 Nextcloud 和 Nextcloud 的存储选项感兴趣,并考虑备份的人们非常有帮助。我在 Owncloud 上经历了同样的演变,经过多次测试,我最终选择了 GlusterFS 后端。

我认为构建基于 GlusterFS 的 NAS 解决方案效果最佳,因为跨 brick 的本机复制和即时故障转移更易于维护。我的 GlusterFS NAS 解决方案构建在一对 Raspberry PI 上,并连接了 2TB 外部供电驱动器。我强烈建议探索此选项作为 Nextcloud 的后端存储解决方案。

嗨 Salvatore,

感谢您的评论。glusterfs 解决方案听起来很有趣,特别是当您有两个端点并希望负载均衡 Nextcloud 客户端通常发送的许多请求时。这两个 raspberry pis 是否足够强大来管理 glusterfs,或者您在将文件同步到 owncloud 客户端时是否注意到延迟?

此致,
Manuel

回复 作者:Salvatore Ragusano (未验证)

Creative Commons License本作品已根据 Creative Commons Attribution-Share Alike 4.0 International License 获得许可。
© . All rights reserved.