NAS 系统调研

本文最后更新于:2021年12月12日 下午

NAS(Network Attached Storage:网络附属存储)按字面简单说就是连接在网络上,具备资料存储功能的装置,因此也称为“网络存储器”。本文调研相关内容。

简介

NAS(Network Attached Storage:网络附属存储)按字面简单说就是连接在网络上,具备资料存储功能的装置,因此也称为“网络存储器”。它是一种专用数据存储服务器存储服务器)。

  • NAS被定义为一种特殊的专用数据存储服务器,包括存储器件(例如磁盘阵列、CD/DVD驱动器、磁带驱动器或可移动的存储介质)和内嵌系统软件,可提供跨平台文件共享功能。NAS通常在一个LAN上占有自己的节点,无需应用服务器的干预,允许用户在网络上存取数据,在这种配置中,NAS集中管理和处理网络上的所有数据,将负载从应用或企业服务器上卸载下来,有效降低总拥有成本,保护用户投资。
  • 它以数据为中心,将存储设备与服务器彻底分离,集中管理数据,从而释放带宽、提高性能、降低总拥有成本、保护投资。其成本远远低于使用服务器存储,而效率却远远高于后者。目前国际著名的NAS企业有Netapp、EMC、OUO等。
  • NAS本身能够支持多种协议(如NFS、CIFS、FTP、HTTP等),而且能够支持各种操作系统。通过任何一台工作站,采用IE或Netscape浏览器就可以对NAS设备进行直观方便的管理。
  • NAS将存储设备连接到现有的网络上来提供数据和文件服务。NAS服务器一般由存硬件、操作系统以及其上的文件系统等几个部分组成。NAS通过网络直接连接磁盘储存阵列,磁阵列具备了高容量、高效能、高可靠等特征。NAS将存储设备通过标准的网络拓扑结构连可以无需服务器直接上网,不依赖通用的操作系统,而是采用一个面向用户设计的,专门用于数据存储的简化操作系统,内置与网络连接所需的协议,从而使整个系统的管理和设置较为简单。

技术特点

  • NAS解决方案通常配置为作为文件服务的设备,由工作站或服务器通过网络协议(如TCP/IP)和应用程序(如网络文件系统NFS或者通用Internet文件系统CIFS)来进行文件访问。大多数NAS连接在工作站客户机和NAS文件共享设备之间进行。这些连接依赖于企业的网络基础设施来正常运行。
  • 为了提高系统性能和不间断的用户访问,NAS采用了专业化的操作系统用于网络文件的访问,这些操作系统既支持标准的文件访问,也支持相应的网络协议,因此NAS技术能够满足特定的用户需求。例如当某些企业需要应付快速数据增长的问题,或者是解决相互独立的工作环境所带来的系统限制时,可以采用新一代NAS技术,利用集中化的网络文件访问机制和共享来解决这些问题,从而达到减少系统管理成本,提高数据备份和恢复功能的目的。

期望NAS实现的功能

私有云盘

将终端产生数据随时上传到NAS中保存,支持FTP等服务,在需要时下载取用,保证流量带宽,安全性,稳定性。这是NAS最基本的功能。

局域网数据访问

在局域网内的电视、手机、平板等设备可以直接访问NAS数据,可以方便地使用NAS内的影视资源。

同步盘

实现类似Dropbox和OneDrive的自动同步功能,对指定文件夹多终端自动同步,修改一处其余自动同步,不需要手动维护数据一致性。

全时段待机

全天候待机,家庭局域网接入互联网,在任何有网络的地方都可以访问NAS数据库。

电源防护

小型UPS电源保护,断电后可以让NAS延迟正常关机,保护硬盘不受损坏,并且支持远程开、关机。

HTPC(Home Theater Personal Computer)家庭影院服务器

有专门的工具管理影视资源,供家庭成员观看。

局域网远程管理

可以借由NAS访问局域网内所有设备,包括路由器打印机等。

开源系统

解决方案有商业的和开源的几种,当然还是开源比较有趣了。

虚拟化

让一台物理机可以安装多个不同的隔离的操作系统。

软路由

软路由是指利用台式机或服务器配合软件形成路由解决方案,主要靠软件的设置,达成路由器的功能;而硬路由则是以特有的硬设备,包括处理器、电源供应、嵌入式软件,提供设定的路由器功能。

安全性

数据备份,电源安全,可以恢复、重建数据。

闭源NAS系统

群晖

中国,上海─群晖科技 Synology® 。群晖网络科技(上海)有限公司将致力于开拓中国市场,為中国地区的使用者提供优质的网络存储解决方案及服务。不是国产,和微软一样的策略(允许盗版,打压国内nas系统。系统方面做的很好,符合中国用户习惯,硬件配置特别差,典型的买系统送硬件。

U-NAS

U-NAS是万由电子推出的一款闭源NAS系创,基于Debian Linux,设计,功能十分强大且易旦显旦用,目前个人用户可免费试用。U-NAS目前的4.0。

版本功能在易用性上和群晖、QANP比较接近,操作人性化,而且支持手机APP。除了基础的存储功能,还支持多媒体视频、相册等等功能,也可以支持虚拟机。

开源NAS系统

FreeNAS

FreeNAS是最老牌的开源NAS操作系统之一,基于以安全和稳定著称的FreeBSD系统开发,由ixsystems公司的技术团队维护。优点是稳定,资源、教程丰富,而且支持Docker,最关键的是它集成了Sun公司的ZFS文件系统,非常适合管理大量可扩展的数据系统。不过它对系统的硬件要求相对高一些,比如需要至少8GB内存,系统资源的消耗也相对大一些,所以需要较好的处理器来配合。

XigmaNas

XigmaNas原来的名称是Nas4free,它是基于FreeNAS 0.7开发的一个分支项目,由原FreeNAS系统的开发者发起创建。其特点是稳定、更新及时,对硬件的要求也低很多,能够支持Vbox虚拟机;缺点是教程比较少,如果出现问题个人解决起来比较麻烦。

OpenMediaVault

OpenMediaVault简称OMV,是由FreeNAS的前核心成员发起的基于DebianLinux的开源NAS操作系统,这个系统的特点是面向家庭用户和小型办公环境设计,而且支持的平台众多,甚至连树莓派都可以安装使用。

它的功能相对比较丰富,着重于多媒体部分的应用,功能插件也很多。而缺点在于稳定性略差,安装出现问题的几率较高。

系统安装

我们需要一个NAS系统来维护数据,这个系统可以直接装在物理机上,也可以装在虚拟机中

方案 A:Nas 直接安装在物理机上,再在 Nas 里装虚拟机

这是最简单通俗的方法,优点是贴近硬件,Nas 直接面向硬件,能够提供更好的数据性能。你买一台成品威联通或者群晖来,他们都自带虚拟化环境,可以往里面安装各种虚拟系统。这是最简单直观的方案了。

那么该方案有什么不足么?当然有, Nas 安装到物理机上后,想在 Nas 系统上面继续安装一套完美的虚拟化环境,几乎是不可能的。Nas 系统定制化太深,你如果想在上面深度折腾虚拟机,会有很多限制。

再者 Nas 系统一般内核版本都是锁定版本的,我那台威联通,至今还是 Linux 4.2 的系统,跑个 KVM 虚拟化环境也用不到最新的内核,享受不了最新的虚拟化技术。

最后你没有办法自由的尝试各种 Nas 系统,比如你如果物理机上面安装一个 FreeNas ,它是 FreeBSD 系统,功能是强了,但是虚拟化就比较麻烦了,FreeBSD 下面没有啥好的虚拟化系统。因此,我们需要方案 B。

方案 B:物理机直接变成 Hypervisor

这个方案是最干净的方案,先在物理机上把虚拟化系统搭建扎实,再在虚拟系统里安装你想尝试的各种 Nas 系统,即使 Nas 被你弄挂了,也可以用各种快照,恢复技术来拯救你的系统和数据,再者 Nas 系统里面各种权限设置,备份任务,各种服务和 App 搭建一次确实不容易,虚拟化以后,今后物理机升级也可以方便的迁移,同时硬件资源的分配也会更加灵活。

至于你在虚拟系统里安装什么 Nas,问题都不大,不管是基于 Linux 的黑群晖,开源的 OpenMediaVault,HP 合作的 ClearOS 还是基于 FreeBSD 的 FreeNas,你在虚拟机里面折腾都安全的多,不会把其他系统弄挂。

虚拟化方案

最简单的方式把一台物理机变成一台 Hypervisor 当然是安装 Windows,在上面弄个 HyperV,Vmware 再弄点随即启动什么的,或者弄点 vShpere。这样也可以,至少你没有用 VirtualBox 这些业余方案,但是 VmWare 系列限制也很多,非开源软件,免费版有 vCPU 数量限制,同时 VmWare 不支持类似 virtio 或者 vGPU 之类的事情。

更专业点的做法,当然是上 KVM 系统,该系统同 Vmware 之类的比较我不想多说了,就讲一点,今天不管阿里云,腾讯云还是境外 Linode / Aws 全部都跑在 KVM 为基础的系统上,它的应用规模比 VmWare/vShpere 广泛很多,能过够更好的同 Linux Guest OS 结合。

对于 KVM 系统,最弱智的玩法是 Ubuntu 桌面下面安装个 Virt Manager,然后像 VmWare 一样用,最专业的玩法当然是基于 OpenStack 和自己开发。对于个人用户,前者太过简陋,后者又太过复杂。所以对于个人用户推荐 Proxmox VE,具体可以参考大佬的问文章:

韦易笑:KVM 虚拟化环境搭建 - ProxmoxVE

它基于 Debian,并使用了最新 Linux 内核和硬件驱动,直接刻录好碟/USB在裸物理机上安装就行了,然后通过 Web 界面来管理你的虚拟机。对于爱折腾的人,可以看:

韦易笑:KVM 虚拟化环境搭建 - WebVirtMgr

在 Debian/Ubuntu 上采用开源方案,从零搭建一套类似 Proxmox VE 的系统。不管选择什么方案,花点时间将虚拟化系统摸清弄透,能够让你后面各种 Nas 的 Guest OS 稳定高效的运行。

性能损耗

KVM 系统对性能的损耗只有 1%-2%。

虚拟机都是基于 Intel VT-x 技术的,物理机 Hypervisor 其实运行在 vmx 的根模式下面,而虚拟机的每个 vCPU 则运行于非根模式中,每个 vCPU 通过一个独立的 VMCS 寄存器来描述,相当于沙盒环境,物理机通过一条 VMLAUNCH/VMRESUME 从根模式切换到虚拟机的非根模式,执行 vCPU 里面的指令,当需要发生 I/O 或者中断/异常时,又会退出回 Hypervisor 的根模式下。

所以各种 CPU 密集的运算,都是 vmx 的 vCPU 沙盒里跑的,相当于物理 CPU 执行正常指令只是环境变了一下而已,基本没啥损耗,这部分 KVM 的 vmx vCPU 调度是直接实现在内核里面的,性能做的不错。唯一就是 I/O 时需退出 vmx 跑回物理机处理,这是在所难免的事情,KVM 的好处是提供了 virtio,如果 GuestOS 支持 virtio(比如都是 linux 系统,或者 Windows 安装 virtio 驱动),这个操作可以绕过很多不必要的硬件模拟,在物理机上更高效直接的实现。

Raid / ZFS 安装方案

如果你是硬件 Raid,那么没得选,肯定是跑在物理机上面的,但是个人用户,一块入门 raid 卡基本要两千元,你是土豪当我没说。从成本角度考虑,软件 raid 现在已经很成熟了,威联通和群晖这些都是 linux 软件 raid ,一个 mdadm 程序做一些封装而已,一用用了好几年,也没见消费者反馈什么问题。

在物理机上直接跑 Raid/ZFS 最简单直接,虚拟机里的 Nas 系统需要硬盘了,就在物理机的 Raid/ZFS 分区里创建几个 qcow2 的磁盘映像文件,比如 200G 一个,创建好了扔给虚拟机系统就行,qcow2 扩容也方便。

如果你使用 Proxmox VE 系统,它直接支持 ZFS,你可以组建你的 zpool,然后在 Proxmox VE 的网页上就可以直接管理它,在上面新建虚拟机存储镜像。如果你用其他虚拟化方案的化,可以用 mdadm 或者自己安装 zfs。

对于个人使用,没必要所有存储设备都上 Raid,你有四块硬盘的话,可以用两块上 raid1 存重要数据,另外两块上 raid0 存非重要数据,物理机上最好弄一块单独的 ssd 装物理机操作系统,剩余空间还可以给虚拟机装操作系统,四块单独的硬盘就全部用来存储数据。

这个方案唯一问题就是一堆 qcow2 的文件,始终隔着一层,有些影响性能,同时不太好做一些关于 raid 的系统性实验,你要在物理机里折腾 raid,弄出问题来,下面一堆虚拟机都可能跪了。所以如果你想把 raid / zfs 从物理机隔离出来,放到虚拟机里直接接管,追求极致性能的话,你需要用到存储设备透传。

虚拟系统里做 Raid 需要注意哪些问题

如果选择虚拟机做 Raid 请注意缓存模式选择 writethrough 或者 none,不要用其他模式,这样可以保证虚拟机里面想写磁盘时,外面物理机会真的立马让它写盘,而不是物理机再缓存一次,物理机再缓存一次的风险就是,虚拟机里面的 zfs/mdraid 以为自己写到了磁盘里了,但是其实并没有,只是写到了物理机的缓存里,此时一掉电或者故障,数据就挂掉了。

除了虚拟机里在 qcow2 磁盘镜像上创建 Raid 外,性能更好的当然是用 KVM 的存储设备透传,将几块物理硬盘设备直接传递给虚拟机里面的 Nas 系统来管理,这样能获得最好的性能。在 libvirt 里,配置你的虚拟机 xml 文件,加入:

1
2
3
4
<disk type='block' device='disk'>
<source dev='/dev/disk/by-id/ata-Corsair_CSSD-F120GB2_1109650632000461003B' />
<target dev='hdc' bus='virtio' />
</disk>

即可把物理机的物理硬盘/物理分区,直接透传给虚拟机的 hdc 设备。如果你用 Proxmox VE 的话,可以参考下文,将一块西数 4T 的硬盘透传给虚拟机的 FreeNAS 系统:

The Proxmox VE KVM-based All-in-One with FreeNAS

就是直接网页上点点鼠标就完成设置了,十分方便。

如何透传其他设备?PCI 透传有什么用?

上面说了存储设备透传,其实 Nas 系统中 USB 设备也是很重要的一个环节,你经常要插一块移动硬盘/U盘到 Nas 上,做点备份什么的。此时虚拟机中的 Nas 系统就需要用到 KVM 的 USB 透传同能了,操作起来和上面的存储设备一样简单:

现在物理机中查看 USB 设备:

1
2
3
4
5
6
7
8
$ /sbin/lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 005 Device 012: ID 0a5c:2110 Broadcom Corp. Bluetooth Controller
Bus 005 Device 003: ID 0483:2016 SGS Thomson Microelectronics Fingerprint Reader
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

然后配置 libvirt 的虚拟机 XML:

1
2
3
4
5
6
7
8
9
10
11
12
13
<domain type='kvm'>
<name>windowsxp</name>

<devices>

<hostdev mode='subsystem' type='usb'>
<source>
<vendor id='0x0a5c'/>
<product id='0x2110'/>
</source>
</hostdev>
</devices>
</domain>

把设备号配置进去,比如你可以把你物理机前面板的两个 USB 口透传给你的 Nas 用,以后这两个口插入设备的话 Nas 就能响应。Proxmox VE 里面设置的话也类似,见它 wiki:

USB Devices in Virtual Machines

大部分时候透传存储设备和 USB 基本已经满足需求了,KVM 支持任意 PCI 设备透传给虚拟机,具体可以自行搜索 “KVM PCI passthrough",可以彻底满足你的各种硬件需求。

除了透传 PCI 设备,KVM 还支持透传 GPU 给虚拟机,可以用来跑一些 GPU 加速的转码服务,或者在虚拟机里面跑一个 CUDA 显卡挖矿之类的程序,有兴趣可以搜索相关文档。

物理机和虚拟机如何共享文件夹?

不管是 KVM 还是 VmWare,都支持将物理机上的某个文件夹共享给若干台虚拟机来访问,只不过 VmWare 的化,还需要在 GuestOS 里面安装 vmware 的驱动程序套件,用 KVM 的话,如果 GuestOS 是 Linux 的话,根本不需要额外的驱动程序。

物理机下面先配置下 XML:

1
2
3
4
<filesystem type='mount' accessmode='mapped'>
<source dir='/home/data/kvm/kfs'/>
<target dir='kfs'/>
</filesystem>

然后物理机准备一下共享目录:

1
2
sudo mkdir /home/data/kvm/kfs
sudo chown libvirt-qemu:libvirt-qemu /home/data/kvm/kfs

注意上面共享目录的权限需要和你虚拟机运行权限相同,qemu.conf 里有这个配置,你还可以在物理机 ps aux 看看虚拟机进程所属的用户和组。接下来虚拟机中编辑 /etc/modules 文件,添加下面几行:

1
2
3
4
5
loop
virtio
9p
9pnet
9pnet_virtio

虚拟机内加载内核模块:

1
sudo service kmod start

然后测试 mount:

1
2
sudo mkdir /mnt/kfs
sudo mount -t 9p -o trans=virtio kfs /mnt/kfs

这样,虚拟机中的 /mnt/kfs 就映射到了物理机的 /home/data/kvm/kfs 路径下。

测试成功的话,设置 /etc/fstab:

1
kfs             /mnt/kfs        9p      trans=virtio    0       0

修改完后,mount -a 测试,测试通过重启虚拟机即可。当然实在懒得折腾可以在物理机上启动一个 nfs 服务,然后虚拟机里面 mount 物理机的 nfs 文件夹,实测性能也不错。

容器服务放在物理机上还是虚拟机上?

如今不少 Nas 服务都是以 Docker 的形式提供出来,我的建议是不管 Docker 还是 LXC ,都放到虚拟机里面去管理(虽然 Proxmox VE 支持在物理机上管理 LXC),如果 Nas 系统本身是 Linux 的话,可以直接放在 Nas 那台系统里面启动,这样可以直接跑在 Nas 的各种存储设备上。

有的 Nas 系统支持 web 管理页面上直接管理 Docker 容器,不支持的话,自己动手,现在 docker compose 已经很方便了,一堆 docker-compose 文件放在 github 上,要用的时候克隆下来,顺序 up -d 就启动好了,各种 Volume 也可以通过 Nas 的备份系统定时备份。

参考资料


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!