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

原创作者:HackLiu

0×00 前言

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

0×01 NAS基础设施搭

材料:先要有Raspberry Pi/路由器/破电脑等能装Linux的设备,适当容量的移动硬盘或SATA硬盘;

原理:在运行Linux的设备上,挂载大容量硬盘,并利用Samba搭建NAS;

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

变身双向同步云盘

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

1.1 配置FTP服务

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

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

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

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

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

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

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

#!/usr/bin/env python
 #<strong style="color:black; -</strong>*<strong style="color:black; -</strong> coding:utf<strong style="color:black; -</strong>8 <strong style="color:black; -</strong>*<strong style="color:black; -</strong>  

 import urllib2,urllib,json  

 class Dns:
     #Dnspod账户
     _dnspod_user = ’你的账户’
     #Dnspod密码
     _dnspod_pwd = ’你的密码’
     #Dnspod主域名,注意:是你注册的域名
     _domain = ’cb.e<strong style="color:black; -</strong>fly.org’
     #子域名,如www,如果要使用根域名,用@
     _sub_domain = ’@’  

     def getMyIp(self):
         try:
             u = urllib2.urlopen(‘http://members.3322.org/dyndns/getip’)
             return u.read()
         except HTTPError as e:
             print e.read()
             return None;  

     def api_call(self,api,data):
         try:
             api = ’https://dnsapi.cn/’ + api
             data[‘login_email’] = self._dnspod_user
             data[‘login_password’] = self._dnspod_pwd
             data[‘format’] =‘json’
             data[‘lang’] =  ’cn’
             data[‘error_on_empty’] = ’no’  

             data = urllib.urlencode(data)
             req = urllib2.Request(api,data,
                 headers = {
                     ’UserAgent’ : ’LocalDomains/1.0.0([email protected])’,
                     ’Content<strong style="color:black; -</strong>Type’:’application/x<strong style="color:black; -</strong>www<strong style="color:black; -</strong>form<strong style="color:black; -</strong>urlencoded;text/html; charset=utf8’,
                     })
             res = urllib2.urlopen(req)
             html = res.read()
             results = json.loads(html)
             return results
         except Exception as e:
             print e  

     def main(self):
         ip = self.getMyIp()
         dinfo = self.api_call(‘domain.info’,{‘domain’ : self._domain})
         domainId = dinfo[‘domain’][‘id’]
         rs = self.api_call(‘record.list’,
             {
                 ’domain_id’: domainId,
                 ’offset’ :’0’,
                 ’length’ : ’1’,
                 ’sub_domain’ : self._sub_domain
             })  

         if rs[‘info’][‘record_total’] == 0:
             self.api_call(‘record.create’,
                 {
                     ’domain_id’ : domainId,
                     ’sub_domain’ : self._sub_domain,
                     ’record_type’ : ’A’,
                     ’record_line’ : ’默认’,
                     ’value’ : ip,
                     ’ttl’ : ’3600’
                 })
             print ’Success.’
         else:
             if rs[‘records’][0][‘value’].strip() != ip.strip():
                 self.api_call(‘record.modify’,
                 {
                     ’domain_id’ : domainId,
                     ’record_id’ : rs[‘records’][0][‘id’],
                     ’sub_domain’ : self._sub_domain,
                     ’record_type’ : ’A’,
                     ’record_line’ : ’默认’,
                     ’value’ : ip
                     })
             else:
                 print ’Success.’  

 if __name__ == ’__main__’:
     d = Dns();
     d.main()

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

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

1.3 安卓手机数据同步

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

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

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

第一步:添加服务器,点击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程序:

sudo apt-get install aria2 //安装Aria2

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

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

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

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

保存并执行以下命令:

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

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

sudo nano /etc/init.d/aria2c

粘贴内容如下:

#!/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 INFO
case "$1" in
start)
    echo -n "Starting aria2c"
    sudo -u cubie aria2c --conf-path=/home/cubie/.aria2/aria2.conf -D
    #sudo -u后面的是你正在使用的用户名,因为我用的cubie,别忘记改成自己的
;;
stop)
    echo -n "Shutting down aria2c "
    killall aria2c
;;
restart)
    killall aria2c
    sudo -u cubie aria2c --conf-path=/home/cubie/.aria2/aria2.conf -D
    #同上面的一样,根据自己的用户名改cubie;;
esac
exit

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

sudo chmod 755 /etc/init.d/aria2c

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

sudo service aria2c start

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

sudo update-rc.d aria2c defaults

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

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

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

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

2.2 配置迅雷离线下载

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

打开此链接,安装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原创奖励计划文章,未经许可禁止转载

时间: 2024-10-10 05:10:10

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

极客DIY:制作一个可以面部、自主规划路径及语音识别的无人机

引言 现在大部分无人机厂商都会为第三方开发者提供无人机API接口,让他们更容易地开发无人机飞行控制应用程序,让无人机想怎么玩就怎么玩.有的API接口可以帮助开发者开发基于Web版的APP.手机APP甚至是用Python编写的直接在无人机上运行的APP.经过我的研究和选择之后,我觉得选择Parrot AR.Drone2无人机,当然你可以购买全新的无人机,但这里考虑成本的问题,我觉得使用二手的无人机.Node.js是一个基于google v8+javascript的服务端编程框架.但是Node.js

极客DIY:廉价电视棒玩转GNSS-SDR,实现GPS实时定位

0×00 前言 GNSS是Global Navigation Satellite System的缩写.中文称作:全球卫星导航系统.全球导航卫星系统. GNSS泛指所有的卫星导航系统,包括全球的.区域的和增强的,如美国的GPS.俄罗斯的Glonass.欧洲的Galileo.中国的北斗卫星导航系统,以及相关的增强系统,如美国的WAAS(广域增强系统).欧洲的EGNOS(欧洲静地导航重叠系统)和日本的MSAS(多功能运输卫星增强系统)等,还涵盖在建和以后要建设的其他卫星导航系统. 0×01 摘要 本文

极客DIY:打造属于自己的无线移动渗透测试箱

本文中介绍的工具.技术带有一定的攻击性,请合理合法使用. 你想不想拥有一款属于自己的移动无线渗透测试箱,如果你感兴趣,下面介绍的设备将会对你很有帮助.这个箱子被称为“MiTM(中间人攻击)WiFi箱”,使用这个箱子可以完成一些无线审计工作,同时也可以伪造接入点并完成中间人攻击. 工具要求 如果你真的想要做这个箱子那么你需要如下工具: 5或6mm的钻木/金属钻头 开口扳手(规格8) 钳子 手术刀/裁纸刀 尼龙扎带(俗称:勒死狗) 箱子的选择 这里有些建议,你选中的箱子最好是用过一次以上,另外需要注

极客DIY:RFID飞贼打造一款远距离渗透利器

本文使用最新的渗透工具RFID飞贼(Tastic RFID Thief)和RFID感应破解技术来获取一些拥有安防的建筑物的访问权限. Tastic RFID Thief是一个无声远距离RFID读卡器,可不为人知地远距离盗取RFID信息,当不知情人员佩戴门禁卡或射频设备时,便会被它攻破.Tastic RFID Thief针对的是低频125KHz的射频系统,例如那些使用HID Prox或者Indala Prox的产品,不仅如此,你还可以利用它的电路板改造成一个13.56MHz的高频RFID读卡器,这

树莓派+seafile+nginx+ngrok实现私有云同步盘

环境: 树莓派型号:2b 树莓派系统:2015-05-05-raspbian-wheezy.img seafile版本:seafile-server_5.1.4_stable_pi.tar nginx版本:nginx1.10.3 vps:搬瓦工,centos6,双核cpu,1G内存,10G硬盘 ngrok服务端版本:1.7 操作用户:root 安装步骤: 1.挂载移动硬盘作为seafile数据的存储目录 #创建分区和格式化略过 mount /dev/sda1 /mnt/seafileData #

树莓派私有云盘搭建

使用balenaEtcher刻入树莓派最小的lite镜像 新建ssh空白文件 安装vim,更换清华镜像源https://mirror.tuna.tsinghua.edu.cn/help/raspbian/ 0x00 安装screen 血与泪:您的系统出现异常,win10... 简介:Screen是一款由GNU计划开发的用于命令行终端切换的自由软件. 作用:由于LNMP安装时间较长,一般需要45分钟:screen 能够让脚本在后台运行,即使断开与VPS的连接,使用命令:screen -r 就能恢复

树莓派学习笔记(5):成功实现NAS家庭服务器(流媒体播放、文件共享及下载机)

转载请注明:@小五义http://www.cnblogs.com/xiaowuyiQQ群:64770604 一.家庭服务器实现的主要功能 1.流媒体播放服务:利用DLNA实现电视.手机.电脑播放其上面的媒体文件. 2.文件共享:利用samba实现手机.电脑等终端与服务器的文件共享. 3.自动下载:利用aria2c实现自动下载. 先上几张效果图: 用orico的包装盒做了个机箱. 内部效果,线还是有些凌乱 放在桌上,感觉还不错,呵呵 二.准备工作 1.树莓派B+ 2.安装raspbian系统,具体

别小看树莓派 极客们玩出16个倍儿有趣的项目

别小看树莓派 极客们玩出16个倍儿有趣的项目 [摘要]极客和DIY爱好者使用树莓派进行无数小发明,其中一些项目非常有趣,比如机器人管家.高空拍照气球.傻瓜相机.复古游戏机等等. 腾讯数码讯(编译:Raul)新一代的树莓派体积更小.价格更低,可以利用的领域更多,因此它也成为了树莓派历史上最受欢迎的一代产品.而对于广大极客和DIY爱好者来说,如何好好的将树莓派利用一番,似乎也成为了非常有趣的项目.下面就让我们一起来看看在星球上都有哪些使用到树莓派的小发明让我们足够感兴趣. 1.定格相机 其实树莓派在

[web建站] 极客WEB大前端专家级开发工程师培训视频教程

极客WEB大前端专家级开发工程师培训视频教程  教程下载地址: http://www.fu83.cn/thread-355-1-1.html 课程目录:1.走进前端工程师的世界HTML51.HTML5与HTML4的区别2.HTML5新增的主体结构元素3.HTML5新增的的非主体结构元素 4.HTML5表单新增元素与属性5.HTML5表单新增元素与属性(续)6.HTML5改良的input元素的种类 7.HTML5增强的页面元素8.HTML5编辑API之Range对象(一)9.HTML5编辑API之