內容概要

撰寫本文的目的是為了將搭建過程中的各種瑣碎事項歸納整理,以便需要時查閱。文中以圖文形式儘可能詳細地將每一步操作記錄在案,故亦可供有類似需要的DIYer們參考。

本文內容包括:

  • NAS方案選擇
  • 硬體配置
  • Debian系統安裝及基本配置
  • NAS存儲硬碟配置
  • Samba服務配置
  • DLNA服務配置及音頻應用
  • 與UPS互連
  • 實用工具軟體介紹

NAS方案選擇

近幾年來NAS越來越被大家熟識,網上相關的軟硬體配置方案文章也層出不窮。結合自己的實際需求,從性能、功耗、價格、體積等方面權衡利弊深思熟慮之後,最終敲定了DIY硬體+Debian OS的方案。

主板選擇了目前市面上尺寸最小的ITX規格,機箱也是與之配套的ITX款,整機尺寸只有200*200*60mm,非常小巧。限於機箱空間,只配了一個3.5寸硬碟用於NAS存儲。得益於主板的節能設計,裝配完畢的NAS運行時功耗很低,只有16W左右。在性能上,配合千兆網路系統,文件的上下行傳輸速度都可穩定在110MBps左右(只針對大體積單文件,碎文件除外)。

硬體配置

主板

盈通玲瓏N3150(¥399)

Intel Celeron N3150低至6W的TDP,用來做NAS再合適不過了,況且這個U是2015年面世的新品,支持4K視頻硬解,無疑是個加分項。不過它只原生支持2個SATA3.0介面,想上多硬碟組RAID的話是行不通了(不要妄想PCIE擴展卡,限於ITX尺寸,這個主板不帶PCIE插槽),好在我目前並沒有組RAID的打算,一是數據量不是很大,二是預算有限,單硬碟也有單硬碟的好處,省電好管理。

內存

ELPIDA DDR3L 1600 4GB(¥149)

系統硬碟

Intel 525 mSATA SSD 30GB(¥99)

拿它來安裝OS。其實不帶桌面UI的Linux系統都很苗條,我這套系統在一切都配置妥當後,只用了將近2GB的硬碟空間。考慮到預留的swap分區以及OS佔用空間的正常增長,其實一個8GB的SSD足夠勝任。

當然還有一個方案,就是外接一個U盤安裝系統,這樣可以騰出僅有的2個SATA介面來掛硬碟。不過在我看來,這樣的外科手術破壞美感,況且我選用的機箱也沒有多餘的空間容納第二塊3.5寸硬碟,故此方案作罷。

在SSD的選擇上,要避開一些山寨品牌,比如地雷遍布的「三金一雲」,否則一旦哪天人品拼不過就會觸雷翻車。全球存儲顆粒的產量就那麼點兒,山寨廠為了又保證產量又打好價格戰而普遍採用黑顆粒或二手顆粒已經是業內不算秘密的秘密了。

NAS存儲硬碟

HGST DeskStar NAS 4TB(¥899)

不得不承認,在NAS硬碟領域,西數的4T紅盤很有人氣,但是它的實際性能貌似和居高不下的人氣不成正比。相較之下,反而一直比較低調的HGST(原日立)在圈裡口碑不錯,再加上自己之前用過很多日立/東芝系的2.5寸、3.5寸、移動硬碟產品,印象頗佳,於是就選用了這款硬碟。

機箱

立人 E-H60(¥169)

全鋁結構,做工也還算說得過去,關鍵是它專為ITX主板設計,小巧的體積讓它顯得很Q,裝飾效果也強。

不過魚與熊掌不可兼得,追求小體積的同時帶來的副作用是它只能容納1塊3.5寸硬碟(或2塊2.5寸硬碟,鑒於2.5寸硬碟的速度和容量,用來做NAS存儲盤是不適合的),這也是我為什麼沒有選擇組RAID的一個原因。

電源

LITEON 12V 5A電源適配器(¥19)

N3150主板節能這一天生優點,決定了它只需要使用12V外接電源適配器供電即可正常工作。


施工完成前的全家照:

消耗功率實測值(推送DLNA音頻時):

此外不得不提的一點是,用於組網的路由器、交換機等網路設備必須是千兆網口,網線也最好用六類的,這樣才可以保證穩定而高速的傳輸,對於如今動不動數GB甚至數十GB的文件來說,這是非常必要的,否則慢如蝸牛的傳輸速度絕對會讓人抓狂的。

Debian系統安裝

Debian是Linux大家族的一員,目前最新的版本是9.4版的「Stretch」,到下面的網頁下載鏡像文件(推薦64位的):

Debian -- Getting Debian?

www.debian.org

找一個U盤,將下載好的ISO文件燒寫到裡面。注意傳統的工具例如UltraISO等燒寫的U盤不能正常啟動,這裡推薦一款名叫Rufus的燒寫工具,體積小巧,界面簡潔。如圖所示,選擇好燒寫的目標設備以及待燒寫的ISO文件後,點擊「開始」即可。

用這個U盤啟動計算機後,開始進入Debian的安裝環節,整個過程中人機交互的內容比較多,下面用圖文的形式一步步予以說明(為了截圖方便,以下的安裝在VMware虛擬機中進行,實際的安裝過程與此無異)。需要注意的一點是安裝過程中會通過網路下載一些必要的安裝包,故需要連網進行。

啟動後的界面中選擇「Graphical install」:

系統語言推薦選擇英文,雖然有中文選項,但是支持的並不完整:

地區選擇「China」:

地區配置中選擇「Hong Kong」(因為沒有帝都選項...):

鍵盤配置用默認的美式即可:

網路中的主機名,NAS主機將以這個名字顯示在網路中:

域名留空:

接下來是設置超級用戶密碼,這個很重要,要認真設置並準確無誤地記下來(rm指令:我發起瘋來連OS自己都刪):

除了默認的root用戶,再建立一個來賓用戶,用於一般的訪問,這裡取名為「guest」:

設置guest用戶的密碼:

接下來是系統盤分區。大體的思路是這樣的,整個SSD分兩個區,一個swap分區用於系統緩存,大小一般設置為與物理內存容量一致;剩下的空間分成ext4分區用於安裝OS。

分區方式選擇界面,選擇手動「Manual」:

按圖索驥,根據容量找到SSD(為了逼真,VMware中的虛擬硬碟我也設置成了30G,然而還是有些偏差,冏),一般來說對應的設備為sda,選中它,點擊「Continue」(或雙擊該項):

選「Yes」,Continue:

選中設備sda的子項「FREE SPACE」並雙擊它,在接下來的界面中選擇「Automatically partition the free space」(也可以選擇「Create a new partiton」來手動分區)並雙擊,在接下來的界面中選擇「All files in one partiton」,然後Continue:

之後又來到了先前的界面,不過可以發現此時分區已經分好了。雙擊「Finish partitioning and write changes to disk」並在接下來的界面中選擇「Yes」,至此分區完成。

需要說明的是,自動分區模式雖然方便,但是會把系統的交換分區(下圖中的「swap」區)設置為邏輯分區,對於有強迫症的人來說這是難於忍受的,治療方案是採用手動分區模式將其同樣劃分為主分區。

接下來是配置網路安裝源,用於下載必要的Debian組件。原則上是選擇速度較快的源,在國內一般按如下形式選擇:

HTTP代理留空:

待安裝的系統組件與系統服務選擇,對於NAS而言,只需要選中最後的「SSH server」與「standard system utilities」即可:

GRUB是Linux系統啟動的引導程序,選「Yes」,然後Continue:

將GRUB安裝到哪個硬碟設備,這裡選擇預定用來安裝OS的SSD,也就是/dev/sda(我的VMware里只分配了這一個虛擬硬碟,所以這裡只顯示了一項。實際安裝中,因為還連接了NAS存儲硬碟,所以會顯示為兩項,這時千萬不要選錯了。可以根據之前分區時系統分配的字母序號來區分,分區時用的sda,這裡就選/dev/sda;依此類推,sdb的話,這裡就選/dev/sdb):

大功告成,拔下U盤,重啟,迎接即將到來的激動時刻吧:

嗯,重啟後是這樣的,果然令人無比激(zhua)動(kuang)啊:

嘛,Linux就是這一點比較不平易近人,不過習慣就好,習慣就好。


這裡插敘一段內容,對於採用了Realtek系列網卡晶元的主板(比如我這塊N3150)來說,啟動後可能會有類似如下內容的錯誤提示:

firmware: failed to load rtl_nic/rt8168e-3.fw (-2)

產生這個錯誤的原因是系統缺失了Realtek網卡的驅動固件,解決方法是將固件倉庫地址添加進/etc/apt/sources.list中,然後用apt-get安裝即可,具體步驟如下:

在/etc/apt/sources.list中添加如下內容:

#realtek firmware
deb http://ftp.de.debian.org/debian stretch main non-free
deb-src http://ftp.de.debian.org/debian stretch main non-free

安裝Realtek firmware:

apt-get update
apt-get install firmware-realtek


Debian基本設置

用之前設置好的root密碼登錄後,需要做一系列基本的安裝及設置。

1、安裝工具軟體

首先是安裝一些必要的工具軟體。安裝用指令「apt-get install 軟體名」實現。

  • vimLinux系統常用的文本編輯工具,以它簡(fu)單(za)易(bian)用(tai)的特點而著稱,進行一些日常的系統文件配置全靠它了。不過不得不承認的一點是,對於初心者而言,vim並不很容易上手,所以還有另一個選擇——nano,它是Debian自帶的文本編輯器,可以根據自己實際情況進行取捨。
  • Net ToolsDebian默認是不支持諸如ifconfig、arp等一些常用的網路命令的,安裝好這個工具就OK了。
  • Samba實現SMB協議的文件共享服務,在Windows系統里訪問NAS就是通過它來實現的。這裡先把它安裝上,具體的配置後面詳述。
  • miniDLNALinux上實現DLNA協議的工具,可以實現向其他網路設備的音頻、視頻、圖片的推送,嗯,比如耳熟能詳的各種盒子。同樣這裡先安裝上它,具體配置後面詳述。

以上各工具的安裝指令羅列如下:

apt-get install vim
apt-get install net-tools
apt-get install samba
apt-get install minidlna

此外,要定期的更新下Debian上的各種軟體,這要用到下面的指令:

apt-get update
apt-get upgrade

這兩條指令常一起使用,前一條是用來更新本地的apt cache,後一條是更新所有軟體。

2、配置網路

其次是進行網路的配置,主要是設置成固定IP,這一點對於NAS來說是至關重要的,否則可能會時不時的出現一些莫名其妙的問題。

用前面剛裝好的vim打開/etc/network/interfaces,注釋掉「iface ens33 inet dhcp」(注意這裡的ens33並不固定,不同的計算機會對應不同的字元)並在後面加上如下的幾行:

iface ens33 inet static
address 192.168.x.x (固定IP地址)
netmask 255.255.255.0 (掩碼,一般都設置成這樣)
gateway 192.168.x.1 (路由器IP地址)

其中的x視實際的網路情況而定,比如我用的.2網段,設置好後是這樣的:

完成之後需要重啟系統以使設置生效。

除此之外,最好在路由器中同時設置靜態地址,因為如果路由器為其他設備動態分配的IP地址恰好也是這個固定IP的話,會引起衝突,造成NAS無法訪問(當然這種情況發生的前提是這個固定IP地址在路由器的DHCP池中,而我的路由器正是這種情況)。設置方法是將NAS網卡的MAC地址與固定IP地址在路由器中進行綁定,以我的路由器EdgeRouter X為例,設置如下:

首先鍵入指令「ifconfig」,從顯示的信息中找到NAS網卡的MAC地址(下圖藍框):

然後在路由器靜態MAC/IP綁定頁面新建一個條目,把MAC和IP地址填好,保存即可:

3、配置SSH

最後是配置SSH。SSH是遠程登錄的服務,可以理解成命令行界面的Windows中的遠程桌面。配置好後就可以隨便用一台連網的設備通過SSH來訪問NAS了。

用vim打開/etc/ssh/sshd_config,將「PasswordAuthentication yes」這一行的注釋取消,如下圖:

這樣一來就可以用root以外的用戶登錄NAS了。如果對安全性有足夠的信心,也可以允許root用戶登錄,方法是將「PermitRootLogin prohibit-password」這一行注釋掉,並在下面新加一行:

PermitRootLogin yes

保存後重啟下SSH服務:

systemctl restart ssh

至此SSH服務配置完畢,現在可以將NAS上連接的顯示器、鍵盤等統統拔下,只保留電源線及網線,並將NAS放置到專用位置,以後可以在網路中任意設備上用支持SSH協議的工具訪問NAS了。

下面以常用的PuTTY為例演示如下:

例行的下載安裝後,啟動PuTTY。Host Name中輸入NAS的IP地址,Connection type選「SSH」,然後點「Open」即可啟動命令行界面,之後的操作跟之前在NAS上直接操作時相比無異。

NAS存儲硬碟配置

雖然不組RAID,雖然只有1塊硬碟,但是必要的分區、格式化、掛載等操作還是要做的。

對於4T的大硬碟,建議分成2個容量等同的分區,以便在發生異常比如其中一個分區崩潰時互相恢複數據用。關於文件系統,因為是Debian屬於Linux系統,故選用嫡系的ext4是毫無疑問的,對於用慣了Windows的NTFS的人而言,不能因為對於習慣的依賴以及對於新事物的畏懼而因循守舊,否則後患無窮,我就是一個活生生的例子。起初我就沿用了NTFS文件系統,結果發現不管怎麼用chmod設置,各個文件(夾)的許可權都是777,以至於Linux上與安全性息息相關的許可權系統淪為了徹頭徹尾的擺設。其實仔細想想就不難理解,ext4分區上有特有的用於記錄許可權的inode,而NTFS分區上顯然沒有,於是Linux只好一視同仁的都認為是777了。這還不算,更悲劇的是由於Debian對於NTFS的兼容問題,寫入速度只有捉襟見肘的30MBps左右。這兩個問題單獨拿哪一個出來都足以讓人捨棄NTFS而轉投ext4的懷抱了。

下面一步一步地說明分區、格式化及掛載的操作方法(寫這篇文章的時候已是這之後數日,數據寶貴,不敢冒險,故以下操作均是在VMware中進行,實際的操作與此無異,虛擬機里待操作的是一塊4GB的硬碟)。

1、分區

首先用「fdisk -l」指令列出機器上連接的硬碟:

從顯示的信息中得知待分區的硬碟是/dev/sdb,下面對它開刀。輸入指令:

fdisk /dev/sdb

進入分區操作模式。

接下來要做的是選擇分區表類型。默認的是DOS分區表,這是傳統的分區表形式,其分區有兩種:主分區與擴展分區。每個磁碟最多支持4個主分區;擴展分區可選,但最多只能有1個,其上可以再細分成數個邏輯分區。DOS分區表畢竟歷史悠久了,受制於自身的數據結構限制,它最大只能支持到2TB的磁碟容量,對於現今的大容量倉庫盤已經無能為力了。自然而然地,GPT分區表也就應運而生了,它最大可支持到128EB的磁碟容量且分區數沒有上限。

一個合理的方案是用於安裝系統的SSD採用DOS分區表(實際上也的確如此,在之前安裝系統時系統默認會設置為DOS分區表),用於NAS數據存儲的硬碟採用GPT分區表。對於fdisk工具來說,因為GPT分區表不是默認的,所以需要在提示符後鍵入「g」,表示採用GPT分區表(用於演示的虛擬硬碟因為只有4GB,所以仍然採用了DOS分區表)。

這之後在提示符後鍵入「n」,表示新增一個分區,然後在與控制台的交互中依次選擇:

  • 分區類型(只針對DOS分區表,若為GPT分區表則不包含此步)待分的兩個分區都指定為主分區(鍵入「p」)即可。
  • 分區號系統用來區分各個分區的序號,將來會附加在sdb後面以便於對各個分區進行訪問。這裡選擇「1」,將來這個分區即成為/dev/sdb1。
  • 起始扇區用默認的2048即可,直接回車。
  • 結束扇區每個扇區為512位元組,第一個主分區打算分2GB的空間,再加上前面2048的扇區偏移,計算出來是4196352,鍵入之;也可直接輸入分區的大小,比如2GB就輸入「2G」,然後回車。

完畢後第一個分區就分好了,如下圖:

第二個分區如法炮製,注意分區號指定為「2」,起始和結束扇區用默認值即可。

分完後在提示符後鍵入「w」,含義是將分區表寫入硬碟,至此分區過程結束。

2、格式化

接下來是格式化操作,用指令「mkfs.ext4 待格式化分區路徑」實現,注意分區千萬不要錯寫成系統盤了,NAS數據硬碟是sdb,所以指令要寫成:

mkfs.ext4 /dev/sdb1
mkfs.ext4 /dev/sdb2

這表示分別把sdb1與sdb2格式化成ext4文件系統,短暫等待後格式化操作完成,同時會顯示出格式好的分區信息,注意其中UUID後面的一長串數字字母組合,後面會用到:

3、掛載

最後是分區的掛載,Linux下只有將硬碟分區掛載後才可以訪問。在/mnt下新建兩個目錄,分別將兩個分區掛載到這兩個目錄下:

mkdir /mnt/library_a
mkdir /mnt/library_b
mount /dev/sdb1 /mnt/library_a
mount /dev/sdb2 /mnt/library_b

但總不能每次啟動系統後都手動掛載一次,所以需要設定為自動掛載,方法是修改文件/etc/fstab,用vim打開這個文件,按下圖加入相應的語句:

其中用來標識硬碟分區的方法有兩種,一是像圖中這樣用UUID表示,這個UUID就是之前提到的格式完畢後顯示出的那長串數字字母組合(也可通過指令「blkid /dev/sdb1」來顯示sdb1的UUID,sdb2的依此類推),它相當於硬碟分區的「身份證」,可以作為這個分區的唯一標識;另一種是直接用設備名「/dev/sdb1」來表示,不推薦。

至此NAS存儲硬碟的配置完成。

Samba服務配置

Samba服務是NAS最基本的功能之一,它可以實現文件的共享,配置好之後就可以用Windows來訪問NAS上的文件了。

Samba的配置涉及的概念比較多,過程也較為複雜,為了捋清思路,先交代下有關文件許可權的規定。

在Linux中,把能夠操作文件(夾)的對象劃分成了3類,分別為所有者、所屬組及其他人,每一類對象又分別規定了是否可以進行以下3種操作:讀(r)、寫(w)、執行(x)。例如,在我的NAS上輸入「ls -l /etc/samba」後,會顯示如下信息:

拿第3行信息(圖中的第5行)來說,第1列給出了3類操作對象的讀寫許可權(最前面的字母「d」表示這是個文件夾),第3列的「root」是這個文件夾的所有者,第4列的「root」是這個文件夾的所屬組。把這些信息結合到一起我們可以得知,對tls這個文件夾來說,所有者root擁有完全的許可權,所屬組root可讀可執行但不可寫,其他人也是可讀可執行但不可寫。

然後再來說說Samba的許可權。Samba服務的訪問是基於用戶的,就是說需要用戶登錄後才能對共享目錄進行相關的訪問。同Linux相仿,它也為每個共享目錄指定了用戶,並對每一個用戶分別賦予了讀寫許可權,許可權不足的話是不能對目錄進行相應的訪問的。

現在我們看到,算上Linux系統自帶的以及Samba所擁有的,訪問共享目錄需要涉及兩套許可權系統。一個用戶,只有同時滿足了這兩套許可權,才能對某個目錄進行訪問。例如,Samba中設定了用戶U可以對目錄D進行讀寫操作,但Linux系統中的設定是用戶U只能對目錄D進行讀操作,那麼用戶U在網路中通過Samba共享訪問目錄D時,只能進行讀操作,寫操作是被拒絕的。

明確了以上的這一系列許可權關係,自然就有了Samba服務配置的大體思路。

/mnt/library_a下掛載的是整個分區,上面有Debian系統專用的目錄,因而不適合整個拿來作為共享目錄之用,而是需要新建一個子文件夾作為共享根目錄。之前安裝系統時建立的用戶「guest」是用來作為一般的登錄用的,本著涇渭分明的原則,用於訪問Samba服務的用戶應當另行建立。在初期,至少需要建立一個擁有最高許可權的管理員用戶以及一個來賓用戶才能滿足基本的訪問需求。考慮到用戶不止一個,可以新建一個專門用來訪問NAS的用戶組,把這些用戶都添加到這個組內。在許可權的設定上,為了體現邏輯清晰以及避免設定混亂,姑且把共享根目錄的許可權設置為777,來訪用戶的讀寫許可權則完全通過Samba來設定;若是出於更高的安全性的考慮,則把共享根目錄的許可權設置為755,所有者為NAS管理員用戶,所屬組為NAS用戶組,組內成員的具體讀寫許可權通過Samba再設定一次。這裡採用後者的方案,具體的操作如下。

(1)

新建NAS用戶組「nasusers」:

groupadd nasusers

新建用戶「nasadmin」(管理員)以及「nasguest」(來賓),設定他們的密碼,並將他們都加入到nasusers組中:

useradd -g nasusers -s /usr/sbin/nologin -M nasadmin
passwd nasadmin
useradd -g nasusers -s /usr/sbin/nologin -M nasguest
passwd nasguest

(2)

在兩個掛載的目錄下分別建立用於共享的根目錄,不妨都命名為「nasshare」(如果沒有用「umask」修改過許可權掩碼,那麼建立後它們的許可權應該就是755),然後設定它們的所有者為nasadmin,所屬組為nasusers:

mkdir /mnt/library_a/nasshare
chown -R nasadmin:nasusers /mnt/library_a/nasshare
mkdir /mnt/library_b/nasshare
chown -R nasadmin:nasusers /mnt/library_b/nasshare

(3)

將用戶nasadmin和nasguest都添加到Samba中並設置登錄密碼(這個密碼是遠程訪問共享目錄時登錄用的,由Samba管理和使用,不是Debian系統的用戶密碼,不要搞混淆了):

smbpasswd -a nasadmin
smbpasswd -a nasguest

(4)

用vim打開/etc/samba/smb.conf進行必要的配置:

  • 設置可以訪問的主機IP地址列表找到「hosts allow」項,根據內網實際情況進行設定,多個IP地址間用逗號隔開。比如我設定成了「hosts allow = 192.168.2.」,這表示允許192.168.2.2~255的IP訪問。
  • 禁止Samba默認的共享最初的smb.conf文件開啟了一系列的共享,這些都不是NAS共享需要的,找到「[homes]」、「[printers]」、「[print$]」節,將其連同其下的子項一起注釋掉。
  • 配置NAS共享目錄按照下圖在文件的末尾增加數行內容:

原則上是一個共享目錄對應文件中由「[ ]」標識的一節,下面以圖中的「[NAS-CLOUD-A]」節為例進行說明。

  • comment這個共享目錄的注釋。
  • path共享目錄的路徑。
  • browseable此目錄是否可以顯示在客戶機中。
  • guest ok(同義項public)不屬於Samba的用戶(來賓)是否可以訪問此共享目錄。
  • writeable(同義項read only)該共享目錄是否可寫。此項省略時認為不可寫(即只讀,因為只要能訪問,至少目錄是可讀的)。當此項設置為「yes」時,可以用「read list」列出例外(即只讀)的用戶;當此項設置為「no」時,可以用「write list」列出例外(即可寫)的用戶。
  • create mask(同義項create mode)規定新建文件的許可權掩碼,格式上與Linux系統許可權的定義一致。例如「0640」表示所有者可讀寫,所屬組可讀,其他人什麼也不能幹。
  • directory mask(同義項directory mode)規定新建文件夾的許可權掩碼,格式上與Linux系統許可權的定義一致。例如「0750」表示所有者可讀寫及執行,所屬組可讀及執行,其他人什麼也不能幹。
  • valid users能夠訪問該共享目錄的用戶(組),為用戶組時前面加「@」號,多個用戶(組)之間用逗號隔開。
  • write list擁有對共享目錄寫操作的用戶(組),值的格式與valid users的相同。
  • read list擁有對共享目錄只讀操作的用戶(組),值的格式與valid users的相同。
  • vfs objects及以下數行在客戶端執行刪除操作時,不是將文件立即徹底刪除,而是移動到一個臨時目錄中,便於以後需要的時候予以恢復。關於各項的含義,可以參考下面的網頁:

Samba VFS recycle bin?

manpages.ubuntu.com

編輯完成後保存退出,至此整個Samba服務的配置完畢。為了使配置生效,將Samba服務重啟一下:

systemctl restart smbd

接下來就是真正激動人心的時刻了(這次沒有坑,放心)。在任意一台連網的Windows電腦上找到NAS的共享,點擊它,輸入用戶名和密碼,哇,進去了,素晴らしい!

這之後就可以像訪問本地分區一樣操作這兩個目錄了,方便起見,可以把它們映射為本地磁碟。以下是傳送一個900MB+的單個文件時的實測速度:


這裡插敘一段內容,對於Windows10而言,默認SMB協議是未啟用的,需要像下圖那樣啟動後才可以訪問到共享目錄。


DLNA服務配置

作為家用NAS,可以說大部分場合下扮演著媒體伺服器的角色,DLNA就是為了分享多媒體資源而生的,在這方面,比起簡單的目錄共享,它有著更多得天獨厚的優勢。

針對Debian系統的DLNA服務,常用的是miniDLNA,前面已經將它安裝好了,下面介紹它的配置方法。

首先是許可權的設置。不管怎麼說,待推送的文件顯然位於我們之前設置好的共享目錄下(如果你打算不厭其煩地把它們放到這個目錄以外的話,當我沒說),回憶一下這個目錄的許可權、所有者和所屬組都是什麼。當初把它的許可權設定成了755,之後Samba中又設定了許可權掩碼為750和640,所以其下的所有子文件夾的許可權為750,所有子文件的許可權為640;另一方面,它的所有者是nasadmin,所屬組是nasusers,又因為當時設定時用了「-R」遞歸,故其下的所有子文件夾和子文件都具有同樣的所有者和所屬組。miniDLNA服務在訪問文件時用的是「minidlna」這個用戶的身份,他屬於「minidlna」這個用戶組,那麼問題來了,miniDLNA服務是不具備訪問共享目錄下的文件的許可權的。怎麼辦呢?答案是將用戶「minidlna」添加到「nasusers」組中:

usermod -a -G nasusers minidlna

這樣一來miniDLNA服務就具備了讀取許可權了。

接下來用vim打開/etc/minidlna.conf,進行如下幾項的配置:

  • friendly_name設置DLNA服務的網路名稱,將來這個名稱會出現在客戶設備的DLNA服務列表中。這裡設置為「NAS DLNA」。
  • media_dir媒體文件目錄,打算共享給其他媒體設備的文件位於這個目錄中。可以用以下字母限定媒體文件的類型(後面需要跟一個逗號),限定以後將會無視這種類型以外的媒體文件:A - 音頻文件P - 圖片文件V - 視頻文件每次只能定義一個目錄,如果打算共享的目錄有多個,那麼就一行一行地添加。

作為演示,我添加了一個音頻目錄和一個圖片目錄,如下圖:

保存退出後需要強制重載下miniDLNA服務,這樣它才能搜到新追加的媒體文件:

systemctl force-reload minidlna

為了確認是不是真的已經更新了媒體資源,可以在網路中的任一瀏覽器上訪問地址「NAS IP:8200」,成功的話頁面中會列出媒體庫中的媒體數量,如下圖:

至此DLNA服務的配置完成。關於它的應用,可以說是相當豐富多彩,我平時喜歡聽音樂,所以下面打算從音頻應用這個角度談一下。

DLNA音頻應用

先用一張圖來說明DLNA音頻應用的組網思路:

開通DLNA服務後,只要連接到網路中的音頻播放設備支持DLNA協議,就可以播放DLNA伺服器中的共享資源。將播放設備連接到網路中的可以是網線,也可以是無線Wifi,也就是說輕量級的桌面播放設備可以零連線播放,比如小米AI音箱:

此外還有相對高大上些的有源音箱產品,比如漫步者S1000MA:

不過上面這些產品受制於體積與成本,都採用的是D類數字功放晶元,聲音還原雖然精準,但是聽感生硬,缺乏音樂味,聽音時間稍長容易有「累」的感覺;此外功率也不夠大,推不動低音單元6寸以上的落地式音箱。所以對於真正的音樂發燒友來說,更傾向於選擇一台支持Wifi DLNA的功放,然後另配一套落地式音箱,比如雅馬哈R-N402:

以上走馬觀花地把市場上DLNA播放設備的幾個類型基本都盤點了一遍,當然還有未涵蓋的方面,比如頗受發燒友青睞的「Wifi模塊+DAC解碼器+電子管功放」的組合式方案。

在播放的控制方面,用傳統的遙控器上一曲下一曲地按來按去的操作已經過時了,這個時候該輪到安卓觸屏手機上場大展拳腳了。就像在KTV K歌時在觸屏上選曲及播放控制時的爽快體驗一樣,只要在安卓手機上裝一個App,就可以用手機完成選曲、播放控制等一系列操作了,如果嫌手機的屏幕小,可以選用觸屏平板電腦來控制。

安卓手機上的DLNA控制軟體首推BubbleUPnP這款App,功能強大又不失專業,同時還可作為播放器用手機直接播放DLNA伺服器上的音視頻和圖片資源,可謂是全能型選手。

安裝好啟動後,向右劃屏,出現設備及媒體庫選擇界面:

在「RENDERER」中選擇DLNA播放設備(之前需要先將其連網),接著在「LIBRARY」中選擇DLNA服務,即圖中的「NAS DLNA」,這個字串就是之前在DLNA服務配置時friendly_name項後面輸入的值。然後點擊「Media」展開媒體列表,第一項「Browse Folders」下包含了所有的DLNA共享目錄,下面的三項分別按音頻、圖片、視頻將DLNA共享目錄歸類,點擊「Music」,然後左劃屏,切換到「LIBRARY」頁。

LIBRARY頁里列出了所有共享的音頻資源,長按選中待播放的曲目,點擊屏幕右上方的「+」將其加入播放列表,然後其會顯示在「PLAYLIST」頁中,切換到該頁後點擊該項就可開始播放了。

在「NOW PLAYING」頁中,除了常用的播放控制項外,快速上下滑動屏幕可以調節音量(需要在設置中使能此功能),單擊屏幕可以顯示曲目信息,如下圖:

關於音頻文件格式,這裡想多說幾句。作為欣賞之用,首推無損格式的,比如WAV、FLAC、TTA等,至於刻意追求SONY的Hi-Res標準並沒有多大必要,因為這其中包含了過多華而不實的商業噱頭,與傳統的CD標準的音頻比起來,Hi-Res規格的音頻在聽感上並沒有多少質的不同。在幾種無損音頻格式中,推薦FLAC格式的,因為這是一種越來越佔據主流地位的格式,其曲目信息的字元也採用了UTF-8這一變位元組的編碼形式,UTF-8本來就是因網路而生,所以在網路應用方面有著得天獨厚的良好兼容性。比如,上圖的曲目信息,如果是WAV格式的文件,在BubbleUPnP中會顯示成亂碼,這是因為WAV文件的曲目信息用的是ANSI編碼,不僅一些特殊符號無法顯示,還會因兼容問題而出現亂碼。

順手放上一張BubbleUPnP顯示的DLNA共享目錄里的圖片^_^:

DLNA只是一種網路協議,其數據傳輸依託的載體是有線或Wifi網路,所以只要網速足夠,理論上可以實時傳送任何高音質的音頻。以SONY推出的Hi-Res音頻標準為例,典型的音源是24bit/96kHz的,換算出的碼率為4.6Mbps,千兆的網路應付它是綽綽有餘的。

與UPS互連

突然的斷電對於NAS來說害處很大,不僅會使傳輸中的數據丟失,還會縮短機械硬碟的壽命,導致SSD固件損壞而變磚。雖說現在電網很穩定,但我們這裡三伏天時還是有因過負荷而跳閘斷電的情況,所以給NAS配一台可靠的UPS的做法是十分必要的。

在產品的選擇上,除了可靠性以外,我還希望其能實現斷電時無人值守情況下的自動關機功能,挑來選去最終入手的是APC旗下的一款UPS產品——BX650CI。

這款UPS可以在市電斷電時提供無間斷的390W功率輸出,並且帶有USB介面,與計算機連接後,可以通過軟體對其進行管理。我最關心的斷電自動關機功能,在Windows上有APC自家的PowerChute軟體支持,群暉原生支持,Debian上呢?很幸運,有一款開源軟體「apcupsd」可以支持。

apcupsd是一款跨平台的開源軟體,專門用於APC旗下的UPS產品,其開發得到了APC官方的大力支持,所以對APC UPS的兼容性很好。我安裝配置完成後,模擬斷電測試時一次成功,可以說很簡單易用。

首先是安裝apcupsd:

apt-get install apcupsd

接下來用vim打開/etc/apcupsd/apcupsd.conf,進行一些必要的配置:

  • UPSNAMEUPS名稱,不妨輸入UPS型號「BX650CI」。
  • UPSCABLEUPS連接方式,輸入「usb」。
  • UPSTYPEUPS類型,輸入「usb」。
  • DEVICE留空,對於usb類型的UPS來說,這樣可以自動檢測設備。

這樣必要的配置就算完成了,很簡單吧。注意項名和值之間不是用等號連接的,而是用一個空格隔開。此外,如果需要的話,可以同時配置一下斷電後自動關機的觸發條件,apcupsd用了3個參數來限定觸發條件:

  • BATTERYLEVEL斷電後UPS的剩餘電量(以百分比計)小於等於此值時觸發自動關機。
  • MINUTS斷電後UPS可繼續工作的時間(以分鐘計)小於等於此值時觸發自動關機。
  • TIMEOUT斷電後經過的時間(以秒計)大於等於此值時觸發自動關機,設置為0時忽略此條件。

斷電後這3個條件中只要有1個滿足便會觸發自動關機。為了測試方便,可以將TIMEOUT暫且設置為一個較短的時間,比如60。

保存退出後再用vim打開/etc/default/apcupsd,將「ISCONFIGURED」的值設置為「yes」,這樣就可以啟用apcupsd了。完成之後重啟下apcupsd:

systemctl restart apcupsd

沒有意外的話,apcupsd就可以正常工作了,可以在終端命令行中鍵入以下指令來驗證:

apcaccess status

正常情況下會顯示出UPS的一系列信息,比如我的就是這樣:

至此整個UPS的配置告一段落,之後它就可以堅守崗位保障NAS的可靠運行了。apcupsd的功能還有很多,詳細內容可以登錄它的官網進一步了解:

A daemon for controlling APC UPSes?

www.apcupsd.org

實用工具軟體介紹

除了以上這些必不可少的配置以外,一些實用工具軟體的引入可以使NAS的日常使用更為得心應手,這裡拋磚引玉地介紹幾款。

Better Terminal

(這是安裝在手機端的App,不是安裝在NAS上的,不要搞錯了)

既然用SSH協議可以遠程操作NAS,那麼我在安卓手機上安裝一款支持SSH的App,不就可以用手機操作NAS了?沒錯,現在IT技術的發展已經到了越來越讓人感到「沒有做不到,只有想不到」的高度了。安卓系統上的好用的這種App有那麼三五款,統一叫做「超級終端」,這裡推薦其中的一款「Better Terminal」。

安裝並啟動後,展開屏幕右上方的菜單,點擊「Preferences」項進入設置頁面,勾選第一項「SSH Client GUI」:

然後退出並重啟Better Terminal,之後會來到如下的界面。選中「SSH」,「Host」欄填入NAS的IP地址,「Username」欄填入登錄用戶名,「Identity Key」欄用來指定證書文件,可以實現免密碼登錄,這裡不表,留空即可。之後點擊「Start Session」按鈕即可進入命令行界面。方便起見,可以點擊下方的「Create Shortcut」按鈕,這樣會在手機桌面上生成一個快捷圖標,以後點擊這個圖標便可直接進入命令行界面,圖標的名稱在「Shortcut Name」處鍵入。

在命令行界面中,首先需要輸入用戶「guest」的密碼,然後就可以像在電腦上一樣操作NAS了,比如設定NAS在1分鐘後關機:

cpufreqd

cpufreqd是Linux下用來調節CPU頻率的一個小工具,可以自己編輯調節策略,通過設定其中相關的參數,可以自動限定不同情境下的CPU上限頻率,比如AC電源接通時、只接通電池時、CPU處於高溫時等。

通過以下指令安裝cpufreqd:

apt-get install cpufreqd

相關的設定通過修改文件/etc/cpufreqd.conf來實現,用vim打開它進行修改。

這個文件內容可分為3塊,即[General] [Profile] [Rule],裡面包含的默認策略可滿足一般應用需要,如果想自行修改,可參考下述文檔:

configuration file for cpufreqd(1)?

manpages.ubuntu.com

lm-sensors

這款軟體可以算是Linux上的通用工具軟體了,在很多Linux發行版中都有預裝。正如其名字Linux-monitoring sensors所示,它用來監測主板上各硬體感測器的數據,比如CPU溫度、風扇轉速等,並且可以結合其配置文件中的控制策略計算合適的風扇轉速,最終以PWM波的形式輸出至CPU風扇以控制其轉速。不過Debian系統中並沒有預裝它,所以需要先用以下指令安裝lm-sensors:

apt-get install lm-sensors

安裝完成之後,需要先運行:

sensors-detect

sensors-detect是一段獨立的程序,用來探測主板的感測器類型,根據結果決定載入什麼模塊。在整個過程中,會詢問用戶是否對某個硬體單元進行探測,保險起見,一直按Enter鍵選擇默認選項即可。在sensors-detect的最後,一系列需要載入的模塊會列出,鍵入「yes」以使sensors-detect將這些模塊寫入到文件/etc/modules中,重啟後這些模塊將會被自動載入。

{pendding圖}

現在可以通過鍵入如下的命令來查看CPU溫度等信息:

sensors

{pendding圖}

上圖是我的主板顯示的信息,不同的主板因為硬體配置不同,所顯示的條目亦不相同。注意這些信息是指令執行時各感測器數值的快照,並不會實時更新,若要實時監測這些信息,可以輸入指令:

watch sensors

collectl

collectl是Linux平台上一款十分強大的系統監控工具,它監控的對象不僅限於某種系統資源,而是廣泛地囊括了諸如buddyinfo、cpu、disk、inodes、infiniband、lustre、memory、network、nfs、processes、quadrics、slabs、sockets、tcp等不同類型的系統資源信息。通過豐富的命令行指令與用戶交互,collectl能夠以豐富的格式顯示監測到的數據。

通過以下指令來安裝collectl:

apt-get install collectl

安裝完畢後,輸入指令「collectl」即可顯示實時的CPU、硬碟和網路信息:

以上信息以秒為單位追加(通過鍵入「Ctrl+C」停止),顯示的數據可以以日誌形式保存在磁碟上,collectl同時提供了各種命令來對這些數據進行查找及其他處理。

collectl可以監測的對象稱為子系統,包括:

  • b - buddy info (內存片段)
  • c - CPU
  • d - Disk
  • f - NFS V3 Data
  • i - Inode and File System
  • j - Interrupts
  • l - Lustre
  • m - Memory
  • n - Networks
  • s - Sockets
  • t - TCP
  • x - Interconnect
  • y - Slabs (system object caches)

此外,針對某個子系統,collectl可以進一步地以更詳盡的信息予以顯示,這稱為細節子系統,包括:

  • C - CPU
  • D - Disk
  • E - Environmental data (fan, power, temp), via ipmitool
  • F - NFS Data
  • J - Interrupts
  • L - Lustre OST detail OR client Filesystem detail
  • M - Memory node data, which is also known as numa data
  • N - Networks
  • T - 65 TCP counters only available in plot format
  • X - Interconnect
  • Y - Slabs (system object caches)
  • Z - Processes

要讓collectl顯示特定子系統或細節子系統的信息,可以用「-s」並在其後跟上這個(細節)子系統的標識字母。例如,輸入指令「collectl -sd」後可顯示出硬碟數據傳輸情況:

輸入指令「collectl -sM」後可顯示出內存使用的詳細情況:

關於collectl更詳細的細節可以參閱官網:

collectl?

collectl.sourceforge.net
圖標

hd-idle

出於節能以及延長硬碟壽命的考慮,有時會有使處於空閑狀態的硬碟休眠(碟片電機停轉)的需求。關於這一操作的必要性,其實並不能一概而論,需要多方面權衡才能下結論。

硬碟平時運轉時的功耗為6W左右(隨磁碟數不同而有上下浮動),休眠後功耗可以忽略不計。如果是家用的24小時開機的NAS,每天只在某些特定的時間段(比如晚飯後)短時間訪問的話,使能硬碟休眠,天長日久累積下來的電費也足夠買個新(霧,二手)硬碟了吧。倘若是隨用隨開,用完就關機的NAS(話說這還能叫NAS么),則沒有這個必要。

從硬碟的壽命角度講,使能休眠是否能帶來硬碟壽命的延長也是一個很有爭議的話題。至少各大硬碟製造商給出的官方建議是硬碟不可以短時間內頻繁休眠又喚醒,至少要把休眠前空閑時間的閾值設置為5分鐘以上才行。此外,硬碟本身也是一個含有機械系統的設備,如同汽車發動機一樣,啟動時不僅耗油,也會折損發動機壽命,不少人信奉這一道理,認為休眠對延長硬碟壽命並沒有多少作用,甚至反而會縮短其壽命。一個事實是,硬碟在啟動瞬間功耗會飆升至將近20W甚至20W以上。另一個事實是,極少見到因為碟片的軸承失效而損壞的硬碟。

總之,是否使能硬碟休眠,仁者見仁,智者見智。對於的確有需要的NAS用戶,可以用一款名為hd-idle的軟體實現硬碟的自動休眠控制。

其實Debian系統自帶另一款磁碟管理軟體hdparm,功能更為強大,也可以實現硬碟的自動休眠,不過相比之下,還是hd-idle更為專一,使用上也更為簡單,所以選用了hd-idle。

一個壞消息是hd-idle沒有發行包,需要用戶自行下載源代碼、編譯、安裝後才可使用,不過這對於愛折騰的NAS玩家們來說並不算什麼,選擇了Debian,就意味著選擇了一條充滿了樂(da)趣(keng)的道路,DIY精神是引領我們不斷前進的座右銘。

要編譯代碼,首先需要安裝編譯環境,執行以下指令來安裝:

apt-get install dpkg-dev
apt-get install debhelper

此外,下載代碼需要用到git工具,安裝之:

apt-get install git

做好以上準備工作後,就可以到GitHub上去下載代碼了,hd-idle在GitHub上的頁面地址為:

jlyo/hd-idle?

github.com
圖標

首先進入/home目錄,接著鍵入:

git clone https://github.com/jlyo/hd-idle.git

進行下載,之後hd-idle的源代碼將會保存至目錄/home/hd-idle中,進入該目錄後,運行:

dpkg-buildpackage -rfakeroot

進行編譯,編譯完成後運行:

dpkg -i ../hd-idle_*.deb

進行安裝。至此hd-idle已經安裝至系統之中,作為清理工作,可以刪除之前下載的源代碼以及編譯過程中產生的文件。

hd-idle的配置很簡單,用vim打開文件/etc/default/hd-idle,按下圖進行配置。其中「START_HD_IDLE」項用於控制是否啟動硬碟休眠功能,賦值「true/false」來控制。「HD_IDLE_OPTS」項用於設置休眠參數,其各子選項為:

  • -a:設置受控制的硬碟設備
  • -i:以秒計的空閑時間,超過這個時間硬碟將自動進入休眠狀態
  • -l:日誌文件

配置好後重啟下hd-idle服務,之後hd-idle就可以按照設置好的參數發揮作用了。

systemctl restart hd-idle

推薦閱讀:

相关文章