要玩转网络和NAS,就先玩转Linux

NAS(Network Attached Storage)可以理解为一台仅供私人使用的存储服务器。该服务器可以挂载多个硬盘或者组成磁盘阵列,用于存储你的电影音乐文字等等各种媒体文件,并且可以让你通过网络在各个不同的地方获取到这些媒体资源。

既然是服务器,那自然搭建服务器跟搭建NAS就有着十足的共同点。服务器可以理解成设计用于网络远程访问、存储的计算机。它不需要键盘、鼠标这样的输入设备也不需要显示器、音响这样的输出设备,当然也就不需要显卡和声卡。有CPU、网卡、内存加上硬盘就能拼起一台服务器,也就足够拼起一台NAS。

由于不需要运行桌面程序,服务器或NAS对于CPU和内存的要求在仅供个人使用的情况下其实是远低于家用电脑的,因此像是淘汰下来的老电脑,在没有特殊故障的前提下完全可以拔掉显卡和键鼠,装上合适的系统配成NAS。这样的一台NAS甚至性能会高于你花大价钱从某些成品NAS厂商(如群晖)那里买来的新机器。你仅仅需要额外付出一点学习成本。况且,对于有志搭建家用NAS的用户,相信配置系统或者说“折腾”本身也是可以带来相当大的乐趣的。何必花那大笔溢价买那一台怎么看都性能一般系统也只是给Linux套了个WebUI的破机器。

服务器和NAS跟家用电脑一样也需要操作系统,甚至也可以装Windows Server。不过绝大多数的服务器还是上了Linux的各种发行版,原因有以下几个:

  1. Windows要花钱
  2. 绝大多数Linux发行版的资源占用和稳定性完爆Windows
  3. 在Linux上远程安装和配置服务远比Windows方便

有人可能会问只能打命令行的Linux怎么会比有图形界面能用鼠标的Windows还方便?这里我举个例子说明,譬如我要安装Apache2网站服务:在Windows上我需要先去微软的网站把相关的VC库下载好,再去Apache的网站下好Apache2的安装包,解压缩(解压缩过程还要自行设置解压的目标文件夹),设置httpd服务开机运行并在防火墙里打开协议和端口。而在Linux上呢?只要一条sudo apt install apache2(假设是debian/ubuntu版本),搞定。

是的,Linux各个版本基本都会设置一个软件源用来归档各种常用应用包,要装哪个直接从源里拖就行,而且安装过程中会把所有的依赖包一起下下来,并存放在固定的目录下。因此作为服务器系统,Linux无论从性能还是便捷的角度都优于Windows。

没接触过Linux的新手也不要被命令行界面吓跑了,我这边简单拆解分析一下你就知道真不算复杂。

首先我们要了解操作系统对于服务器的意义。说白了就一点:管理文件。在操作系统上一切行为都围绕文件展开——安装文件、运行文件、编辑文件、删除文件、修改文件权限等等。而服务器跟个人电脑在操作系统使用上最大的一点不同就是,对于家用电脑来说,你运行了一项程序或一个文件仅仅只是开始,之后在运行的程序中的操作才是使用个人电脑操作系统的主要任务,譬如各种游戏,文字处理软件,网页浏览器等等。使用这些“运行中的程序”需要用到键盘鼠标显示器音响等。而服务器运行的文件是“服务(Service)”,也就是一项长期运行在服务器后台不需要额外操作只要开始运行就大功告成的任务,剩下的一切操作都跟服务器无关而是会转移到客户端操作,服务器只要配置好保证客户端能顺利通过网络连接到服务器端就可以了。因此抛去了大量占用CPU和内存的桌面环境的Linux系统完全足够方便使用。

那么在了解服务器系统的操作内容之后,具体的该怎么用命令行完成安装、配置、运行的操作呢?我们一个一个来看:

第一步是安装:这个上面提到过了,其实就是这样一行命令:
包 装 网站
写成英文
apt install apache2

apt是debian/ubuntu的包管理程序(别家的名字不一样不过用法都一样),install是安装,apache2是网站服务。Linux的各种发行版一般都会有一个官方源——或者你理解成软件仓库——用来存放所有常用的服务软件。你要装什么应用直接这么一条命令打上去基本就都能搞定。知道这条最基本的安装命令后你可能还需要知道一下因为装服务软件是要运行在系统层面的,因此在apt命令前要加上sudo或者直接先打个su,这是指获取超级用户权限来安装,不然系统目录是不让你读写的。

Linux有很多的发行版,什么debian,ubuntu,centOS,RHEL,fedora,arch……不少linux社区里“你最喜欢选哪个发行版本”一向是个周常话题。但其实对普通用户来说大可不必有什么选择困难症,因为真没啥区别。各种不同的发行版本最大的区别其实就两点,一是包管理程序不同,就是上面那个apt命令,有的发行版是yum,有的是opkg,但下载下来安装的软件包其实都是一样的;二是系统自带的预设包不同,这点就更不必在意了,你随便选一个系统,发现缺什么包直接apt install就完事了。当然,也有些像是ubuntu desktop这样预装了gnome桌面环境的,这就没啥必要了装了还得自己删。

第二步是配置。这一环节其实是比较容易劝退的环节,也是各种成品NAS厂商能够获得盈利的关键——他们拿来免费开源的Linux系统给NAS装上,把NAS需要用到的服务装好后配置好,再套上一层webUI的皮,铛铛~请转账付费。这里题外话说一下webUI是怎么回事:Linux系统内核跟Windows不一样,是不包含图形界面的,一切交互本质上全靠命令行。既然如此Ubuntu desktop那些桌面系统是怎么回事?其实就是运行在系统上的一项服务,譬如Gnome,KDE等等。这些服务画了一个有点像Windows视窗的图形化系统,你在跟这些画出来的界面交互时(点鼠标,键盘打字),这些界面再给你翻译成命令行或者其他配置文件文本写入系统。打个不恰当的比喻就是一台ATM机里面其实坐了个银行员工帮你手动算账。而webUI的思路也是类似:你通过浏览器网页远程访问NAS时其实是访问到了httpd这个服务开放的80或443端口,厂商事先给这项服务配置好了权限以及写入配置文件的接口,你在网页端的js或php输入控件里打字或选择下拉选项完成提交后,这些网页就自动生成对应的命令行输入系统终端,达到修改配置或者管理文件的目的。

看完上面这段啰嗦之后,聪明的你一定会发现,那何必多此一举还经过那层网页的外皮输命令,虽说方便了但国家是禁止用户私自搭建http网站服务的。自家局域网用来设置是没事,可一旦开放给公网可是要冒被电信联通断网的风险。而且这层网页UI外皮还卖的格外贵。不如把那层皮扬了直接在里面操作算了。没错,这正是本文的目的,请继续看我介绍如何用linux本身的特性配置NAS所需要用到的服务。

你已经知道了Linux系统基于命令行。在给计算机安装Linux系统的过程中会提示你创建一个用户,在安装完成并开机后你需要用事先创建好的用户来登录系统,这时你就可以开始用命令行使用Linux。但这种直接把显示器和键盘连到主机上操作的行为对于服务器或NAS来说其实是很少见,一般在装好系统以后所有的操作都是通过网线远程操作运行。Linux系统自带一个用于远程登陆的服务,以前是rlogin,现在是ssh,后者更安全一些。用法就是服务器主机启动以后会自动运行sshd服务,我们从一个与该主机有通畅网络连接的另一台电脑上(譬如你家的windows电脑甚至手机)上通过终端或ssh客户端远程登录连入主机,然后就可以在远程输入命令行了。这个时候你在远程输入的命令行跟直接在服务器主机上打命令行效果是一样的。

那么面对着黑色背景就一个光标闪烁的命令行界面怎么下手开始配置文件呢?我们先来回忆一下大家熟悉的图形化界面或网页界面是怎么改配置的:窗口界面的菜单栏和网页的导航栏某个按钮点击后选择 选项(options)、设置(configuration,settings)、偏好(preference), 跳出来一个排列着各种下拉选框或输入框的界面。你在这些选框或选项里选择或输入各种参数,应用/确定后这些配置生效。大家肯定能理解这一点:这些你手动更改或输入过的选项必然是以某种形式保存在计算机里,不然是没法生效的。那么是何种形式保存的呢?当然是文件了。聪明的你看到这里必然能想到,既然是文件,那我直接改文件是不是也能起同样的效果?完全正确。现代软件的各种参数设置其实都以文本形式保存在软件目录或者系统分配的专属配置目录下,除非是一次设定以后再也没打算让人改的那种配置,否则不会转成机器二进制语言保存。在Linux下,我们要做的就是直接改这些以文本形式保存着的配置文件。这些文件可能有着各种不同的格式,譬如json,xml,ini,但也只是文本的语法区别,改起来其实都一样,直接用系统自带的文本编辑软件改就是了。Linux系统有多种命令行文本编辑工具,譬如vim,nano等。随便选一种你用着习惯的工具(以下以nano为例,其他工具只要把nano改成相应的名称就是完全相同的命令行用法),在$提示符后输入类似以下命令就可以开始编辑文件:

sudo nano /etc/ssh/sshd_config

其中sudo上文说过是用超级用户权限编辑文件(编辑系统配置文件必须要超级用户),在你已经用root或超级用户权限登录的情况下可以省去这一句。nano是文本编辑器,你可以根据自己的需要习惯选用其他编辑器。/etc/ssh/sshd_config是文件名,”/“符号表示目录,Linux下光一根”/“表示系统根目录,/etc/ssh/sshd_config意思是“根目录下的etc子目录下的ssh子目录下的sshd_config文件”(顺道解释一下sshd_config是ssh远程登陆服务的配置文件)。

具体的编辑过程就是普通的文本编辑,用过记事本的应该都不陌生。虽然没有鼠标可以用,但是上下左右移动光标插入删除修改这些应该都一看就会。大多数软件的配置文件里都写有足够详细的注释,变量名也都是直观反映配置内容,会英文的一看就知道改的是什么,实在看不懂英文就拿手机上的翻译App拍一下也就差不多了。不过直接改配置文件有一个需要注意的地方就是文本编辑自由度很大,除非你确实知道自己在做什么否则不要随便动你还不确定的东西,确保自己的修改符合该配置文件的语法,对于原有的配置内容如果是需要取消的,尽量用注释符号注释掉而不是直接backspace删除。改完之后保存(nano下使用Ctrl+O保存,Ctrl+X退出)。这样配置文件就修改好了。修改完配置文件后有些软件有自查功能查看你修改过的配置文件有没有语法错误,你可以用通用命令 服务名称 -t来测试,或者用软件专门提供的命令如apache2ctl configtest来检查语法。测试通过没问题之后就可以开始运行这些软件开启服务了。

第三步运行服务。其实这一步大家都熟,Windows下双击exe文件嘛,谁还不会运行软件。Linux下也差别不大,$提示符后直接打软件名称就能运行。可运行的程序一般被Linux放在/usr/bin/或/usr/sbin/下(相应的配置文件一般在/etc/下)。但是对于Linux有一点特殊的地方,就是你直接这么在命令行终端打软件名运行可以是可以,但会占用终端的进程,也就是你打不了其他命令了,除非你终止目前的进程。因此我们需要把各种服务软件做成.service服务让系统来运行,有点类似Windows系统的“后台运行”。最新版Linux内核使用systemctl这个命令来通过systemd服务控制其他后台服务进程,譬如

sudo systemctl start apache2 开启服务
sudo systemctl stop apache2 停止服务
sudo systemctl enable apache2 开机自动启动服务

语法应该都很好理解。

以上三步是Linux服务器端的设置方法,照理说配置好了服务成功开启来了就应该能用了。但一般用户照着这么三步走下来如果想直接用客户端连接基本都会失败。先别忙着沮丧,听我慢慢分析一下你要让客户端连上服务器端的服务还需要做哪些工作。

要从外部通过网络成功连入Linux系统下的各种服务,只要记住三个关键:1、网络设置;2、文件权限;3、防火墙。

网络设置很好理解,就是客户端跟NAS主机之间的网络通讯是否成功建立。大家应该都会用ping指令。ping通主机之后还需要设置好该服务所使用的端口,这样外部连接进来的时候才能凭端口准确找到是哪一项服务。端口一般都在/etc/下的设置文件里改,带有port XXXX或者listen XXXX 字样的一般就是监听端口,端口范围0-65535,一般1024以前的数字是各种系统服务用的,想要改自己喜欢的端口可以尽量选5000甚至10000以后的,不确定端口有没有被用掉可以打命令sudo ss -tunlpsudo lsof -i -P -n来查看有哪些正在使用中的端口,避开这些端口就行。在设置好之后同样也可以用这两个命令来查看端口有没有正确地被服务监听。(注:所谓“监听”,即LISTEN,是指某端口处于等待被连接的状态。另外端口还可能处于ESTABLISHED状态,是指端口已经被连接。已经被连接的端口依然可以继续LISTEN也可以继续建立其他连接,不会像现实中的插座或接口那样插上一个就被占用掉没法接其他)

需要注意的是,如果要从你家路由器网关以外的公共网络连接到网关内的NAS,你需要在网关处设置好端口转发。具体关于网关和内外网端口的问题可以参考上一篇博文的内容 用最简单的原理解释NAS一些基本原理

在配好端口并设置好网关之后,理论上你已经可以开始用客户端访问NAS并使用各种服务或读取文件了。只是不太熟悉的同学依然会出现各种“连接请求被拒绝””access denied”的提示。这里面排除硬件故障和软件本身bug之外最多发生的情况就是没有设置好对相应文件的访问权限或连接请求被防火墙阻止。对于这两个问题首先有一个万能的解决办法——关掉防火墙并用root权限登录。当然这个解决方法通常只用于排查故障使用:如果你关掉防火墙能连了或者改用root用户就正常使用了,说明你的防火墙设置或访问权限没有设置好,请务必正确设置好这两项之后再将防火重新打开并改回普通用户,尤其是在你的主机通过网关设置已经接入公网的情况下。请务必不要偷懒把防火墙一关完事!

关于文件权限问题,拿网页BT服务举例:你下载了transmission-daemon用于在NAS上远程BT下载。由于下载这个动作需要把下载好的文件放进NAS的某个文件目录中,因此在transmission-daemon的设置文件settings.json中设置好下载目标位置并在相应目录建立好文件夹之后,你还必须将该文件夹的用户所有权交给为transmission-daemon的使用用户(Linux的大部分服务都会生成一个特殊用户来使用系统),默认情况下这个用户名叫debian-transmission(是的,这个用户名你可以手动改)。我们用如下的命令修改下载目标文件夹权限(假设目标目录为/home/ubuntu/downloaded/):
sudo chown -R debian-transmission:debian-transmission /home/ubuntu/downloaded
然后将文件夹读写权限修改为775
sudo chmod -R 775 /home/ubuntu/downloaded

上述两个命令chown和chmod意思是“修改文件夹所属用户”以及“修改文件夹读写属性”,-R是执行选项表示对作用与目录下所有子目录和文件夹。”:”前后的debian-transmission分别表示执行命令后文件夹所属的用户和组,注意这里只是用户名和组名恰好相同。775这三个数字分别表示了“所属用户读写权限”、“同组其他用户读写权限”以及“其他所有用户读写权限”。其中读(r)写(w)执行(x)分别对应数字4,2,1。譬如数字7就是4+2+1,也就是读写执行权限都有。那么775的意思就是所属用户及同组拥有全部读写执行权限(4+2+1=7),其他用户只能读取和执行(4+1=5)。另外你也可以选择把自己常用账户加入debian-transmission组,即
sudo usermod -a -G debian-transmission ubuntu
usermod是改变用户组的命令,-a -G是在现有组的基础上新加入一个组,debian-transmission是组名,ubuntu是常用用户名,也就是/home/ubuntu/downloaded这个文件夹在修改前所属的用户。使用该命令跟使用chown那个命令是一样的效果。

调教完权限就该设置防火墙了。Linux的防火墙一般是设置放行特定端口,也就是上文中你在各个服务的conf文件里设置的port XXXX和LISTEN XXXX。把XXXX这里的数字填入防火墙放行,来自外部的连接就能正常建立了。防火墙命令的语法是这样的

sudo iptables -I INPUT -p tcp --dport XXXX -j ACCEPT
或者像ufw这样的防火墙更简单一点是
sudo ufw allow XXXX

这两句的意思都是放行XXXX端口,根据你的系统使用哪个防火墙来定

如果你能看到这里,说明你应该对NAS上Linux的大致设置方法有了一定的映像。我稍微来总结一下:先是在服务器端 安装——配置——运行 服务,然后是 调端口——调权限——防火墙。等你熟悉了这两个流程,你就应该能顺利应对NAS搭建过程中的绝大部分问题了。(实际上不止NAS,你如果掌握得好甚至已经能直接搭服务器了,毕竟Linux就这点东西….)

如果看我啰嗦了这么多你依然有兴趣,那欢迎你收藏我的博客,之后我会陆续写一些NAS的具体搭建教程以及原理。
也欢迎加我的联系方式,我会提供一些力所能及的帮助。