在Debian上搭建家庭NAS备忘录

在Debian上搭建家庭NAS备忘录

内容概要

撰写本文的目的是为了将搭建过程中的各种琐碎事项归纳整理,以便需要时查阅。文中以图文形式尽可能详细地将每一步操作记录在案,故亦可供有类似需要的DIYer们参考。

本文内容包括:

  • NAS方案选择
  • 硬件配置
  • Debian系统安装及基本配置
  • NAS存储硬盘配置
  • SMB服务配置及共享目录访问
  • DLNA服务配置及音频应用
  • 与UPS互连
  • 实用工具软件介绍

NAS方案选择

近几年来NAS越来越被大家熟识,网上相关的软硬件配置方案文章也层出不穷。组建这套NAS的出发点就是追求轻量级,包括硬件上以及软件上,所以在市面上的各套方案中权衡利弊深思熟虑之后,最终敲定了单盘位ITX机箱+Debian OS的方案。

ITX机箱的尺寸只有200*200*60mm,非常小巧。限于机箱空间,只能容纳一个3.5寸硬盘用于NAS存储。主板选择了尺寸上与之匹配的N3150 ITX。得益于主板的节能设计,装配完毕的NAS运行时功耗很低,只有16W左右。

Debian属于轻量级的Linux系统,麻雀虽小,但五脏俱全,只要自己动手,便可丰衣足食,既体验了DIY的乐趣,又获得了满足感,可谓是一举多得。

在性能上,N3150的4核CPU应付NAS的日常应用是绰绰有余的,毕竟避开了Windows,又没跑虚拟机。配合千兆网络系统,文件的上下行传输速度都可稳定在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)

525采用的是MLC颗粒,除了发热量大点,读写速度和稳定性都没说的,可谓良心产品。用它来安装OS。其实不带桌面UI的Linux系统都很苗条,我这套系统在一切都配置妥当后,只用了2GB左右的硬盘空间。考虑到预留的swap分区以及OS占用空间的正常增长,其实一个8GB的SSD足够胜任。

在SSD的选择上,要避开一些山寨品牌,比如地雷遍布的“三金一云”,否则一旦哪天人品拼不过就会触雷翻车。全球存储颗粒的产量就那么点儿,山寨厂为了又保证产量又打好价格战而普遍采用黑颗粒或二手颗粒已经是业内不算秘密的秘密了。

NAS存储硬盘
HGST DeskStar NAS 4TB(¥899)

在大容量硬盘的选择上,如今大坑还是不少的,比如返修率一直居高不下口碑欠佳的希捷硬盘,由于磁道结构原因动不动就写速率爆炸的叠瓦式硬盘。绕开这些大坑,最终选用了HGST(原日立)的这款硬盘,据说在圈里口碑不错,大家都说好才是真的好。

机箱
立人 E-H60(¥169)

全铝结构,做工也还算说得过去,关键是它专为ITX主板设计,小巧的体积让它显得很Q,装饰效果也强。

不过鱼与熊掌不可兼得,追求小体积的同时带来的副作用是它只能容纳1块3.5寸硬盘(或2块2.5寸硬盘,鉴于2.5寸硬盘的速度和容量,用来做NAS存储盘是不适合的)。

电源
LITEON 12V 5A电源适配器(¥19)

60W的电源,带这套单硬盘的配置足够了。


施工完成前的全家照:

消耗功率实测值(推送DLNA音频时):

此外不得不提的一点是,用于组网的路由器、交换机等网络设备必须是千兆网口,网线也最好用六类的,这样才可以保证稳定而高速的传输,对于如今动不动数GB甚至数十GB的文件来说,这是非常必要的,否则慢如蜗牛的传输速度绝对会让人抓狂的。

Debian系统安装

Debian是Linux大家族的一员,目前最新的版本是9.4版的“Stretch”,到下面的网页下载镜像文件(推荐64位的):

Debian -- Getting Debianwww.debian.org

找一个U盘,将下载好的ISO文件烧写到里面。注意传统的工具例如UltraISO等烧写的U盘不能正常启动,这里推荐一款名叫Rufus的烧写工具,体积小巧,界面简洁。如图所示,选择好烧写的目标设备以及待烧写的ISO文件后,点击“开始”即可。

用这个U盘启动计算机后,开始进入Debian的安装环节,整个过程中人机交互的内容比较多,下面用图文的形式一步步予以说明(为了截图方便,以下的安装在VMware虚拟机中进行,实际的安装过程与此无异)。需要注意的一点是安装过程中会通过网络下载一些必要的安装包,故需要连网进行。

启动后的界面中选择“Graphical install”:

系统语言推荐选择英文,虽然有中文选项,但是支持的并不完整:

地区选择“China”:

地区配置中选择“Hong Kong”(因为没有帝都选项...):

键盘配置用默认的美式即可:

网络中的主机名,NAS主机将以这个名字显示在网络中:

域名留空:

接下来是设置超级用户密码,这个很重要,要认真设置并准确无误地记下来(rm指令:我发起疯来连OS自己都删):

除了默认的root用户,再建立一个来宾用户,用于一般的访问,这里取名为“guest”:

设置guest用户的密码:

接下来是系统盘分区。本着简单易用的原则,启动引导选用了传统的BIOS模式,而没有选用UEFI模式,所以EFI引导分区自然也就不需要了。于是分区方案确定如下:整个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)啊:

相较于图形化的Windows,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 软件名”实现。

  • vim
    Linux系统常用的文本编辑工具,以它简(fu)单(za)易(bian)用(tai)的特点而著称,进行一些日常的系统文件配置全靠它了。不过不得不承认的一点是,对于初心者而言,vim并不很容易上手,所以还有另一个选择——nano,它是Debian自带的文本编辑器,可以根据自己实际情况进行取舍。
  • Net Tools
    Debian默认是不支持诸如ifconfig、arp等一些常用的网络命令的,安装好这个工具就OK了。
  • Samba
    实现SMB协议的文件共享服务,在Windows系统里访问NAS就是通过它来实现的。这里先把它安装上,具体的配置后面详述。
  • miniDLNA
    Linux上实现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网段,设置好后是这样的:

完成之后需要重启网络服务以使设置生效:

systemctl restart networking

然后可以用以下指令查看新的IP设置是否生效:

ip addr show

除此之外,最好在路由器中同时设置静态地址,因为如果路由器为其他设备动态分配的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存储硬盘的配置完成。

SMB服务配置及共享目录访问

SMB服务是NAS最基本的功能之一,它可以实现文件的共享,配置好之后就可以通过网络来访问NAS上的文件了。Linux上用来实现SMB服务的工具软件是Samba,接下来的配置都是围绕这个软件展开。

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(子目录也需如此,但需要通过配置/etc/samba/smb.conf文件实现,方法后面提及),来访用户的读写权限通过Samba另行设定;若是出于更高的安全性的考虑,则把共享根目录的权限设置为755(子目录也需如此,但需要通过配置/etc/samba/smb.conf文件实现,方法后面提及),所有者为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

需要注意的是,在添加用户时,因为将shell指定到了表示无法登录的“nologin”,所以这两个用户无法通过SSH等登录系统的shell,只是作为访问Samba之用而存在。

(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 binmanpages.ubuntu.com

编辑完成后保存退出,至此整个Samba的配置完毕。为了使配置生效,将Samba服务重启一下:

systemctl restart smbd

接下来就是真正激动人心的时刻了——通过网络客户端访问NAS共享目录(这次没有坑,放心)。

(1)Windows

在任意一台连网的Windows电脑上展开“网络”,找到NAS(就是NAS的主机名),点击它,输入用户名和密码,哇,进去了,素晴らしい!

这之后就可以像访问本地目录一样操作这两个共享目录了,方便起见,可以把它们映射为本地磁盘。以下是传送一个900MB+的单个文件时的实测速度:


这里插叙一段内容,对于Windows10而言,默认SMB协议是未启用的,需要像下图那样启动后才可以访问到共享目录。


(2)Linux

这里仍以Debian为例,没错,还是Debian,但要注意此Debian非彼Debian,这个Debian是网络中另一台电脑上安装了桌面环境的Debian。

Debian系统中已经预先安装好了SMB协议,所以我们要做的就简单多了,步骤上跟Windows上的大体相同。

首先打开文件浏览器,点击菜单项“Go->Location...”:

然后窗口会显示一个地址栏,在里面输入“smb://debian”,回车后会弹出一个对话框,在其中输入用户名和密码,然后点击“Connect”:

之后系统会自动挂载NAS的共享目录到Network下面,桌面也会自动生成一个快捷方式,点击就可以访问NAS的共享文件夹了:

要说明的是,以上的示例基于Debian的MATE桌面环境,对于其他的桌面环境,操作起来可能会有略微的差异。

(3)Android

手机端也是可以轻松访问NAS的共享目录的。下面以Root Explorer这款经典的App为例进行说明。

在Root Explorer的主菜单中点击“新建...”项,然后点击“网络共享(SMB)标签”项:

在接下来弹出的窗口中依次输入NAS的IP地址、用户名、密码,然后点击“确定”:

这之后就可以连接到NAS的共享目录了,可以发现App多了一个“网络共享”标签,展开下面的文件夹就可以一级级地访问NAS的共享内容了:

Root Explorer是个通用的文件管理器,适合一般性的浏览与管理,对于NAS上的各种具体类型的多媒体资源,还是建议专物专用——不同的多媒体类型选用不同的App,这样可以带来更好的用户体验,例如:

图片资源——QuickPic(快图浏览)

音乐资源——Poweramp

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服务器中的共享资源。将播放设备连接到网络中的可以是网线,也可以是无线Wifi,比如轻量级的无线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,进行一些必要的配置:

  • UPSNAME
    UPS名称,不妨输入UPS型号“BX650CI”。
  • UPSCABLE
    UPS连接方式,输入“usb”。
  • UPSTYPE
    UPS类型,输入“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 UPSeswww.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”的密码进行登录(有必要的话可以接着取得root权限),然后就可以像在电脑上一样操作NAS了,比如设定NAS在1分钟后关机:

Cockpit

群晖系统之所以是大批NAS玩家的不二之选,是因为它简单易用且功能强大,而这很大一部分原因要归功于群晖友好的Web控制面板。Debian的控制台指令窗口再怎么强大也总有一种拒人以千里之外的不友好感,要是在Debian上也有类似于群晖的那种Web控制面板就好了——在如今日益没有做不到,只有想不到的IT界,这一愿望早已被辛勤的GNU耕耘者们付诸实际。Cockpit就是一款轻量级的运行于Linux之上的Web控制面板,正如它的名字,使用者可以仿佛身临飞机驾驶舱一般操作整架飞(xi)机(tong)。

Cockpit Project - Cockpit Projectcockpit-project.org图标

Debian上Cockpit的安装步骤如下:

首先用“echo”命令添加backports存储库:

echo 'deb http://deb.debian.org/debian stretch-backports main' > /etc/apt/sources.list.d/backports.list

接着更新apt cache并安装Cockpit:

apt-get update
apt-get install cockpit

之后就可以用浏览器访问Cockpit了,Cockpit的默认端口为9090,所以在地址栏输入“NAS IP:9090”,之后便会打开Cockpit的登录页面,输入用户名和密码后,便来到了Cockpit的Web面板。

在Web面板中,可以查看系统的日志、各硬件资源的使用情况,也可对存储、账户、服务等进行一些基本的设置。此外,它还带有一个命令行终端,前面介绍的基于SSH的终端用腻了的话,可以使用这个。

在手机浏览器上使用的效果如下:

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中,重启后这些模块将会被自动载入。

现在可以通过键入如下的命令来查看CPU温度等信息:

sensors

上图是我的主板显示的信息,不同的主板因为硬件配置不同,所显示的条目亦不相同。注意这些信息是指令执行时各传感器数值的快照,并不会实时更新,若要实时监测这些信息,可以输入指令:

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更详细的细节可以参阅官网:

collectlcollectl.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-idlegithub.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

smartmontools

smartmontools是一款通过SMART信息对硬盘等存储设备进行监测的工具软件。对于NAS,比较关心的是NAS存储硬盘的通电时长与通电次数等与寿命息息相关的信息,这些都可以用smartmontools来查看。

smartmontoolswww.smartmontools.org图标

首先是smartmontools的安装:

apt-get install smartmontools

之后就可以通过smartmontools的“smartctl”指令来查看硬盘的相关信息了。这个指令常跟的开关,一个是“-i”,可以显示硬盘的序列号等信息;一个是“-a”,用来显示硬盘的SMART详细信息。对于NAS存储硬盘,指令分别如下:

smartctl -i /dev/sdb
smartctl -a /dev/sdb

于是可以得到如下的信息:

以上只是最基本的应用,其实smartmontools还带有一个daemon——smartd,它可以按指定的时间间隔实时监测硬盘的健康状态,一旦发现问题,可以通过日志/电子邮件的形式告知我们,这对于一Byte数据一寸金的NAS来说是再合适不过的必要功能了。关于smartd的配置和应用的具体步骤,可以参考smartmontools官网内容。

🈡

编辑于 2019-10-05