天天看點

樹莓派實作NAS家庭伺服器(流媒體播放、檔案共享及下載下傳機)樹莓派實作NAS家庭伺服器(流媒體播放、檔案共享及下載下傳機)

1、流媒體播放服務:利用DLNA實作電視、手機、電腦播放其上面的媒體檔案。

2、檔案共享:利用samba實作手機、電腦等終端與伺服器的檔案共享。

3、自動下載下傳:利用aria2c實作自動下載下傳。

先上幾張效果圖:

用orico的包裝盒做了個機箱。

内部效果,線還是有些淩亂

放在桌上,感覺還不錯,呵呵

<a target="_blank"></a>

1、樹莓派B+

5、準備了一塊舊移動硬碟(80G)

6、準備了可外接供電的usb hub一個,樹莓派本身輸出電流較小,很難保證移動硬碟的運作,是以加了一個可外接供電的usb hub。

<a href="http://images.cnitblog.com/blog/383503/201410/260008466528635.png" target="_blank"></a>

1

root@raspberrypi:/home/pi# df -h

Filesystem Size Used Avail Use% Mounted on

rootfs 2.9G 2.4G 387M 87% /

/dev/root 2.9G 2.4G 387M 87% /

devtmpfs 183M 0 183M 0% /dev

tmpfs 38M 792K 37M 3% /run

tmpfs 5.0M 0 5.0M 0% /run/lock

tmpfs 75M 0 75M 0% /run/shm

/dev/mmcblk0p1 56M 9.7M 47M 18% /boot

/dev/sda1 70G 24M 67G 1% /media/nas

最後一行/dev/sda1說明硬碟已經挂載。為下一步安裝samba,将共享檔案夾設為/samba。于是建立檔案夾:

mkdir /samba

 設定通路權限:

shmod 777 /samba

 将硬碟挂載到/samba檔案夾,具體步驟:

umount /dev/sda1 #取消挂載

mount /dev/sda1 /samba

 這裡再檢視df -h,結果為:

<a href="http://images.cnitblog.com/blog/383503/201410/260008488711992.png" target="_blank"></a>

2

這裡表示已挂載成功。

      每次樹莓派重新開機或者硬碟插拔都需要對硬碟進行重新挂載,比較麻煩,是以需要自動挂載。這裡要修改/etc/fstab檔案。有人喜歡用vi進行編輯,我比較喜歡直接vnc連接配接上後,用編輯器進行編輯。

<a href="http://images.cnitblog.com/blog/383503/201410/260008499027575.png" target="_blank"></a>

image

可以看到,fstab檔案其實就是一個表格,表格各列的含意如下:

第一列:磁盤分區名/卷标,一般是/dev/sdaN(N表示正整數)

第二列:挂載點,我們在這裡把/dev/sda1挂到/samba上。

第三列:預設設定,一般用defautls。

第四列:是否備份:0——表示不做 dump 備份;1——表示要将整個 &lt;fie sysytem&gt; 裡的内容備份;2 也表示要做 dump 備份,但該分區的重要性比 1 小。

第五列:檢測順序:0——不進行檢測;根分區(/),必須填寫 1,其它的都不能填寫 1。如果有分區填寫大于 1 的話,則在檢查完根分區後,從小到大依次檢查下去。

具體填寫方法在圖中已注明。

更新一下源:

sudo apt-get update

安裝samba

sudo apt-get install samba samba-common-bin

安裝完成後,配置/etc/samba/smb.conf檔案

在其最後添加以下指令:

#================================================

[share] #共享檔案的名稱,将在網絡上以此名稱顯示

path = /samba #共享檔案的路徑

valid users = root pi #允許通路的使用者,這裡我用的是root 和 pi 兩個使用者

browseable = yes #允許浏覽

public = yes #共享開放

writable = yes #可寫

 儲存後,重新開機samba服務,輸入

/etc/init.d/samba restart

 最後添加共享使用者:

smbpasswd –a pi #這裡我用的pi。

 設定開機自啟動,編輯/etc/rc.loca,如下

<a href="http://images.cnitblog.com/blog/383503/201410/260008508081432.png" target="_blank"></a>

4

在windows計算機上,打開我的電腦,在左下角網絡點右鍵,選映射網絡驅動器

<a href="http://images.cnitblog.com/blog/383503/201410/260008524969117.png" target="_blank"></a>

點選完成會提示輸入使用者名和密碼,這裡輸入設定的共享使用者名和密碼。

<a href="http://images.cnitblog.com/blog/383503/201410/260008537152944.png" target="_blank"></a>

 最後在計算機下會出現共享的檔案夾,點開檔案夾,建立test.txt檔案進行一下測試,如果能正常建立,就說明ok了,如果不行,應該是權限問 題,可再重新設定一下/samba檔案夾權限。這裡注意,如果在/samba檔案夾下建立新的檔案夾,也需要設定權限,可以用vnc連接配接後,用管理者浏 覽,點右鍵設定檔案夾權限為read and write,也可以用chmod指令設定。

DLNA主要面向媒體資源(比如視訊、音樂)實作網内共享,具體步驟如下:

更新一下安裝源

 安裝minidlna

sudo apt-get install minidlna

設定/etc/minidlna.conf檔案,在檔案尾部添加如下内容:

#===================================================================================

media_dir=A,/samba/DLNA/Music #A表示這個目錄是存放音樂的,當minidlna讀到配置檔案時,它會自動加載這個目錄下的音樂檔案

media_dir=P,/samba/DLNA/Picture

media_dir=V,/samba/DLNA/Video

db_dir=/samba/DLNA/db #配置minidlna的數庫資料的存放目錄

log_dir=/samba/DLNA/log #配置日志目錄

#=======================================================================================

在/samba檔案夾下,建立以上檔案夾,并設定好權限為read and write。

/etc/init.d/minidlna restart

測試:

/etc/init.d/minidlna status

傳回如下結果為正常。

<a href="http://images.cnitblog.com/blog/383503/201410/260008541684573.png" target="_blank"></a>

先在樹莓派以上對應的video等檔案夾記憶體上一些檔案(可利用samba直接從電腦上考入),然後傳回到計算機進行操作。

點選我的電腦下面的網絡,出現媒體裝置

<a href="http://images.cnitblog.com/blog/383503/201410/260008547464230.png" target="_blank"></a>

輕按兩下進入媒體播放器,在左邊的清單欄下方其它媒體庫中出現raspberrypi:root,點選後,可選擇音樂,視訊等。

<a href="http://images.cnitblog.com/blog/383503/201410/260008553877399.png" target="_blank"></a>

這時輕按兩下就可以欣賞了。

手機上實作網絡共享,可安裝es file explorer軟體,在其網絡處進行設定,設定方法與電腦基本一樣,這裡不再詳述。設定後,檔案均可浏覽,媒體檔案輕按兩下可以線上播放。

也可以直接使用updp播放器,這裡我安裝的是moliplayer,可以在其附近裝置裡,直接找到raspberrypi:root,通路其媒體問題,注意,這裡是通路的DLNA共享,是以不需要再輸入密碼。

智能電視一般都是用的android系統,與手機基本一樣。

安裝aria2

sudo apt-get install aria2

在/etc目錄下建立aria2目錄用來存放配置檔案:

sudo mkdir /etc/aria2

建立空白的aria2.session檔案:

sudo touch /etc/aria2/aria2.session

建立配置檔案

sudo nano /etc/aria2/aria2.conf

在該檔案中輸入以下内容:

#=========檔案儲存目錄自行修改

dir=/samba

disable-ipv6=true

#打開rpc的目的是為了給web管理端用

enable-rpc=true

rpc-allow-origin-all=true

rpc-listen-all=true

#rpc-listen-port=6800

continue=true

input-file=/etc/aria2/aria2.session

save-session=/etc/aria2/aria2.session

max-concurrent-downloads=3

這裡為了友善共享,我直接設定将檔案下載下傳到samba共享檔案夾。

sudo aria2 –conf-path=/etc/aria2/aria2.conf

如果沒有提示任何錯誤資訊,那就按ctrl+c停止上面的語句,轉為背景運作:

sudo aria2 –conf-path=/etc/aria2/aria2.conf -D

同時其此句寫到開機啟動中,編輯/etc/rc.loca,如下

<a href="http://images.cnitblog.com/blog/383503/201410/260008562935957.png" target="_blank"></a>

3

        為了能web管理aria2進行下載下傳,需要安裝yaaw和appache環境。

安裝appach

sudo apt-get install appache2

修改/var/www的權限

chmod 777 /var/www

<a href="http://images.cnitblog.com/blog/383503/201410/260008578556212.png" target="_blank"></a>

這裡可以點add添加下載下傳任務,具體方法不再詳述。

在firefox裡添加一個書簽:

<a href="http://images.cnitblog.com/blog/383503/201410/260008587629068.png" target="_blank"></a>

具體為:

===========================================================

名稱為:ThunderLixianExporter

位址為:javascript:void((function(){var d=document;var s=d.createElement('script');s.src='http://s.binux.me/tle.js';s.id='TLE_script';d.body.appendChild(s)})())

==================================================================

 登入迅雷離線網站:lixian.xunlei.com,登入後,點一下書簽中的ThunderLixianExporter,然後點選迅雷頁面右上角的配置按鈕(小齒輪)。

<a href="http://images.cnitblog.com/blog/383503/201410/260009002467282.png" target="_blank"></a>

<a href="http://images.cnitblog.com/blog/383503/201410/260009011218382.png" target="_blank"></a>

<a href="http://images.cnitblog.com/blog/383503/201410/260009022624466.png" target="_blank"></a>

在上面的視窗中填寫aria2.json-RPC Path,這個值來自于yaaw那個頁面,具體方法是,輸入樹莓派IP顯示yaaw頁面,點選右上的配置圖示,如下圖

<a href="http://images.cnitblog.com/blog/383503/201410/260009032628293.png" target="_blank"></a>

在set頁面中存在該值:

<a href="http://images.cnitblog.com/blog/383503/201410/260009043242337.png" target="_blank"></a>

儲存好後,在離線頁面的每行記錄的取回本地後面會出現一個下拉菜單,選擇yaaw就會直接添加到yaaw任務中了。

<a href="http://images.cnitblog.com/blog/383503/201410/260009053082935.png" target="_blank"></a>

<a href="http://images.cnitblog.com/blog/383503/201410/260009061219521.png" target="_blank"></a>

到此,樹莓派的NAS伺服器搭建完成,試了一下效果,還是很滿意的。

        直接從家裡找了一個orico的包裝盒,大小正好合适,而且外殼比較硬,外觀也比較不錯。

        加裝一個1602顯示屏,目的是顯示時間和CPU溫度,當然也可以顯示其它内容,我這裡隻顯示了這兩項。這裡還需要加裝一個電位器(也就是可變電阻,如果沒有,可以加一個10K的電阻)

1602共16個端口,隻用其中12個,具體接法如下:

LCD1602液晶屏子產品提供了16個引腳,我們隻需接其中的12個即可:

VSS,接地

VDD,接5V電源

VO,液晶對比度調節,接電位器中間的引腳,電位器兩邊的引腳分别接5V和接地。

RS,寄存器選擇,接GPIO14

RW,讀寫選擇,接地,表示寫模式

EN,使能信号,接GPIO15

D0,資料位0,4位工作模式下不用,不接

D1,資料位1,4位工作模式下不用,不接

D2,資料位2,4位工作模式下不用,不接

D3,資料位3,4位工作模式下不用,不接

D4,資料位4,接GPIO17

D5,資料位5,接GPIO18

D6,資料位6,接GPIO27

D7,資料位7,接GPIO22

A,液晶屏背光+,接5V

K,液晶屏背光-,接地

注意:1、這裡的VSS、VDD等在有些1602的闆子上會标明,有些則隻标了數字,如一端寫着1,一端寫着16,1對應的就是VSS端,16對應的就是K端,是以依次連接配接就可以了。

        2、GPIO各端口及5V、接地等端口見下圖,因為我用的是B+的闆了,是以這裡的圖也是B+的端口圖。

        3、連接配接通電後,1602會亮起,其中一行為黑色方格,一行什麼也不顯示,如果全不顯示,可調節一下電位器

對于1602闆子的操作,已經有人做了一個示例,這樣用起來就比較簡單了。示例代碼下載下傳位址:https://github.com/lifanxi/rpimenu.git,解壓後有Adafruit_CharLCD.py檔案,此檔案在LCD上會顯示兩行字元:LCD 1602 Test, 123456789ABCDEF。這裡隻需要在此檔案上進行一下修改就可以了。

#!/usr/bin/python

#&lt;span style="font-family: 宋體; font-size: 12px;"&gt;轉載請注明:@小五義&lt;a href="http://www.cnblogs.com/xiaowuyi"&gt;http://www.cnblogs.com/xiaowuyi&lt;/a&gt; QQ群:64770604&lt;/span&gt;

#

# based on code from lrvick and LiquidCrystal

# lrvic - https://github.com/lrvick/raspi-hd44780/blob/master/hd44780.py

# LiquidCrystal - https://github.com/arduino/Arduino/blob/master/libraries/LiquidCrystal/LiquidCrystal.cpp

#from time import sleep

import time,os

class Adafruit_CharLCD:

# commands

LCD_CLEARDISPLAY = 0x01

LCD_RETURNHOME = 0x02

LCD_ENTRYMODESET = 0x04

LCD_DISPLAYCONTROL = 0x08

LCD_CURSORSHIFT = 0x10

LCD_FUNCTIONSET = 0x20

LCD_SETCGRAMADDR = 0x40

LCD_SETDDRAMADDR = 0x80

# flags for display entry mode

LCD_ENTRYRIGHT = 0x00

LCD_ENTRYLEFT = 0x02

LCD_ENTRYSHIFTINCREMENT = 0x01

LCD_ENTRYSHIFTDECREMENT = 0x00

# flags for display on/off control

LCD_DISPLAYON = 0x04

LCD_DISPLAYOFF = 0x00

LCD_CURSORON = 0x02

LCD_CURSOROFF = 0x00

LCD_BLINKON = 0x01

LCD_BLINKOFF = 0x00

# flags for display/cursor shift

LCD_DISPLAYMOVE = 0x08

LCD_CURSORMOVE = 0x00

LCD_MOVERIGHT = 0x04

LCD_MOVELEFT = 0x00

# flags for function set

LCD_8BITMODE = 0x10

LCD_4BITMODE = 0x00

LCD_2LINE = 0x08

LCD_1LINE = 0x00

LCD_5x10DOTS = 0x04

LCD_5x8DOTS = 0x00

def __init__(self, pin_rs=14, pin_e=15, pins_db=[17, 18, 27, 22], GPIO = None):

# Emulate the old behavior of using RPi.GPIO if we haven't been given

# an explicit GPIO interface to use

if not GPIO:

import RPi.GPIO as GPIO

GPIO.setwarnings(False)

self.GPIO = GPIO

self.pin_rs = pin_rs

self.pin_e = pin_e

self.pins_db = pins_db

self.GPIO.setmode(GPIO.BCM)

self.GPIO.setup(self.pin_e, GPIO.OUT)

self.GPIO.setup(self.pin_rs, GPIO.OUT)

for pin in self.pins_db:

self.GPIO.setup(pin, GPIO.OUT)

self.write4bits(0x33) # initialization

self.write4bits(0x32) # initialization

self.write4bits(0x28) # 2 line 5x7 matrix

self.write4bits(0x0C) # turn cursor off 0x0E to enable cursor

self.write4bits(0x06) # shift cursor right

self.displaycontrol = self.LCD_DISPLAYON | self.LCD_CURSOROFF | self.LCD_BLINKOFF

self.displayfunction = self.LCD_4BITMODE | self.LCD_1LINE | self.LCD_5x8DOTS

self.displayfunction |= self.LCD_2LINE

""" Initialize to default text direction (for romance languages) """

self.displaymode = self.LCD_ENTRYLEFT | self.LCD_ENTRYSHIFTDECREMENT

self.write4bits(self.LCD_ENTRYMODESET | self.displaymode) # set the entry mode

self.clear()

def begin(self, cols, lines):

if (lines &gt; 1):

self.numlines = lines

self.currline = 0

def home(self):

self.write4bits(self.LCD_RETURNHOME) # set cursor position to zero

self.delayMicroseconds(3000) # this command takes a long time!

def clear(self):

self.write4bits(self.LCD_CLEARDISPLAY) # command to clear display

self.delayMicroseconds(3000) # 3000 microsecond sleep, clearing the display takes a long time

def setCursor(self, col, row):

self.row_offsets = [ 0x00, 0x40, 0x14, 0x54 ]

if ( row &gt; self.numlines ):

row = self.numlines - 1 # we count rows starting w/0

self.write4bits(self.LCD_SETDDRAMADDR | (col + self.row_offsets[row]))

def noDisplay(self):

""" Turn the display off (quickly) """

self.displaycontrol &amp;= ~self.LCD_DISPLAYON

self.write4bits(self.LCD_DISPLAYCONTROL | self.displaycontrol)

def display(self):

""" Turn the display on (quickly) """

self.displaycontrol |= self.LCD_DISPLAYON

def noCursor(self):

""" Turns the underline cursor on/off """

self.displaycontrol &amp;= ~self.LCD_CURSORON

def cursor(self):

""" Cursor On """

self.displaycontrol |= self.LCD_CURSORON

def noBlink(self):

""" Turn on and off the blinking cursor """

self.displaycontrol &amp;= ~self.LCD_BLINKON

def DisplayLeft(self):

""" These commands scroll the display without changing the RAM """

self.write4bits(self.LCD_CURSORSHIFT | self.LCD_DISPLAYMOVE | self.LCD_MOVELEFT)

def scrollDisplayRight(self):

self.write4bits(self.LCD_CURSORSHIFT | self.LCD_DISPLAYMOVE | self.LCD_MOVERIGHT);

def leftToRight(self):

""" This is for text that flows Left to Right """

self.displaymode |= self.LCD_ENTRYLEFT

self.write4bits(self.LCD_ENTRYMODESET | self.displaymode);

def rightToLeft(self):

""" This is for text that flows Right to Left """

self.displaymode &amp;= ~self.LCD_ENTRYLEFT

self.write4bits(self.LCD_ENTRYMODESET | self.displaymode)

def autoscroll(self):

""" This will 'right justify' text from the cursor """

self.displaymode |= self.LCD_ENTRYSHIFTINCREMENT

def noAutoscroll(self):

""" This will 'left justify' text from the cursor """

self.displaymode &amp;= ~self.LCD_ENTRYSHIFTINCREMENT

def write4bits(self, bits, char_mode=False):

""" Send command to LCD """

self.delayMicroseconds(1000) # 1000 microsecond sleep

bits=bin(bits)[2:].zfill(8)

self.GPIO.output(self.pin_rs, char_mode)

self.GPIO.output(pin, False)

for i in range(4):

if bits[i] == "1":

self.GPIO.output(self.pins_db[::-1][i], True)

self.pulseEnable()

for i in range(4,8):

self.GPIO.output(self.pins_db[::-1][i-4], True)

def delayMicroseconds(self, microseconds):

seconds = microseconds / float(1000000) # divide microseconds by 1 million for seconds

time.sleep(seconds)

def pulseEnable(self):

self.GPIO.output(self.pin_e, False)

self.delayMicroseconds(1) # 1 microsecond pause - enable pulse must be &gt; 450ns

self.GPIO.output(self.pin_e, True)

self.delayMicroseconds(1) # commands need &gt; 37us to settle

def message(self, text):

""" Send string to LCD. Newline wraps to second line"""

for char in text:

if char == '\n':

self.write4bits(0xC0) # next line

else:

self.write4bits(ord(char),True)

if __name__ == '__main__':

while 1:

lcd = Adafruit_CharLCD()

lcd.clear()

cputemp=os.popen('vcgencmd measure_temp').readline()

sumcputemp=cputemp.replace("temp=","CPU:").replace("'C\n","")

lcdout=time.strftime('%Y-%m-%d %H:%M',time.localtime(time.time()))+"\n"+sumcputemp

lcd.message(lcdout)

time.sleep(30)

        将以上檔案命名為1602.py,儲存在/home/pi下面,修改/etc/rc.loca,添加上sudo python /home/pi/1602/py。樹莓派開機時,插上電源,當1602能正常顯示CPU溫度時,表示機器已經啟動完成,各項功能可正常使用。

(1)本想再加裝一個風扇用來散熱,結果手上沒有3.3V的風扇了,是以就沒加。感興趣的朋友可以自己加一下,因為樹莓派輸出為3.3V,是以最好是直接買3.3V的,如果買5V的,就一定要帶個3.3V的繼電器,要不沒法對風扇控制。如果風扇一直常開那就無所謂了,5V就可以,直接接正負級。我原 本的想法是CPU上了50度,風扇再運轉,這樣可以降溫,同時噪音也不會大。

(2)這個家庭伺服器搭建起來以後,後面還有很多文章可做,比如可以依托他建立家庭監控系統,裝上兩個攝像頭什麼的,也可以做一些外網通路的設定,這樣就可以直接從外網進行操作了。

原文釋出時間:2014-10-27

本文來自雲栖合作夥伴“linux中國”