使用樹莓派制作一套“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; 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>  
   
 import urllib2,urllib,json  
   
 class Dns:  
     #Dnspod賬戶  
     _dnspod_user = ’你的賬戶’  
     #Dnspod密碼  
     _dnspod_pwd = ’你的密碼’  
     #Dnspod主域名,注意:是你注冊的域名  
     _domain = cb.e<strong style="color:black; background-color:#99ff99">-</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(roy@leadnt.com)’,  
                     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’,  
                     })  
             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 INFOcase "$1" in
start)
    echo -"Starting aria2c"
    sudo -u cubie aria2c --conf-path=/home/cubie/.aria2/aria2.conf -D 
    #sudo -u后面的是你正在使用的用戶名,因為我用的cubie,別忘記改成自己的;;
stop)
    echo -"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原創獎勵計划文章,未經許可禁止轉載

 

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM