在树莓派 NAS 上自动化备份

将您的树莓派变成您数据的安全港湾。
325 位读者喜欢这篇文章。
Getting started with SQL

Opensource.com

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

Raspberry Pi NAS infrastructure

备份策略

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

您还需要决定每个备份的保留时间,因为如果无限期地保留每个每日备份,您将很快耗尽存储空间。将每日备份保留一周,如果您意识到过去七天内发生了错误,您可以回溯到最近的历史记录。但是,如果您需要更久远的历史记录中的内容怎么办?将每周一的备份保留一个月,并将每月备份保留更长时间应该就足够了。让我们将每月备份保留一年,并将每年备份保留一份,用于更长时间段的时间旅行,例如,过去五年。

这会在您的备份驱动器上生成五年期间的一系列备份

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

您可能还记得,您的备份驱动器和数据驱动器大小相同(均为 1TB)。来自数据驱动器的超过 10 个 1TB 备份如何装入 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,

我不完全知道替换树莓派如何帮助创建它的备份。 ;)
无论如何,我认为 RockPro64 可以成为树莓派的一个很好的(但目前更昂贵的)替代品 - 是什么让它更适合您的 NAS?

此致,
Manuel

回复 ,作者:Tim (未验证)

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

嗨 Igor,

感谢您的评论。 以我的经验,树莓派崩溃通常是电源供应器太小或连接到 USB 端口的设备太多的迹象。 树莓派 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 解决方案构建在一对树莓派上,并连接了 2TB 外接电源驱动器。 我强烈建议探索此选项作为 Nextcloud 的后端存储解决方案。

嗨 Salvatore,

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

此致,
Manuel

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

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