Openmediavault百度网盘同步解决方案

国内网盘众多,要想与OMV进行同步确实挺烧脑,虽然目前没有开发者针对OMV开发百度云的同步插件,但是国内有大神开发了linux的同步脚本,通过脚本我们可以解决同步的问题。根据搜索引擎检索结果,目前国内有好几个开发者开发了脚本,本篇仅以SyncY脚本为例进行说明,再次感谢开发者辛勤的工作让我们用上这么好的脚本,更多脚本信息可以访问开发者官网。

目前SyncY有四三个版本:Bash、Perl、Python,此外还有个wordpress的插件,那么各版本有和区别呢,这里引用官网的解释:

  • Bash版安装包小,最简单,只要有bash和curl就可以运行,占用内存也较小些,但是速度慢,稳定性也稍差点,适合需要同步的文件数量少的场合,如果文件数量达到2、3千甚至更多时性能较差,同时下载的速度不知为何也较低,不能满速下载。
  • Perl版性能和稳定性都很好,上传下载速度几乎可满速运行,1.0.4版安装包需要1M的空间,比上个版本降低不少,启动基础内存占用在6M左右,同步文件数量在1万左右时会耗用不到8M的内存,但最大的缺点是openwrt上不能支持2G及以上的大文件,如果没有大文件的同步需求,Perl版也是不错的。
  • Python版性能和稳定性和Perl一样,上传下载速度几乎可满速运行,只是安装包空间占用较大,在4M左右,但可以支持2G及以上的大文件(4G以上也可以支持),启动基础内存占用在8M多,同步文件数量在1万左右时会耗用10M左右的内存。

本篇以Python版为例进行介绍,首先上官网下载最新版的脚本文件。其实官网有给出详细的配置说明,只是针对Openwrt的教程,但linux大同小异,参考意义非常大。撰写本篇文章时版本为v2.1.2,不排除后续新版本配置参数和界面有变化,一切以官网说明为准,本文也只是借花献佛。下载解压后包括以下文件:

  • change.log
  • syncy
  • syncy.py
  • syncy-cifs.py
  • 安装说明.txt

在OMV中/etc/目录下新建/config文件夹,然后将syncy配置文件复制到该目录,将syncy.py复制到/usr/bin目录,给syncy.py文件可执行权限。然后修改syncy配置文件,以下是引用的官方配置参数说明:

config syncy

option syncyerrlog ”  #错误日志文件名(必须包含完整路径名),为空时则不记录。
option syncylog ”    #运行日志文件名(必须包含完整路径名),为空时则不记录。
option blocksize ’10’  #分片上传或下载大小,单位M。
option ondup ‘rename’  #重名文件处理方式,rename:重命名,overwrite:覆盖。
option datacache ‘on’    #是否开启同步信息缓存,on:开启,off:关闭。
option slicedownload ‘on’    #是否开启分片下载,on:开启,off:关闭(python 1.0.15版新增)。(v2多线程版删除了此配置项,多线程必须分片下载)
option excludefiles ‘*/Thumbs.db’  #排除文件设置,支持通配符*,多个排除选项用分号(;)隔开。
option listnumber ‘100’  #每次获取云端文件列表数量。
option retrytimes ‘3’   #发生错误后的重试次数。
option retrydelay ‘3’   #发生错误后的重试延时。
option maxsendspeed ‘0’   #最大上传速度,单位 byte/s,0表示不限速。
option maxrecvspeed ‘0’   #最大下载速度,单位 byte/s,0表示不限速。
option syncperiod ‘0-24′   #同步程序运行时间段。
option syncinterval ‘3600’   #每次同步完成后到下次同步间隔时间。
option speedlimitperiod ‘0-0′   #限速时间段 (v2多线程版新增)
option tasknumber ‘2’        #同时同步的任务数(v2多线程版新增)
option threadnumber ‘2’     #每个任务的线程数(v2多线程版新增)

config syncpath

option localpath ‘/mnt/example’  #本地同步目录
option remotepath ‘/example’     #云端目录(与/我的应用程序/SyncY的相对目录)
option enable ‘1’                #1-启用,0-停用
option synctype ‘upload’         #同步类型,支持的类型有:upload,upload+,download,download+,sync

同步参数部分可以按需设置,如果没特殊需求可以使用默认参数,同步路径和同步模式是需要我们设置的,本地目录设置为NAS中用来同步百度云的路径,云端目录是百度网盘中的目录名,脚本会自动设置,同步类型有几种:上传、增量上传、下载、增量下载、同步。比如我的路径配置如下,记得把注释符号#删除:

config syncpath
option localpath ‘/media/0774c882-c091-4fc2-b258-8ad9543c980b/baiduyun’
option remotepath ‘/baiduyun’             # real full path is ‘/apps/SyncY/example’
option enable ‘1’
option synctype ‘sync’

配置好后获取百度云的API授权,在终端中执行“syncy.py”,结果终端报错,这是缺少依赖组件的原因,手动安装依赖包:apt-get install python-pycurl,若提示其它依赖错误,可手动安装对应的软件包。

syncy.py
Traceback (most recent call last):
File “/usr/bin/syncy.py”, line 30, in <module>
import pycurl
ImportError: No module named pycurl

再次运行“syncy.py”出现以下结果
root@nas:~# syncy.py
Device binding Guide:
1. Open web browser to visit:”https://openapi.baidu.com/device” and input user code to binding your baidu account.

2. User code: XXXX此处为授权码,打开上面的地址输入该码
(User code valid for 30 minutes.)

3. After granting access to the application, come back here and press [Enter] to continue.

输入授权码后显示成功的话回到终端按enter继续,显示“Get device token success.”表示授权完成。若运行出现以下错误,则需要注释syncy.py文件中的255行“    # threadtest.join(1)”语句。我用winscp自带编辑器注释后不能运行,用notepad++注释后没有问题。

syncy.py
Traceback (most recent call last):
File “/usr/bin/syncy.py”, line 1728, in <module>
sy = SyncY(sys.argv[1:])
File “/usr/bin/syncy.py”, line 255, in __init__
threadtest.join(1)
File “/usr/lib/python2.7/threading.py”, line 657, in join
raise RuntimeError(“cannot join thread before it is started”)
RuntimeError: cannot join thread before it is started

剩下是开机自启动设置,在OMV的“计划任务”菜单中添加一个任务,在重启时执行“syncy.py”命令即可。

重启系统收工,若后期需要修改syncy的配置参数,可先终止syncy.py运行的进程,然后直接修改/etc/config/syncy,比如修改同步时间间隔,同步模式等。

Enjoy it!