文章更新
- 20160526-初次成文
- 20160712-内容独立分拆,补充了脚本内容,文章添加部分内容
- 20160714-添加了一个检测BTSYNC挂载盘丢失重新挂载的脚本
- 20160722-修改了btsync控制脚本,并且将daemon user从btsync改为pi
- 20160724-修改了btsync控制脚本,以及btsync.confg配置文件
- 20160818-在海外的VPS上装了BTSYNC,只是因为有一个静态IP可以当做known_hosts来加强不同主机之间的联系
- 20160819-更改了外接盘挂掉检测脚本,remount方式更加可靠。
- 20160830-BTSync正式改名为Resilio Sync,文章内容基于2.4.0 RC2
- 20160901-更新了在CentOS 7上安装Resilio Sync,CentOS的防火墙设置
- 20160909-更新了Resilio Sync Archive 目录的运行机制,请注意阅读相关章节
- 20160913-更新了软件的使用注意事项
为什么会有这篇文章
因为电脑越来越多,又想进一步提高效率,本文初衷就是这么简单,工作文件,生活照片,随手可得,这就是这篇文章的目标。至于为什么推荐BiTtorent Sync(现在已经改名了,叫Resilo Sync),可能是因为最早接触吧。而且网上介绍的文章比较多,并且自己有一个树莓派24小时开机,不利用起来说不过去。至于类似的方案嘛,最近从小众软件听说了Syncthing,应该也是个不错的替代品,因为后者开源并且免费。但是我目前已经用了BTSYNC很久了,并且买了个人永远授权,对于我来说稳定熟悉的工具效率更高一些。
在MAC和PC上安装Resilio Sync
因为都有相应的客户端,也没啥好设置的,打开用即可,所以就不多介绍了,重点介绍在CENTOS和树莓派两个平台上的安装。Resilio Sync软件的官方地址在这里,可以看到BTSYNC几乎是各种平台全覆盖,不得不觉得很细心。2.4.0 rc2的内测地址在这里
在树莓派上上安装Resilio Sync
### 为BTSYNC创建独立账户
sudo adduser --quiet --system --group --disabled-password btsync
我后来没有使用Resilio Sync独立账户,而直接使用了pi账户,因为权限问题有点复杂。
下载并安装
cd /usr
sudo wget http://internal.getsync.com/2.4.0.662_SYHTTS/resilio-sync_arm.tar.gz #树莓派需要下载ARM版本
sudo tar -zxvf resilio-sync_arm.tar.gz -C /usr/local/sbin rslsync #解压缩,btsync表示只需要压缩包中的 rslsync 一个文件
/usr/local/sbin/rslsync --webui.listen 0.0.0.0:8888 #初次运行,监听8888端口提供GUI管理界面
然后,在手机或者电脑上访问 http://your_raspberry_ip:8888/gui 即可看到GUI界面。
需要注意的是,这样执行,只按照默认配置执行的,如果需要定义自己的配置,请首先通过 ./rslsync --dump-sample-config 来dump一份默认的配置文件,文件名是 rslsync.conf
例如执行
/usr/local/sbin/rslsync --dump-sample-config > /etc/rslsync.conf
这个文件,需要修改的主要就是给你这台运行btsync的服务器起个名字,并且修改下密码以及监听端口,然后以后每次执行,就可以通过 ./rslsync --config rslsync.conf 来执行你配置好的参数了。
配置开机启动
为了让Resilio Sync每次树莓派开机都启动,我参考这个地方,写了个脚本放在/etc/init.d下面
sudo vim /etc/init.d/rslsync.sh
脚本如下:
#!/bin/sh
# /etc/init.d/rslsync
#set -x
### BEGIN INIT INFO
# Provides: rslsync daemon
# Required-Start: $remote_fs $syslog
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Resilio Sync server daemon
# Description: This service is used to support the Resilio Sync.
# Placed in /etc/init.d/
### END INIT INFO
# Original Author: Nicolas Bernaerts <nicolas.bernaerts@laposte.net>
# Current Author: FOOLMAN <tinyvane@gmail.com>
# Version:
# Ori V1.0, 06/09/2013 - Creation
# Ori V1.1, 09/09/2013 - Use under-priviledged system user
# Ori V1.0, 07/12/2016 - Localized into China Raspberry Pi Users
# Ori V2.0, 07/22/2016 - Change daemon user from btsync to pi
# Cur V3.0, 08/25/2016 - Change pid file location and delete pidmake parameter from start-stop-daemon
# Cur V3.1, 08/30/2016 - Necessary change of service name from btsync for rslsync
. /lib/lsb/init-functions
# description variables
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin
DESC="Resilio Sync server"
DAEMON_NAME="rslsync"
DAEMON_USER="pi"
DAEMON_PATH="/usr/local/sbin/${DAEMON_NAME}"
DAEMON_OPTS=""
DAEMON_DESC=$(get_lsb_header_val $0 "Short-Description")
DAEMON_PID="/home/pi/.sync/sync.pid"
DAEMON_LOG='/var/log/rslsync'
# Exit if rslsync program is not installed
if [ ! -x "${DAEMON_PATH}" ] ; then
echo "Binary ${DAEMON_PATH} does not exist. Aborting"
exit 0
fi
# Exit if rslsync user home directory doesn't exist, is "pi" in this script.
if [ ! -d "/home/${DAEMON_USER}" ]; then
echo "User /home/${DAEMON_USER} does not exist. Aborting"
exit 0
fi
# Function that starts the daemon/service
# 0 - daemon started
# 1 - daemon already running
# 2 - daemon could not be started
do_start() {
local result
pidofproc -p "${DAEMON_PID}" "${DAEMON_PATH}" > /dev/null
if [ $? -eq 0 ]; then
log_warning_msg "${DAEMON_NAME} is already started"
result=0
else
log_daemon_msg "Starting ${DAEMON_DESC}" "${DAEMON_NAME}"
touch "${DAEMON_LOG}"
chown $DAEMON_USER "${DAEMON_LOG}"
chmod u+rw "${DAEMON_LOG}"
if [ -z "${DAEMON_USER}" ]; then
start-stop-daemon --start --quiet \
--exec "${DAEMON_PATH}" -- --config /etc/rslsync.conf
result=$?
else
start-stop-daemon --start --quiet \
--chuid "${DAEMON_USER}" \
--exec "${DAEMON_PATH}" -- --config /etc/rslsync.conf
result=$?
fi
log_end_msg $result
fi
return $result
}
# Function that stops the daemon/service
# 0 - daemon stopped
# 1 - daemon already stopped
# 2 - daemon could not be stopped
do_stop() {
# Stop the daemon
local result
pidofproc -p "${DAEMON_PID}" "${DAEMON_PATH}" > /dev/null
if [ $? -ne 0 ]; then
log_warning_msg "${DAEMON_NAME} is not started"
result=0
else
log_daemon_msg "Stopping ${DAEMON_DESC}" "${DAEMON_NAME}"
pkill -p "${DAEMON_PID}" "${DAEMON_PATH}"
result=$?
log_end_msg $result
# remove pid file
rm -f "${DAEMON_PID}"
fi
return $result
}
do_restart() {
local result
do_stop
result=$?
if [ $result = 0 ]; then
do_start
result=$?
fi
return $result
}
do_status() {
local result
status_of_proc -p "${DAEMON_PID}" "${DAEMON_PATH}" "${DAEMON_NAME}"
result=$?
return $result
}
do_usage() {
echo $"Usage: $0 {start | stop | restart | status}"
exit 1
}
# deal with different parameters : start, stop & status
case "$1" in
start) do_start; exit $? ;;
stop) do_stop; exit $? ;;
restart) do_restart; exit $? ;;
status) do_status; exit $? ;;
*) do_usage; exit 1 ;;
esac
PS: 说明,这个脚本我修改了好几遍,需要注意的是,因为在btsync.conf配置文件中,有指定pid文件的选项,导致和控制脚本的makepid总是冲突,因为我把btsync.conf中pid file的相关选项给注释掉了,然后只用控制脚本的makepid选项来控制pid文件的创建和删除,目前看上去一切正常。
PS: 经过几个月的使用和证实,发现即便不指定btsync.conf中的PID文件的位置,BTSYNC也会在/home/pi/.sync目录下,生成一个叫sync.pid的文件,而通过 --pidfile "${DAEMON_PID}" --make-pidfile \参数指定的pid文件,pid的数值却不正确。所以我在最新的脚本文件里,start-stop-daemon命令里,删掉了--pidfile "${DAEMON_PID}" --make-pidfile \。并且,将控制脚本里的DAEMON_LOG='/var/log/btsync'这句话,直接指定到了/home/pi/.sync/sync.pid,然后发现脚本终于可以通过systemctl start/stop btsync来手动控制BTSYNC的启动和停止了。
然后给可执行权限,并且加入到启动项中
sudo chmod +x /etc/init.d/rslsync
sudo update-rc.d rslsync defaults
如果需要手动停止和启动Resilio Sync,则使用下面的命令即可
sudo service rslsync start #启动BTSync
sudo service rslsync stop #停止BTSync
sudo service rslsync status #查看BTSync状态
rslsync.conf详解
我的配置如下
{
"device_name": "Pi in Beijing",
"listening_port" : 0, // 0 - randomize port
/* storage_path dir contains auxilliary app files if no storage_path field: .sync dir created in current working directory */
"storage_path" : "/home/pi/.sync", //这个地方如果注释掉的话,RslSync会在rslsync可执行程序的同级目录下建立.sync目录,不是很直观
/* set location of pid file */
//"pid_file" : "/home/btsync/btsync.pid", //我把这句给注释掉地了,因为和控制脚本中的makepid冲突了,具体原因,大家可以自己感受一下
/* use UPnP for port mapping */
"use_upnp" : true,
/* limits in kB/s. 0 - no limit */
"download_limit" : 0,
"upload_limit" : 0,
/* proxy configuration */
// "proxy_type" : "socks4", // Valid types: "socks4", "socks5", "http_connect". Any other value means no proxy
// "proxy_addr" : "192.168.1.2", // IP address of proxy server.
// "proxy_port" : 1080,
// "proxy_auth" : false, // Use authentication for proxy. Note: only username/password for socks5 (RFC 1929) is supported, and it is not really secure
// "proxy_username" : "user",
// "proxy_password" : "password",
"webui" :
{
"listen" : "0.0.0.0:8888" // remove field to disable WebUI
/* preset credentials. Use password or password_hash */
,"login" : "username"
,"password" : "password"
// ,"password_hash" : "some_hash" // password hash in crypt(3) format
// ,"allow_empty_password" : false // Defaults to true
/* ssl configuration */
// ,"force_https" : true // disable http
// ,"ssl_certificate" : "/path/to/cert.pem"
// ,"ssl_private_key" : "/path/to/private.key"
/* directory_root path defines where the WebUI Folder browser starts (linux only). Default value is / */
// ,"directory_root" : "/home/pi/MySharedFolders/"
/* directory_root_policy defines how directory_root is used (linux only).
Valid values are:
"all" - accepts directory_root and its subdirectories for 'getdir' and 'adddir' actions
"belowroot" - accepts directory_root's subdirectories for 'getdir' and 'adddir' actions,
but denies attempts to use 'adddir' to create directories directly within directory_root
Default value is "all". */
// ,"directory_root_policy" : "all"
/* dir_whitelist defines which directories can be shown to user or have folders added (linux only)
relative paths are relative to directory_root setting */
// ,"dir_whitelist" : [ "/home/user/MySharedFolders/personal", "work" ]
}
/* !!! if you set shared folders in config file WebUI will be DISABLED !!!
shared directories specified in config file override the folders previously added from WebUI. */
/*,
"shared_folders" :
[
{
"secret" : "MY_SECRET_1", // required field - use --generate-secret in command line to create new secret
"dir" : "/home/user/bittorrent/sync_test", // * required field
"use_relay_server" : true, // use relay server when direct connection fails
"use_tracker" : true,
"search_lan" : true,
"use_sync_trash" : true, // enable SyncArchive to store files deleted on remote devices
"overwrite_changes" : false, // restore modified files to original version, ONLY for Read-Only folders
"known_hosts" : // specify hosts to attempt connection without additional search
[
"192.168.1.2:44444"
]
}
]
*/
/* Advanced preferences can be added to config file. Info is available at "http://help.getsync.com/customer/portal/articles/1902048-sync-advanced-preferences--more-options"
For example see folder_rescan_interval below */
//, "folder_rescan_interval" : "86400"
}
有几个地方一定要注意
- “device_name”: “Pi in Beijing” #这个是你服务器的标示,改一个比较容易记的
- “storage_path” : “/home/pi/.sync”, #这个是配置文件,一定要设置好位置
- “pid_file” : “/home/pi/.sync/sync.pid”, #这个是进程的pid文件位置,如果你使用了上面我的启动脚本,请记得这里一定要设置和我这里相同
- 2和3的权限,一定要属于btsync,并且记得给外接硬盘上的btysnc目录权限,可以使用
sudo chown -R btsync:btsync file
检测脚本
发现BTSYNC经常无缘无故的挂掉,因此就想用一个脚本,放在系统cron中每10分钟检测一次,重新挂载,不过现在觉得这不是解决之道,要么是树莓派3无法承受高IO,要么是我的系统有问题,准备重新刷机之后在看看。无论如何,脚本先放出来吧,大家参考一下思路就够了。
#!/bin/sh
set -x
#date:2016/08/19
logFile="/var/log/BTSyncCheck.log"
df -l | grep "13db65cc-f3f1-4158-8cc6-118602a6a7dc"
if [ $? -ne 0 ]
then
echo "$(date) $(time) Everthing seems to be fine...." >> $logFile
exit 1
else
echo "$(date) $(time) WTF! Pi could not find portable hd again! Let's do something:....."
umount /media/pi/13db65cc-f3f1-4158-8cc6-118602a6a7dc
umount -lf /mnt/hd250g
mount UUID="13db65cc-f3f1-4158-8cc6-118602a6a7dc" /mnt/hd250g
echo "$(date) $(time) Portable HD remount. Glad to know everything got back to normal!" >> $logFile
exit 1
fi
关于shell脚本编程,我单独开了一个帖子,介绍了条件检测和条件判断的几种例子,地址在这里。
将脚本加入系统cron中
sudo vim /etc/crontab
加入这么一句
*/10 * * * * root /usr/BTSyncCheck.sh &
建立日志文件
sudo touch /var/log/BTSyncCheck.log
在CentOS系统上安装
下载并导出配置
我的CentOS有6和也有7,除了systemctl和service那块,几乎没什么差别,注意选择安装程序的版本就好了。另外需要注意的是,CentOS 7默认没有安装iptable,而改用了新的firewall-cmd命令,所以,还需要注意在防火墙中把Resilio Sync的的listening port加进去,否则不同peer之间也容易联系不到彼此,尤其是在企业环境下,企业防火墙设置一般是除了80端口其他端口一律封掉,所以,如果迫不得已,你可以需要让Resilio Sync监听80端口,然后用VPN做返现代理。关于CentOS 7的防火墙设置,可以看我的另外一篇帖子
wget http://internal.getsync.com/2.4.0.662_SYHTTS/resilio-sync_x64.tar.gz -O /usr
tar -zxvf /usr/resilio-sync_x64.tar.gz -C /usr/local/sbin rslsync
/usr/local/sbin/rslsync --dump-sample-config > /etc/rslsync.conf #导出配置文件
编辑配置rslsync.conf
因为写过好多遍了,这里就不啰嗦了,主要修改的地方就几个
{
"device_name": "<这里要成你想要的名字>",
"listening_port" : 0, // 如果不设置,就随机使用端口,如果你的路由器不支持UPNP,就需要指定一个端口(在指定端口的同时,要禁用UPNP),否则会连不到relay server或者联系不到你的其他peer
// 这个port还有一个作用,其实指定了也比较好,就是需要把他当做known——host的时候,这样可以让其他的链接到这个服务器,然后帮助peer各自找到其他的peer
"webui" :
{
"listen" : "0.0.0.0:8888", //如果有需求,可以修改这里,因为8888这个端口太招摇了,所以还是换一个比较隔色的比较好
"login" : "username",
"password" : "password"
}
,"directory_root" : "/home/pi/MySharedFolders/" //指定默认目录,比如你外接了硬盘,这里还是要指定
}
运行RslSync
一句话
/usr/local/sbin/rslsync --config /etc/rslsync.conf
把RslSync加入开机启动
在文件 /etc/rc.local 的末尾处的 exit 0 前一行加入
/usr/local/sbin/rslsync --config /etc/rslsync.conf
在CentOS 7中,
rc.local已经不被推荐使用,所以最好编写控制脚本,放到/etc/init.d目录下去,并配合使用systemd来控制服务的启动、停止等动作。
当然了,如果你是服务器,N天不断电的那种,单独执行也就够了。
重启机器,RslSync就启动了。
通过本地浏览器打开 <服务器的IP地址>:<端口>/gui 登陆以后,输入账号密码,即可开始使用Sync。
文件丢失惊魂
准备重新刷一次系统盘,重装下系统看看,好在BTSYNC还有20多天的试用期才结束,不过昨天发现我的40多G的照片,在另外一个台式机上没了,吓死我了,后来终于在 .sync 下的 .archive 目录下找到了,稍微安心一点,看来备份无论什么时候都不能放松。关于这个目录中到底有什么,我这里也从官方论坛找到了解释,在下面附上一小节来说一下。
关于.sync目录中文件的作用
特别注意,.sync目录下的文件不要轻易移动,尤其是那些 0 byte 的文件,如果你发现你的同步目录下的文件没了,而在 .sync 目录下发现了,不要轻易把文件移动回来,经过我的本人的多次确认,并且以丢失了10张照片和一段视频为代价,确认了 Resilio Sync 使用 Archive 的目录并不是单纯地存放被删掉的文件,并且也是它的临时目录,Sync可能会在同步的过程中,把文件移动到 Archive 目录下,并不是被它删除了,过一段时间,Sync 会自动把文件恢复原样的。
而更为严重的是,如果你把 .sync 目录下的零字节文件不小心移动回了你的共享目录下的话,那么你的文件就永远无法找回来了,切记!切记!
每个你创建的BTSYNC共享目录,或者从其他设备上同步过来的目录下面,系统都会自动创建一个隐藏的.sync目录(这个目录在MAC系统上是Archive),这个目录里面,主要包含着BTSYNC的存档文件。具体结构见下图。

主要包含:
.sync目录,默认是隐藏不可见的。.DS_Store目录,(是桌面服务存储的缩写,Desktop Services Store),这是由MAC OSX系统创建的,用来存储例如桌面图标位置或者背景文件,这个目录只有在MAC系统下才有。- 一个叫
Archive目录,里面包含着被删掉的文件,或者是文件的早期版本。 ID,IgnoreList,StreamsList等三个文件。ID代表着目录的标识符,它允许BTSYNC找到需要同步的文件的正确片段并且进行同步。IgnoreList允许你指定哪个文件或目录被同步(pro 高级版功能)。如果想知道IgnoreList的具体语法,请参见官方说明。StreamsList文件允许你为不同的 streams, xattrs and resource forks 设置“白名单”。更多的信息,可以参考这里。- 用户的文件。
.sync 目录的存在对于Resilio Sync来说十分重要,如果这个目录被你删掉了,会引起103错误
这段翻译自BTSYNC的官方博客,具体地址见这里。
软件使用注意事项
这个是我使用Resilio Sync小半年的总结,希望别人少走一些弯路吧
- 像上面说的,
.sync目录下的的文件不要轻易移动,尤其是那些零字节的文件 - 手机的备份目录,不要备份到过多的地方,因为每个peer上的备份,都是独立的,比如你把iphone上的照片备份到了peer A和peer B上,那么你在peer A上删掉了照片,但是peer B上的照片不会删掉,会一直保存在peer B里面,并且在peer A上,看到的这个备份目录的大小,不会是0,而是peer B上的容量。
- 先写这么多吧