在树莓派 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 可以成为 rapsberry pi 的一个不错的(但目前更昂贵的)替代品 - 是什么让它更适合您的 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 解决方案效果最好,因为跨砖块的本机复制和即时故障转移更容易维护。 我的 GlusterFS NAS 解决方案构建在一对带有 2TB 外置供电硬盘的 Raspberry Pi 上。 我强烈建议您探索此选项作为 Nextcloud 的后端存储解决方案。

你好 Salvatore,

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

此致,
Manuel

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

Creative Commons License本作品采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。
© . All rights reserved.