同人音声颇有意思,最近已经到了不听就无法入睡的地步。虽说如此,最近主要听的也只有耳搔耳舐,起初也有听过一些R18的,但感觉并不是很有趣。然而,有了这种兴趣,就免不了收一些合集什么的,一阵搜刮,硬盘空间又少了百来G。

有了这些东西,自然是得找个地方安置,我的意思是,万一出现什么问题,硬盘挂了格了,数据丢了怪可惜,得备份。

说到备份,最先想到的就是各种云存储。说到云存储,记得有段时间国内各家云存储各种撕逼,空间奖励一个比一个豪爽,差点就让人产生了这些东西可以代替仓库盘的错觉,然而好景不长,净网的搅屎棍让这些美好的泡沫提前破灭,尽管知道它们一开始也没打算让用户给自己的数据作主,不过看到这些我才可以放心。总之国内服务不可考虑,那么再看国外,国外云存储的免费额度往往较小,而付费方案相对较高,而且面临出口带宽和众所周知的各种不确定因素,总的来说,也难以考虑。

果然,云存储什么的还是没本地存储简单可靠,嗯,还是买块硬盘吧。不过,我这么健忘和怕麻烦,不一定记得和愿意每隔一段时间手动备份。但这也不是什么难事,交给机器就好了,我知道现在有不少这样的软件,只要文件有一点变化,它们跑的比谁都快,GoodSync就是个中翘楚。正好前不久在张大妈上看到的Newifi Y1路由器能够派上用场了,刷上OpenWrt,安装开启samba,就可以作为GoodSync的服务端了。不过GoodSync毕竟是付费商业软件,并且只支持Windows与OSX,现在我在Linux上又得砍掉重练。起初试了试ownCloud,感觉这货在各个平台上的客户端都很弱鸡,而且由于服务端是php,效率大打折扣,对运行环境和机器硬件的要求严苛,硬件本来很弱加上一些php模块也缺少现成编译版的路由器更是不堪重负,这样的程序就算是运行在VPS上,配置与资源也不能差。虽然ownCloud号称多平台兼容,但限于这个不合适的环境,最终的使用体验并不理想,只得放弃这个方案。

后来在不断Google更换关键词的过程中看到一些文章,得知还可以靠rsync+inotify-tools这个方案实现。Linux下,两个开源软件,安装简单,配置过程也谈不上复杂,我觉得很合适。

那么,到这里就简要的记录一下配置的过程。

一、配置服务端

服务端上只需要rsync,inotify是用于客户端,监控文件变化触发rsync同步动作。不同的发行版安装配置有微小的差异,这里是OpenWrt。

1.安装rsync

opkg update

opkg install rsync rsyncd

不知道为啥,rsync在OpenWrt下分成了两个包,一个里面只有二进制可执行文件,一个是启动脚本和配置文件,不过,rsyncd不装也行,反正配置文件知道内容格式放哪都行,自启动就加在rc.local里也可以。

2.配置rsync

创建和编辑配置文件和secrets文件和启动脚本,配置文件已经有了,在/etc/rsyncd.conf,为了方便找就把它与secrets文件放在同一个目录。

mkdir /etc/rsyncd/

mv /etc/rsyncd.conf /etc/rsyncd/rsyncd.conf && vi /etc/rsyncd/rsyncd.conf

touch /etc/rsyncd/rsyncd.secrets && vi /etc/rsyncd/rsyncd.secrets && chmod 600 /etc/rsyncd/rsyncd.secrets

vi /etc/init.d/rsyncd

rsyncd.conf的内容:

#守护程序PID的文件路径

pid file = /var/run/rsyncd.pid

#日志文件路径

#log file = /var/log/rsyncd.log

#端口号,默认873

port = 873

#地址

address = 10.2.2.222

#使用chroot,需要以root运行,会排除符号链接的目标文件只同步链接本身

use chroot = yes

#用以运行的用户

uid = root

#用户组

gid = root

#只读模式

read only = no

#只写模式

write only = no

#最大连接数

max connections = 5

#允许连接的主机IP,格式允许单独IP和网段,多个IP以空格分开

hosts allow = 10.2.2.0/255.255.255.0

#阻止IP,格式同上

hosts deny = *

#motd文件,连接时输出内容,非必要

#motd file = /etc/rsyncd/rsyncd.motd

#rsync日志开关

#transfer logging = yes

#日志输出格式

log format = %t %a %m %f %b

#超时时限

timeout = 300

#模块,适用于一个单独任务的局部配置

[sync]

#要同步的本地路径

path = /usb/sync

#注释,关于当前任务的描述,内容任意

comment = sync file

#忽略IO错误

ignore errors

#是否输出已同步目录列表

list = no

#用户名,非Linux账户,此帐户与其密码保存在secrets文件内

auth users = syncuser

#secrets文件位置

secrets file = /etc/rsyncd/rsyncd.secrets

#排除目录,以空格分隔

#exclude = /usb/sync/temp

rsyncd.secrets的内容示例:

syncuser:23333333

因为配置文件位置改变,所以要修改启动脚本:

#!/bin/sh /etc/rc.common

# Copyright (C) 2011-2014 OpenWrt.org

START=90

STOP=10

USE_PROCD=1

PROG=/usr/bin/rsync

CONF=/etc/rsyncd/rsyncd.conf

start_service() {

procd_open_instance

procd_set_param command "$PROG" --daemon --config="$CONF"

procd_close_instance

}

修改完成,启动rsync,将其设为自启。

/etc/init.d/rsyncd start

/etc/init.d/rsyncd enable

至此服务端配置完成。

二、配置客户端

以下是在Ubuntu 16.04 LTS上的步骤。

1.安装rsync和inotify-tools

sudo apt-get update && sudo apt-get install rsync inotify-tools

2.创建密码文件用于认证,并修改权限为600,所有者与用户组为当前用户/组

sudo mkdir /etc/rsyncd && sudo touch /etc/rsyncd/rsyncd.password && sudo vi /etc/rsyncd/rsyncd.password && sudo chmod 600 /etc/rsyncd/rsyncd.password && sudo chown user:group /etc/rsyncd/rsyncd.password

文件内只有一行密码,与前文rsyncd.secrets里对应用户的密码对应。

3.创建inotify+rsync方法脚本

为了不被忘却,就放在备份目录里。

touch ~/Backup/inotifyrsync.sh && sudo chmod +x ~/Backup/inotifyrsync.sh && vi ~/Backup/inotifyrsync.sh

内容:

#!/bin/bash

#服务端地址

host=10.2.2.222

#本地备份路径

src=/home/user/Backup/

#服务端模块名

dst=sync

#rsync用户名,与secrets里的对应

user=syncuser

/usr/bin/inotifywait -mrq --timefmt '%d/%m/%y %H:%M' --format '%T %w%f%e' -e close_write,delete,create,attrib,move  $src \

| while read files

        do

        /usr/bin/rsync -zzvrtopg --delete --progress --password-file=/etc/rsyncd/rsyncd.password $src [email protected]$host::$dst

                echo "${files} was rsynced" >>/tmp/rsync.log 2>&1

         done

保存后运行测试:

~/Backup/inotifyrsync.sh

如果没有意外,此时应该能看到输出的同步传输的过程了。如果出现报错,注意服务端的rsync运行日志。

将它加进rc.local的“exit 0”之前,使其自启。

sudo -u user /home/user/Backup/inotifyrsync.sh

至此,客户端的配置完成。

根据短暂的体验,速度还是很快的,rsync以增量方式传输,感觉比之前用GoodSync+samba更快,是否稳定有待观察。

-Update:2016/05/10-

经过几天的日常使用,看起来还是很稳定的,要注意的是客户端与服务端不同文件系统以及内核支持的文件名规范的区别,如文件名长度,允许字符,组成格式等。

参考来源:

通过rsync+inotify实现数据的实时备份

rsync服务器架设(数据同步|文件增量备份)