之前的文章介绍了我的乞丐版NAS及配置,是放在家里的单个NAS。虽然做了SnapRAID,坏一块盘也没关系,然而假如由于某种原因这个NAS里的盘全坏了,数据就没了。
数据备份有个3-2-1原则:
- 3份数据
- 2种存储介质
- 1个异地备份
过年回老家之后,由于新冠病毒(2019-nCOV)一直呆在老家,正好可以折腾一下异地的NAS备份,这样我也有自己的2-1-1的备份了:
- 2份数据
- 1种存储介质
- 1个异地备份
对于家用来说,已经足够安全了。
这时记录一下我的异地NAS备份的配置。
硬件
- 跟之前一样,还是蜗牛星际A款单口千兆,350包邮(2020.02价格,比之前涨了100!)
- 西数紫盘 4T*1 (目前的容量,一块就够了,以后有需要就再添加)
软件
对于放在老家的NAS,出于成本考虑,就不做RAID了;而目前只用一块硬盘,为了方便以后扩展,LVS是最方便的。
既然是异地备份,一开始想的是用rsync就好了。
不过后来想想,当人在老家的时候,可以直接备份数据在老家的NAS上;并且老爸老妈他们手机里的数据也可以直接备份在本地,所以我需要的是一个双向的同步工具。用两条rsync命令当然也可以,不过应该会有更合适的工具。
综合上面的需要,最后决定用的是:
- Ubuntu (目前装的是19.10)
- LVS方便未来扩展空间
- wireguard用来连接两台NAS
- unison用来双向同步
- 其它工具和原来的NAS相同(比如hdparm, smartmontools等)
LVS
以前不太用LVS,觉得麻烦,后来在公司的某台服务器上配置了LVS之后,觉得用起来很爽,现在在这台异地NAS上正好可以用起来。
把这块4T的硬盘分成两个LV(Logical Volume),一个用来放不用长期保存的(如下载的视频之类)文件,另一个用来作为我的NAS的异地备份,都用ext4文件系统。
# 假设用fdisk或者parted工具创建了一个/dev/sdb1,包含/dev/sdb的整个空间 pvcreate /dev/sdb1 # 创建physical volume vgcreate nas_data_vg /dev/sdb1 # 创建名为nas_data_vg的virtual group lvcreate -n nas_download -L 800G nas_data_vg # 创建一个800G大小的LV lvcreate -n nas_data nas_data_vg -l 100%FREE # 创建一个包含剩余所有空间的LV # 格式化 mkfs.ext4 /dev/nas_data_vg/nas_download mkfs.ext4 /dev/nas_data_vg/nas_data # 查看blkid blkid /dev/nas_data_vg/nas_data blkid /dev/nas_data_vg/nas_download # 编辑/etc/fstab自动挂载 # cat /etc/fstab UUID=<blk-id-of-nas_data> /mnt/storage ext4 defaults 0 0 UUID=<blk-id-of-nas_download> /mnt/downloads ext4 defaults 0 0
Wireguard
之前写过一篇文章讲怎么配置Wireguard server和怎么在手机上用Wireguard,在Ubuntu里配置一个client也是超级简单的事情。然后用systemd让它开机自动启动就好了,这样这个异地的NAS开机完,就自动连着我原来的NAS。
sudo apt install wireguard # cat /etc/wireguard/wg0.conf [Interface] Address = <Self IP in the VPN>/24 PrivateKey = <private-key> [Peer] PublicKey = <public-key-on-wireguard-server> # AllowedIPs = 0.0.0.0/0 # 如果想让NAS的默认网关走远程的网络 AllowedIPs = 192.168.2.0/24 # 如果只想在WireGuard的网段互相访问 Endpoint = <wireguard-server>:<port> sudo systemctl enable [email protected] # Enable这个service systemctl start [email protected] #开始这个service
unison
搜索了一下双向同步的工具,有一些开源的,根据https://askubuntu.com/questions/727304/automatically-do-a-two-way-sync-of-two-directories 这里面的推荐,我最后选择了用unison,看上去比较清晰简单。
安装很简单,Ubuntu官方源里有就有,直接apt就装好了。
sudo apt install unison
unison的基础用法很简单,unison root1 root2
就把root1和root2同步了,先按官网的教程里,把玩一下a.tmp
和b.tmp
,然后就可以写自己的脚本了。
$ cat ~/bin/sync_between_nas.sh #!/bin/bash if [ $# -ne 1 ]; then echo "Usage:" echo "$0 <dir>" echo "" echo "Two-way sync <dir> between my NAS in /mnt/storage" exit 1 fi dir_to_sync=$1 src=ssh://$user@$nas//mnt/storage/$1 dst=/mnt/storage/$1 if ssh $user@$nas "[ ! -d $dst ]"; then echo $dst does not exist! exit 1 fi echo To sync from \"$src\" to \"$dst\"... sudo unison $src $dst -batch -owner -group -prefer newer -times -nodeletion $src -nodeletion $dst
这个脚本会同步两个NAS的/mnt/storage/
目录,主要功能在最后一行:
- -batch: 表示不需要用户的输入(否则它会问用户使用哪种action)
- -owner, -group: 保留原有的owner:group。注意:
- 这里两个NAS都需要创建同样的owner、group
- 因为文件传输之后需要chown,所以这个脚本要以su用户来执行(不知道有没有更好的方式)
- -prefer newer:如果有冲突,总是以更新的文件为准
- -times:同步文件的修改时间
- -nodeletion $src -nodeletion $dst: 对$src和$dst都不进行删除,以防有文件被误删,并被同步到另一个NAS
然后,有一个辅助脚本来指定要备份的目录,并调用上面这个脚本。
#!/bin/bash set -e dirs_to_sync="<dir1> <dir2> ..." for d in $dirs_to_sync; do echo $d /home/mine/bin/sync_between_nas.sh $d done
最后,配置一个cron job,就可以愉快地每天同步数据啦。记得让cron发邮件,以便检查同步的状态。
$ sudo crontab -l MAILTO="<my-email-address>" 10 2 * * * /usr/bin/flock /tmp/sync_my_nas.lock /path/to/sync_my_nas_dirs.sh
后记
后来有朋友推荐了Syncthing,看上去有点像BTSync之类的,以后也许可以试试。