今天因为用badblocks
去检查硬盘坏道的时候莫名的加了-w选项。导致整个data分区都跪了。本来在装系统的时候把/data 单独分到一块硬盘上就是为了保护数据看,想着以后重装系统的时候只需要重新mount一下就好了。没想到今天发生了这样的事…然后更惨的是发现自己并没有对/data进行备份,因为也好久没用了,欲哭无泪。
于是痛定思痛,决定利用起家里的NAS来进行定期自动的备份(是个QNAP TS-288, Linux系统, 所以其实硬盘+Rasperry PI 这种都可以实现相同的效果)
环境
我的笔记本在network中是bucketzxm-pc
, NAS 可以叫做qnap
。
因为rsync需要ssh登录,所以我们需要配置一下ssh,让它能自动的进行任务。
配置sshkey
首先在qnap
上配置好ssh key.(就是把bucketzxm-pc
的/.ssh/ssh_key.pub 复制到 /.ssh/authorized_keys 中, 具体的可以查一下如何用sshkey进行auth登录)qnap
上
备份
选择文件夹
本文中以备份bucketzxm-pc
(我的笔记本)上的/data/
和/home/bucketzxm
来举例。 因为我所有的数据都是在/data上,home中可能有一些Download和config文件。因为NAS还够大,所以多备份一些也没关系。
rsync
这里qnap
的IP地址是192.168.1.102, 在尝试的时候需要换成自己家中备份设备的地址。 可以通过 ssh IP-address
来测试是否能连接并成功登录
rsync 的命令很简单,需要注意的是--delete
. 如果不用--delete
,那如果本地文件删除了,在rsync的时候是不会删除原本备份的文件的。
例如在今天bucketzxm-pc
上/data/testfolder 备份到 qnap
上/backup/testfolder。 明天我删除了bucketzxm-pc
/data/testfolder, 此时如果rsync,那么qnap
上/backup/testfolder是不会被删除的。
相反,如果使用了--delete
参数,那么当笔记本上的文件被删除后,对应的备份中的文件也会被删除(此时相当于同步了)
-r
和 -d
都是为了对文件夹做操作,表示recursive.
1 | rsync -av -r -d --delete /data 192.168.1.102:/backup/daily/ |
1 | rsync –av -r -d --delete /home/bucketzxm 192.168.1.102:/backup/daily/ |
这样之后在qnap
上就会有两个文件夹 /backup/daily/data
和/backup/daily/bucketzxm
. 也就成功的备份了。
crontab
光是靠人来每天rsync不太靠谱,所以我们就可以用crontab加个定时任务。
在qnap
上我创建了了三个文件夹,分别是daily
,weekly
和monthly
, 对应着每天的备份,每周的备份和每月的备份。基本的策略是每天凌晨2点进行rsync从bucketzxm-pc
到qnap
。 每周一次在qnap
上从daily文件夹sync到weekly文件夹。最后每月的第一天,会把daily文件夹下所有东西用tar
打包,放到monthly下。
在笔记本上
首先在bucketzxm-pc
上设置每日的rsync任务。
contab -e
打开编辑,加入以下两行
1 | 0 2 * * * rsync -av -r -d --delete /data 192.168.1.102:/backup/daily/ |
1 | 0 2 * * * rsync –av -r -d --delete /home/bucketzxm 192.168.1.102:/backup/daily/ |
这两行是告诉crontab, 每天凌晨2点的时候,把/data/ 和 /home/bucketzxm 备份到 qnap
的/backup/daily下。 采用的是增量式的同步,并且文件保持和笔记本上的是一样的(会删除对应的文件)
在备份服务器上
同样是使用crontab -e 打开crontab 的配置, 加入以下两行并保存退出
1 | 0 18 * * 5 rsync -av --delete /backup/daily /backup/weekly |
每周五的18点把/backup/daily下的所有内容备份到/backup/weekly下。
1 | 0 6 1 * * tar cvjf /backup/monthly/monthly_$(date +%Y%m%d).tar.bz2 /backup/daily/ |
每个月1号早上6点, 把/backup/daily下的文件打包成压缩包,并以日期命名存放到/backup/montyly下
例如monthly_20181006.tar.bz2
crontab 语法说明

希望不要再掉数据了!
年龄越大越明白了备份和离线的重要性,还记得高中的时候随便乱装Linux随便玩分区,就曾经把自己和别人重要的文件都删除了….惨剧…定期的备份重要性是不言而喻的。现在一些不涉及私密的文档会习惯放在dropbox上,一般的代码都会保存在gitlab或者github上。 其他私密或者重要的东西只能靠自己做离线的备份了。包括现在网上很多内容都会消失,所以现在我看到需要的东西都会先保存进Note或者下载下来。 希望大家配置好今天的rsync之后能够减少掉数据的概率!