‍原创作者:HackLiu‍

0×00 前言

‍‍如果你家里有多台设备需要联网需要娱乐,你一定会或多或少遇到设备碎片化带来的烦恼。当然,已经有很多厂商包括新晋的小米、360在内的互联网公司做了这个事情,给你搞个家庭存储中心,基本能解决你的大部分需求。但是,本着不折腾就会死的机翼安劲儿,咱自个来造个低成本低功耗的解决方案,成本680元,耗时2个小时左右。

0×01 NAS基础设施搭

材料:先要有Raspberry Pi/路由器/破电脑等能装Linux的设备,适当容量的移动硬盘或SATA硬盘;
原理:在运行Linux的设备上,挂载大容量硬盘,并利用Samba搭建NAS;

<img src="http://image.3001.net/images/20151228/14512646484836.jpg!small" title="raspnas-web.jpg"/></p>

至此,如果你是严格按照教程部署,你的NAS应该已经开始正常运转,iOS、Android、Windows、Mac等不同系统都有连接NAS服务器的应用,可自行度之。

变身双向同步云盘

NAS主要服务于同一局域网内的设备,如果你想将你的NAS打造成可以外网访问并进行数据同步的网盘,我们只需借助FTP+动态域名解析即可实现。

1.1 配置FTP服务

接下来,我们使用vsftpd来搭建FTP服务(VSFTPD是一个开源的轻量级FTP服务器程序),按照以下步骤进行配置:

  1. sudo apt-get install vsftpd //安装vsftpd服务器 (约400KB)
  2. sudo nano /etc/vsftpd.conf //编辑vsftdp的配置文件

在配置文件中找到以下行,并设定为对应值:

  1. anonymous_enable=NO //表示不允许匿名访问
  2. local_enable=YES //设定本地用户可以访问。
  3. write_enable=YES //设定可以进行写操作
  4. local_umask=022 //支持断点续传
  1. sudo service vsftpd restart //重启vsftpd服务

OK,此时搭载有NAS的服务器也已经具备FTP服务,现在可以使用浏览器访问试试。此时,你的FTP依然只能在内网访问,我们需要借助动态域名解析服务实现外网访问:

1.2 外网访问设置(如果不需要外网访问,此步非必须)

如果你还没自己的域名,可以在网上申请各类免费得二级域名或直接在花生壳、3322上进行动态域名申请及配置。如果你有自己的域名,参照以下教程使用DNSPOD服务进行设置。先在DNSPOD注册并添加域名,然后将你的域名DNS配置为DNSPOD的。之后,在linux上进行脚本设定。确保你已经安装了Python环境,然后新建Py脚本,粘贴如下代码(Via e-fly):

  1. #!/usr/bin/env python  
  2.  #<strong style="color:black; background-color:#99ff99">-</strong>*<strong style="color:black; background-color:#99ff99">-</strong> coding:utf<strong style="color:black; background-color:#99ff99">-</strong>8 <strong style="color:black; background-color:#99ff99">-</strong>*<strong style="color:black; background-color:#99ff99">-</strong>  
  3.    
  4.  import urllib2,urllib,json  
  5.    
  6.  class Dns:  
  7.      #Dnspod账户  
  8.      _dnspod_user = ’你的账户’  
  9.      #Dnspod密码  
  10.      _dnspod_pwd = ’你的密码’  
  11.      #Dnspod主域名,注意:是你注册的域名  
  12.      _domain = cb.e<strong style="color:black; background-color:#99ff99">-</strong>fly.org  
  13.      #子域名,如www,如果要使用根域名,用@  
  14.      _sub_domain = ’@’  
  15.    
  16.      def getMyIp(self):  
  17.          try:  
  18.              u = urllib2.urlopen(‘http://members.3322.org/dyndns/getip’)  
  19.              return u.read()  
  20.          except HTTPError as e:  
  21.              print e.read()  
  22.              return None;  
  23.    
  24.      def api_call(self,api,data):  
  25.          try:  
  26.              api = https://dnsapi.cn/’ + api  
  27.              data[‘login_email’] = self._dnspod_user  
  28.              data[‘login_password’] = self._dnspod_pwd  
  29.              data[‘format’] =‘json  
  30.              data[‘lang’] =  cn  
  31.              data[‘error_on_empty’] = no  
  32.    
  33.              data = urllib.urlencode(data)  
  34.              req = urllib2.Request(api,data,  
  35.                  headers = {  
  36.                      UserAgent : LocalDomains/1.0.0(roy@leadnt.com)’,  
  37.                      Content<strong style="color:black; background-color:#99ff99">-</strong>Type’:’application/x<strong style="color:black; background-color:#99ff99">-</strong>www<strong style="color:black; background-color:#99ff99">-</strong>form<strong style="color:black; background-color:#99ff99">-</strong>urlencoded;text/html; charset=utf8’,  
  38.                      })  
  39.              res = urllib2.urlopen(req)  
  40.              html = res.read()  
  41.              results = json.loads(html)  
  42.              return results  
  43.          except Exception as e:  
  44.              print e  
  45.    
  46.      def main(self):  
  47.          ip = self.getMyIp()  
  48.          dinfo = self.api_call(‘domain.info’,{‘domain : self._domain})  
  49.          domainId = dinfo[‘domain’][‘id’]  
  50.          rs = self.api_call(‘record.list’,  
  51.              {  
  52.                  domain_id’: domainId,  
  53.                  offset :’0’,  
  54.                  length : 1’,  
  55.                  sub_domain : self._sub_domain  
  56.              })  
  57.    
  58.          if rs[‘info’][‘record_total’] == 0:  
  59.              self.api_call(‘record.create’,  
  60.                  {  
  61.                      domain_id : domainId,  
  62.                      sub_domain : self._sub_domain,  
  63.                      record_type : A’,  
  64.                      record_line : ’默认’,  
  65.                      value : ip,  
  66.                      ttl : 3600  
  67.                  })  
  68.              print Success.’  
  69.          else:  
  70.              if rs[‘records’][0][‘value’].strip() != ip.strip():  
  71.                  self.api_call(‘record.modify’,  
  72.                  {  
  73.                      domain_id : domainId,  
  74.                      record_id : rs[‘records’][0][‘id’],  
  75.                      sub_domain : self._sub_domain,  
  76.                      record_type : A’,  
  77.                      record_line : ’默认’,  
  78.                      value : ip  
  79.                      })  
  80.              else:  
  81.                  print Success.’  
  82.    
  83.  if __name__ == __main__’:  
  84.      d = Dns();  
  85.      d.main()

‍‍‍‍‍将以上代码保存后,设定755权限,运行即可。如需要定时检测更新域名IP地址,可以将该脚本文件加入 /etc/crontab 进行定时执行任务。

至此,你的整个服务器已经同时具备了内网的NAS,以及内网和外网的FTP服务。接下来,开始在你的各类终端上进行双向网盘同步设置吧,本文以Android系统为例,其他系统的FTP同步教程请自行度之。

1.3 安卓手机数据同步

原理很简单,找一个FTP的App,指定手机某个文件夹(一般都是相册所在文件夹)自动同步到上文搭建好的NAS路径中。相比使用百度云等网盘同步,我们这样做的优势除了隐私性更强外,还能在本地WiFi网络内以极高的上行速率进行数据备份。

一处备份(从手机至NAS),多处共享(从NAS到Mac、PC、iPhone、iPad)。

本文以FtpSyncX安卓版为例进行设置:

<img src="http://image.3001.net/images/20151228/14512648412252.jpg!small" title="ftpsyncx.jpg"/></p>

第一步:添加服务器,点击Add server,选择FTP格式,设置好服务器地址(建议填入以上文中的额动态域名,如不需要填入内网IP即可),填写登录帐号和密码;
第二步:设置要同步的两端文件夹目录,选择Local Diectory设置手机上的文件夹,Remote directory设置NAS上对应的同步文件夹,建议新建一个。接下来设置同步类型,remote<=>local双向同步、remote=>local NAS到手机单向同步、 local=>remote 手机到NAS单向同步,根据需要进行选择。勾选上WiFi Only,只在WiFi下同步;

设定完成后开始同步看看效果吧。此软件还可以设定同步时间间隔等高级参数。

0×02 搭建完美下载机

看了小米路由宣称的1T硬盘和迅雷离线下载很心动?别急,咱也能。

Linux下可以实现BT下载的应用有很多,目前支持下载格式最多和最知名的是Aria2。相比以往的开源BT程序,Aria2不仅支持BT下载,还支持Http、Ftp、磁力链接等格式下载,当然,文章最后完美还附上了迅雷离线下载+Aria2的完美方案。

2.1 安装并配置Aria2

在Linux终端内执行以下命令安装Aria2程序:

  1. sudo apt-get install aria2 //安装Aria2

接下来配置Aria2的配置文件,每行为一个单独命令:

  1. mkdir ~/.aria2 //新建文件夹
  2. touch ~/.aria2/aria2.session //新建session文件
  3. nano ~/.aria2/aria2.conf //新建配置文件

在aria2.conf配置文件里粘贴以下代码,别忘记将里边的路径替换为自己的:

  1. dir=/home/cubie/Download //下载的默认目录
  2. disable-ipv6=true
  3. enable-rpc=true
  4. rpc-allow-origin-all=true
  5. rpc-listen-all=true
  6. #rpc-listen-port=6800
  7. continue=true
  8. input-file=/home/cubie/.aria2/aria2.session //路径要绝对路径
  9. save-session=/home/cubie/.aria2/aria2.session //保存你的下载列表
  10. max-concurrent-downloads=3

保存并执行以下命令:

  1. aria2c conf-path=/home/cubie/.aria2/aria2.conf

如果没有错误,Ctrl+C终止并继续下一步,把aria2做成系统服务:

  1. sudo nano /etc/init.d/aria2c

粘贴内容如下:

  1. #!/bin/sh### BEGIN INIT INFO# Provides:          aria2# Required-Start:    $remote_fs $network# Required-Stop:     $remote_fs $network# Default-Start:     2 3 4 5# Default-Stop:      0 1 6# Short-Description: Aria2 Downloader### END INIT INFOcase "$1" in
  2. start)
  3.     echo -"Starting aria2c"
  4.     sudo -u cubie aria2c --conf-path=/home/cubie/.aria2/aria2.conf -
  5.     #sudo -u后面的是你正在使用的用户名,因为我用的cubie,别忘记改成自己的;;
  6. stop)
  7.     echo -"Shutting down aria2c "
  8.     killall aria2c
  9. ;;
  10. restart)
  11.     killall aria2c
  12.     sudo -u cubie aria2c --conf-path=/home/cubie/.aria2/aria2.conf -D
  13.     #同上面的一样,根据自己的用户名改cubie;;esac
  14. exit

保存后退出,然后设置这个文件的权限为755:

  1. sudo chmod 755 /etc/init.d/aria2c

测试Aria2服务是否可以启动:

  1. sudo service aria2c start

如果只显示Starting aria2c,没有其他错误提示的话就说明成功了。然后添加aria2c服务到开机启动:

  1. sudo update-rc.d aria2c defaults

由于Aria2不具备Web管理,所以需要使用第三方开发的开源程序Yaaw进行Web管理。先要确保你的Linux已经配置了Nginx或Apache等Web服务器环境,关于Nginx的配置可参考此文:http://wemaker.cc/59,此处不再累述。

进入Web服务的文件目录,以Nginx为例:

  1. cd /srv/www
  2. git clone http://github.com/wzhy90/yaaw

程序执行完成后,在浏览器中打开http://IP地址或域名地址//yaaw,即看到Aria2的Web管理界面,此时一个支持BT、FTP、HTTP、磁力等格式的下载机已在完美运转。点击右上角的设置项,在弹出的界面中找到Aria2 JSON-RPC Path,留好在下一步备用。

2.2 配置迅雷离线下载

这一步需要额外的程序支持,国内有高手开发出了Aria2结合迅雷离线的浏览器插件,本文以Chrome为例设置。

<img src="http://image.3001.net/images/20151228/14512648721846.jpg!small" title="xunlei-lixian.jpg"/></p>

打开此链接,安装Chrome浏览器扩展程序,然后登录迅雷离线的Web站(需要会员),点击页面右上角的设置,在弹出的窗口中,找到Aria2 JSON-RPC Path项,将Yaaw中复制出来的URL粘贴进去并保存。接下来,试试在迅雷离线下一部片子,基本是秒下,然后点击“取回本地”旁的下拉按钮,在选项中选择Yaaw。回到你的Aria2 Web管理页,是不是已经有一项任务躺在里边了?

至此,大功告成。咱也过上了想什么时候下就什么时候下、想在哪下就再哪下、想下啥就下啥、想在哪看就再哪看、想怎么同步就怎么同步的性福生活。

推荐方案:树莓派B英国产+4G TF(255元)+ 1T硬盘 (400元) + 有源的USB Hub(25元)进行搭建,总成本680元左右。

0×03 预告

接下来会把树莓派替换为一个802.11ac双频可刷OpenWRT的路由器,将整体成本和能耗降到最低。敬请期待我们带来的路由器的解决方案。有了这神器,还等啥小米路由、360路由……

*作者:HackLiu,本文属FreeBuf原创奖励计划文章,未经许可禁止转载

出处:http://www.freebuf.com/sectool/91255.html

使用树莓派制作一套“NAS+私有云盘+下载机”的更多相关文章

  1. 极客DIY:使用树莓派制作一套“NAS+私有云盘+下载机”

    原创作者:HackLiu 0×00 前言 ‍ ‍ 如果你家里有多台设备需要联网需要娱乐,你一定会或多或少遇到设备碎片化带来的烦恼.当然,已经有很多厂商包括新晋的小米.360在内的互联网公司做了这个事情 ...

  2. linux下使用URLOS搭建nextcloud私有云盘系统

    Nextcloud是一个免费专业的私有云存储网盘开源项目,可以让你简单快速地在个人/公司电脑.服务器甚至是树莓派等设备上架设一套属于自己或团队专属的云同步网盘,从而实现跨平台跨设备文件同步.共享.版本 ...

  3. nextcloud私有云盘的部署

    nextcloud在centos系统下搭建自己的私有云盘 搭建一套自己的私有云盘,让数据存储更加方便.可靠.自己搭建的云存储,首先没有什么容量.下载速度的限制,而且本地访问速度很快.一开始以为Next ...

  4. 政务私有云盘系统建设的工具 – Mobox私有云盘

    序言 这几年,智慧政务已经成为了政府行业IT建设发展的重要进程.传统办公方式信息传递速度慢.共享程度低.查询利用难,早已成为政府机关获取和利用信息的严重制约因素.建立文档分享共用机制,加强数据整合,避 ...

  5. 树莓派做私有云盘-极简版(owncloud)

    这里直接给出配置好私有云的镜像,只需烧录镜像后微改配置后即可使用 链接:https://pan.baidu.com/s/1EOQaSQso-0wmnuWgZKknZg提取码:q26h 1.直接将此镜像 ...

  6. 5分钟快速部署ownCloud私有云盘存储系统

    ownCloud 是一个开源免费专业的私有云存储项目,它能帮你快速在个人电脑或服务器上架设一套专属的私有云文件同步网盘,可以像 Dropbox 那样实现文件跨平台同步.共享.版本控制.团队协作等等.o ...

  7. docker 搭建私有云盘 Seafile

    缘起 现如今各种云存储服务其实挺多的,国外有经典的DropBox.Google Drive.微软的OneDrive等,国内也有可以免费使用的各种云. 那么为什么想要搭建私有云存储呢?主要是本着“自己的 ...

  8. 使用Hadoop打造私有云盘之API操作

    项目介绍:使用hadoop实现云盘的增删读获取列表功能,hadoop不支持数据修改,特性是一次写入多次读取.主流的网盘也不支持该功能.今天我们用hdfs的FileSystem实现这些操作. 1.上传功 ...

  9. Nextcloud私有云盘在Centos7下的部署笔记

    搭建个人云存储一般会想到ownCloud,堪称是自建云存储服务的经典.而Nextcloud是ownCloud原开发团队打造的号称是“下一代”存储.初一看觉得“口气”不小,刚推出来就重新“定义”了Clo ...

随机推荐

  1. window 下相关命令

    1. 启动window服务(各种应用启动设置的地方)命令方式: 1). window 按钮(输入CMD的地方)处输入:services.msc ,然后执行.   // 输入命令正确,上面的待选框中会出 ...

  2. 异常来自HRESULT:0x80070422

    今天同事使用一个用VB.NET2008开发的应用程序时提示“出现了下列应用程序错误:无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动.(异常来自HRESULT:0x80070422)”   ...

  3. PHP搞笑注释代码-佛祖配美女

    //////////////////////////////////////////////////////////////////// // _ooOoo_ // // o8888888o // / ...

  4. [转][修]sprintf()函数:将格式化的数据写入字符串

    头文件:#include <stdio.h>功能:用于将格式化的数据写入字符串 原型:int sprintf(char *str, char * format [, argument, . ...

  5. [转]Python的getattr(),setattr(),delattr(),hasattr()

    getattr()函数是Python自省的核心函数,具体使用大体如下: 获取对象引用getattrGetattr用于返回一个对象属性,或者方法 class A: def __init__(self): ...

  6. xtu 1242 Yada Number 容斥原理

    Yada Number Problem Description: Every positive integer can be expressed by multiplication of prime ...

  7. install diagnostic_updater

    sudo apt-get install ros-kinetic-diagnostic-updater

  8. python 通过列表元素值截取列表并获取长度

    def count_range_in_list(li, min, max): ctr = for x in li: if min <= x <= max: ctr += return ct ...

  9. Builder(建造者)

    意图: 将一个复杂对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示. 适用性: 当创建复杂对象的算法应该独立于该对象的组成部分以及它们的装配方式时. 当构造过程必须允许被构造的对象有不同 ...

  10. XML_Qt_资料

    1.QXmlQuery Class _ Qt XML Patterns 5.7.html http://doc.qt.io/qt-5/qxmlquery.html ZC: evaluateTo(QAb ...