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

备份策略
让我们首先为我们的小型 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
并检查与该文件夹的内容相比,哪些数据文件发生了更改。 未更改的文件不会被复制,而是硬链接到昨天备份文件夹中的对应文件。
从备份中使用硬链接文件时,您不会注意到初始副本和链接之间的任何差异。 它们的行为完全相同,如果您删除链接或初始文件,另一个文件仍然存在。 您可以将它们想象为指向同一文件的两个相同的入口点。 这是一个例子

左侧的框反映了第二次备份后不久的状态。 中间的框是昨天的副本。 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 系统上存储和访问数据的便捷方式,它还提供离线访问,因为它会将您的数据同步到客户端设备。
10 条评论