树莓派折腾之:BTSYNC同步所有电脑和手机

文章更新

  1. 20160526-初次成文
  2. 20160712-内容独立分拆,补充了脚本内容,文章添加部分内容
  3. 20160714-添加了一个检测BTSYNC挂载盘丢失重新挂载的脚本
  4. 20160722-修改了btsync控制脚本,并且将daemon user从btsync改为pi
  5. 20160724-修改了btsync控制脚本,以及btsync.confg配置文件
  6. 20160818-在海外的VPS上装了BTSYNC,只是因为有一个静态IP可以当做known_hosts来加强不同主机之间的联系
  7. 20160819-更改了外接盘挂掉检测脚本,remount方式更加可靠。
  8. 20160830-BTSync正式改名为Resilio Sync,文章内容基于2.4.0 RC2
  9. 20160901-更新了在CentOS 7上安装Resilio Sync,CentOS的防火墙设置
  10. 20160909-更新了Resilio Sync Archive 目录的运行机制,请注意阅读相关章节
  11. 20160913-更新了软件的使用注意事项

为什么会有这篇文章

因为电脑越来越多,又想进一步提高效率,本文初衷就是这么简单,工作文件,生活照片,随手可得,这就是这篇文章的目标。至于为什么推荐BiTtorent Sync(现在已经改名了,叫Resilo Sync),可能是因为最早接触吧。而且网上介绍的文章比较多,并且自己有一个树莓派24小时开机,不利用起来说不过去。至于类似的方案嘛,最近从小众软件听说了Syncthing,应该也是个不错的替代品,因为后者开源并且免费。但是我目前已经用了BTSYNC很久了,并且买了个人永远授权,对于我来说稳定熟悉的工具效率更高一些。

在MAC和PC上安装Resilio Sync

因为都有相应的客户端,也没啥好设置的,打开用即可,所以就不多介绍了,重点介绍在CENTOS和树莓派两个平台上的安装。Resilio Sync软件的官方地址在这里,可以看到BTSYNC几乎是各种平台全覆盖,不得不觉得很细心。2.4.0 rc2的内测地址在这里

在树莓派上上安装Resilio Sync

### 为BTSYNC创建独立账户

1
sudo adduser --quiet --system --group --disabled-password btsync

我后来没有使用Resilio Sync独立账户,而直接使用了pi账户,因为权限问题有点复杂。

下载并安装

1
2
3
4
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

例如执行

1
/usr/local/sbin/rslsync --dump-sample-config > /etc/rslsync.conf

这个文件,需要修改的主要就是给你这台运行btsync的服务器起个名字,并且修改下密码以及监听端口,然后以后每次执行,就可以通过 ./rslsync --config rslsync.conf 来执行你配置好的参数了。

配置开机启动

为了让Resilio Sync每次树莓派开机都启动,我参考这个地方,写了个脚本放在/etc/init.d下面

1
sudo vim /etc/init.d/rslsync.sh

脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#!/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的启动和停止了。

然后给可执行权限,并且加入到启动项中

1
2
sudo chmod +x /etc/init.d/rslsync
sudo update-rc.d rslsync defaults

如果需要手动停止和启动Resilio Sync,则使用下面的命令即可

1
2
3
sudo service rslsync start 	#启动BTSync
sudo service rslsync stop #停止BTSync
sudo service rslsync status #查看BTSync状态

rslsync.conf详解

我的配置如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
{
"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"

}

有几个地方一定要注意

  1. “device_name”: “Pi in Beijing” #这个是你服务器的标示,改一个比较容易记的
  2. “storage_path” : “/home/pi/.sync”, #这个是配置文件,一定要设置好位置
  3. “pid_file” : “/home/pi/.sync/sync.pid”, #这个是进程的pid文件位置,如果你使用了上面我的启动脚本,请记得这里一定要设置和我这里相同
  4. 2和3的权限,一定要属于btsync,并且记得给外接硬盘上的btysnc目录权限,可以使用 sudo chown -R btsync:btsync file

检测脚本

发现BTSYNC经常无缘无故的挂掉,因此就想用一个脚本,放在系统cron中每10分钟检测一次,重新挂载,不过现在觉得这不是解决之道,要么是树莓派3无法承受高IO,要么是我的系统有问题,准备重新刷机之后在看看。无论如何,脚本先放出来吧,大家参考一下思路就够了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/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中

1
sudo vim /etc/crontab

加入这么一句

1
*/10 * * * *    root    /usr/BTSyncCheck.sh &

建立日志文件

1
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的防火墙设置,可以看我的另外一篇帖子

1
2
3
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

因为写过好多遍了,这里就不啰嗦了,主要修改的地方就几个

1
2
3
4
5
6
7
8
9
10
11
12
{
"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

一句话

1
/usr/local/sbin/rslsync --config /etc/rslsync.conf

把RslSync加入开机启动

在文件 /etc/rc.local 的末尾处的 exit 0 前一行加入

1
/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目录中的文件结构

主要包含:

  1. .sync 目录,默认是隐藏不可见的。
  2. .DS_Store 目录,(是桌面服务存储的缩写,Desktop Services Store),这是由MAC OSX系统创建的,用来存储例如桌面图标位置或者背景文件,这个目录只有在MAC系统下才有。
  3. 一个叫 Archive 目录,里面包含着被删掉的文件,或者是文件的早期版本。
  4. IDIgnoreList, StreamsList 等三个文件。ID代表着目录的标识符,它允许BTSYNC找到需要同步的文件的正确片段并且进行同步。IgnoreList 允许你指定哪个文件或目录被同步(pro 高级版功能)。如果想知道 IgnoreList 的具体语法,请参见官方说明。StreamsList文件允许你为不同的 streams, xattrs and resource forks 设置“白名单”。更多的信息,可以参考这里
  5. 用户的文件。

.sync 目录的存在对于Resilio Sync来说十分重要,如果这个目录被你删掉了,会引起103错误

这段翻译自BTSYNC的官方博客,具体地址见这里

软件使用注意事项

这个是我使用Resilio Sync小半年的总结,希望别人少走一些弯路吧

  1. 像上面说的,.sync目录下的的文件不要轻易移动,尤其是那些零字节的文件
  2. 手机的备份目录,不要备份到过多的地方,因为每个peer上的备份,都是独立的,比如你把iphone上的照片备份到了peer A和peer B上,那么你在peer A上删掉了照片,但是peer B上的照片不会删掉,会一直保存在peer B里面,并且在peer A上,看到的这个备份目录的大小,不会是0,而是peer B上的容量。
  3. 先写这么多吧

参考资料

  1. INSTALLING BITTORRENT SYNC ON RASPBERRY PI
分享到