Skip to main content

树莓派自建 NAS 云盘之——数据自动备份 | Linux 中国


把你的树莓派变成数据的安全之所。
在《树莓派自建 NAS 云盘》系列的 第一篇[1] 文章中,我们讨论了建立 NAS 的一些基本步骤,添加了两块 1TB 的存储硬盘驱动(一个用于数据存储,一个用于数据备份),并且通过网络文件系统(NFS)将数据存储盘挂载到远程终端上。本文是此系列的第二篇文章,我们将探讨数据自动备份。数据自动备份保证了数据的安全,为硬件损坏后的数据恢复提供便利以及减少了文件误操作带来的不必要的麻烦。
备份策略
我们就从为小型 NAS 构想一个备份策略着手开始吧。我建议每天有时间节点、有计划的去备份数据,以防止干扰到我们正常的访问 NAS,比如备份时间点避开正在访问 NAS 并写入文件的时间点。举个例子,你可以每天凌晨 2 点去进行数据备份。
另外,你还得决定每天的备份需要被保留的时间长短,因为如果没有时间限制,存储空间很快就会被用完。一般每天的备份保留一周便可以,如果数据出了问题,你便可以很方便的从备份中恢复出来原数据。但是如果需要恢复数据到更久之前怎么办?可以将每周一的备份文件保留一个月、每个月的备份保留更长时间。让我们把每月的备份保留一年时间,每一年的备份保留更长时间、例如五年。
这样,五年内在备份盘上产生大量备份:
◈ 每周 7 个日备份
◈ 每月 4 个周备份
◈ 每年 12 个月备份
◈ 每五年 5 个年备份
你应该还记得,我们搭建的备份盘和数据盘大小相同(每个 1 TB)。如何将不止 10 个 1TB 数据的备份从数据盘存放到只有 1TB 大小的备份盘呢?如果你创建的是完整备份,这显然不可能。因此,你需要创建增量备份,它是每一份备份都基于上一份备份数据而创建的。增量备份方式不会每隔一天就成倍的去占用存储空间,它每天只会增加一点占用空间。
以下是我的情况:我的 NAS 自 2016 年 8 月开始运行,备份盘上有 20 个备份。目前,我在数据盘上存储了 406GB 的文件。我的备份盘用了 726GB。当然,备份盘空间使用率在很大程度上取决于数据的更改频率,但正如你所看到的,增量备份不会占用 20 个完整备份所需的空间。然而,随着时间的推移,1TB 空间也可能不足以进行备份。一旦数据增长接近 1TB 限制(或任何备份盘容量),应该选择更大的备份盘空间并将数据移动转移过去。
利用 rsync 进行数据备份
利用 rsync 命令行工具可以生成完整备份。
  1. pi@raspberrypi:~ $ rsync -a /nas/data/ /nas/backup/2018-08-01
这段命令将挂载在 /nas/data/ 目录下的数据盘中的数据进行了完整的复制备份。备份文件保存在 /nas/backup/2018-08-01 目录下。-a 参数是以归档模式进行备份,这将会备份所有的元数据,例如文件的修改日期、权限、拥有者以及软连接文件。
现在,你已经在 8 月 1 日创建了完整的初始备份,你将在 8 月 2 日创建第一个增量备份。
  1. pi@raspberrypi:~ $ rsync -a --link-dest /nas/backup/2018-08-01/ /nas/data/ /nas/backup/2018-08-02
上面这行代码又创建了一个关于 /nas/data 目录中数据的备份。备份路径是 /nas/backup/2018-08-02。这里的参数 --link-dest 指定了一个备份文件所在的路径。这样,这次备份会与 /nas/backup/2018-08-01 的备份进行比对,只备份已经修改过的文件,未做修改的文件将不会被复制,而是创建一个到上一个备份文件中它们的硬链接。
使用备份文件中的硬链接文件时,你一般不会注意到硬链接和初始拷贝之间的差别。它们表现的完全一样,如果删除其中一个硬链接或者文件,其他的依旧存在。你可以把它们看做是同一个文件的两个不同入口。下面就是一个例子:
左侧框是在进行了第二次备份后的原数据状态。中间的方块是昨天的备份。昨天的备份中只有图片 file1.jpg 并没有 file2.txt 。右侧的框反映了今天的增量备份。增量备份命令创建昨天不存在的 file2.txt。由于 file1.jpg 自昨天以来没有被修改,所以今天创建了一个硬链接,它不会额外占用磁盘上的空间。
自动化备份
你肯定也不想每天凌晨去输入命令进行数据备份吧。你可以创建一个任务定时去调用下面的脚本让它自动化备份。
  1. #!/bin/bash

  2. TODAY=$(date +%Y-%m-%d)
  3. DATADIR=/nas/data/
  4. BACKUPDIR=/nas/backup/
  5. SCRIPTDIR=/nas/data/backup_scripts
  6. LASTDAYPATH=${BACKUPDIR}/$(ls ${BACKUPDIR} | tail -n 1)
  7. TODAYPATH=${BACKUPDIR}/${TODAY}
  8. if [[ ! -e ${TODAYPATH} ]]; then
  9.        mkdir -p ${TODAYPATH}
  10. fi

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

  12. ${SCRIPTDIR}/deleteOldBackups.sh
第一段代码指定了数据路径、备份路径、脚本路径以及昨天和今天的备份路径。第二段代码调用 rsync 命令。最后一段代码执行 deleteOldBackups.sh 脚本,它会清除一些过期的没有必要的备份数据。如果不想频繁的调用 deleteOldBackups.sh,你也可以手动去执行它。
下面是今天讨论的备份策略的一个简单完整的示例脚本。
  1. #!/bin/bash
  2. BACKUPDIR=/nas/backup/

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

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

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

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

  23. function getAllBackups() {
  24.        listYearlyBackups
  25.        listMonthlyBackups
  26.        listWeeklyBackups
  27.        listDailyBackups
  28. }

  29. function listUniqueBackups() {
  30.        getAllBackups | sort -u
  31. }

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

  35. cd ${BACKUPDIR}
  36. listBackupsToDelete | while read file_to_delete; do
  37.        rm -rf ${file_to_delete}
  38. done
这段脚本会首先根据你的备份策略列出所有需要保存的备份文件,然后它会删除那些再也不需要了的备份目录。
下面创建一个定时任务去执行上面这段代码。以 root 用户权限打开 crontab -e,输入以下这段命令,它将会创建一个每天凌晨 2 点去执行 /nas/data/backup_scripts/daily.sh的定时任务。
  1. 0 2 * * * /nas/data/backup_scripts/daily.sh
有关创建定时任务请参考 cron 创建定时任务[2]
◈ 当没有备份任务时,卸载你的备份盘或者将它挂载为只读盘;
◈ 利用远程服务器作为你的备份盘,这样就可以通过互联网同步数据
你也可用下面的方法来加强你的备份策略,以防止备份数据的误删除或者被破坏:
本文中备份策略示例是备份一些我觉得有价值的数据,你也可以根据个人需求去修改这些策略。
我将会在 《树莓派自建 NAS 云盘》 系列的第三篇文章中讨论 Nextcloud[3]。Nextcloud 提供了更方便的方式去访问 NAS 云盘上的数据并且它还提供了离线操作,你还可以在客户端中同步你的数据。

Comments

Popular posts from this blog

OWASP Top 10 Threats and Mitigations Exam - Single Select

Last updated 4 Aug 11 Course Title: OWASP Top 10 Threats and Mitigation Exam Questions - Single Select 1) Which of the following consequences is most likely to occur due to an injection attack? Spoofing Cross-site request forgery Denial of service   Correct Insecure direct object references 2) Your application is created using a language that does not support a clear distinction between code and data. Which vulnerability is most likely to occur in your application? Injection   Correct Insecure direct object references Failure to restrict URL access Insufficient transport layer protection 3) Which of the following scenarios is most likely to cause an injection attack? Unvalidated input is embedded in an instruction stream.   Correct Unvalidated input can be distinguished from valid instructions. A Web application does not validate a client’s access to a resource. A Web action performs an operation on behalf of the user without checking a shared sec

CKA Simulator Kubernetes 1.22

  https://killer.sh Pre Setup Once you've gained access to your terminal it might be wise to spend ~1 minute to setup your environment. You could set these: alias k = kubectl                         # will already be pre-configured export do = "--dry-run=client -o yaml"     # k get pod x $do export now = "--force --grace-period 0"   # k delete pod x $now Vim To make vim use 2 spaces for a tab edit ~/.vimrc to contain: set tabstop=2 set expandtab set shiftwidth=2 More setup suggestions are in the tips section .     Question 1 | Contexts Task weight: 1%   You have access to multiple clusters from your main terminal through kubectl contexts. Write all those context names into /opt/course/1/contexts . Next write a command to display the current context into /opt/course/1/context_default_kubectl.sh , the command should use kubectl . Finally write a second command doing the same thing into /opt/course/1/context_default_no_kubectl.sh , but without the use of k

标 题: 关于Daniel Guo 律师

发信人: q123452017 (水天一色), 信区: I140 标  题: 关于Daniel Guo 律师 关键字: Daniel Guo 发信站: BBS 未名空间站 (Thu Apr 26 02:11:35 2018, 美东) 这些是lz根据亲身经历在 Immigration版上发的帖以及一些关于Daniel Guo 律师的回 帖,希望大家不要被一些马甲帖广告帖所骗,慎重考虑选择律师。 WG 和Guo两家律师对比 1. fully refund的合约上的区别 wegreened家是case不过只要第二次没有file就可以fully refund。郭家是要两次case 没过才给refund,而且只要第二次pl draft好律师就可以不退任何律师费。 2. 回信速度 wegreened家一般24小时内回信。郭律师是在可以快速回复的时候才回复很快,对于需 要时间回复或者是不愿意给出确切答复的时候就回复的比较慢。 比如:lz问过郭律师他们律所在nsc区域最近eb1a的通过率,大家也知道nsc现在杀手如 云,但是郭律师过了两天只回复说让秘书update最近的case然后去网页上查,但是上面 并没有写明tsc还是nsc。 lz还问过郭律师关于准备ps (他要求的文件)的一些问题,模版上有的东西不是很清 楚,但是他一般就是把模版上的东西再copy一遍发过来。 3. 材料区别 (推荐信) 因为我只收到郭律师写的推荐信,所以可以比下两家推荐信 wegreened家推荐信写的比较长,而且每封推荐信会用不同的语气和风格,会包含lz写 的research summary里面的某个方面 郭家四封推荐信都是一个格式,一种语气,连地址,信的称呼都是一样的,怎么看四封 推荐信都是同一个人写出来的。套路基本都是第一段目的,第二段介绍推荐人,第三段 某篇或几篇文章的abstract,最后结论 4. 前期材料准备 wegreened家要按照他们的模版准备一个十几页的research summary。 郭律师在签约之前说的是只需要准备五页左右的summary,但是在lz签完约收到推荐信 ,郭律师又发来一个很长的ps要lz自己填,而且和pl的格式基本差不多。 总结下来,申请自己上心最重要。但是如果选律师,lz更倾向于wegreened,