上一篇《自组NAS折腾(一)》发布至今,已经一月有余,主要介绍了我对NAS的基本诉求,以及硬件选型。在文章的结尾处,我提到,之后会介绍一下系统架构设计及软件选型。怎奈最近一个月,比较忙碌、并无心气把软件这部分完完整整写下来。最近终于可以坐下来安安静静开始写一写这块的内容了。
言归正传,下面我就来介绍一下,在这个硬件平台上,我是如何思考网络、系统架构并对其进行设计的。
1. 虚拟化方案选型
从整体来看,当前自组的这个NAS平台性能并不差,如果直接在这个硬件平台上安装NAS系统的话,可玩性比较差,虽然现在很多成品的NAS系统提供了很多扩展能力,比如,在系统之上安装各种插件实现诸如对象存储、多媒体服务、智能家居服务等;很多NAS系统也提供了虚拟化的能力,可以在系统上安装虚拟机来增加系统的可玩性。但是,这种虚拟化方案相关资料很少,遇到问题没有参照,难以快速解决。另外,在系统设计中有一个原则:一个工具仅用于做一件事儿,解决一类问题,不要将过多功能继承在一个工具中,这样会提高系统的复杂度,增加系统的运维成本,降低可靠性,也并不能充分利用硬件的资源。考虑到这一点,再加上对可玩性的考虑,本次采用虚拟化的方案——在硬件及NAS系统之间安装一个完备支持虚拟化的宿主机,将NAS系统作为虚拟机,运行在虚拟化环境中,未来如果有其他需要,也可以直接在虚拟化环境中创建新的虚拟机,从而实现系统的横向扩展。
目前,现成的虚拟化的解决方案比较多,比如ESXi、Proxmox VE、TrueNAS、unRaid等。其中TrueNAS、unRaid这两个系统,本质是为了NAS而生的,并非专门的虚拟化系统,因此不在本次选型的范围内。对于ESXi和Proxmox VE,我们可以简单对比一下:
ESXi | Proxmox VE | |
---|---|---|
内核 | VMWare专有内核 | 基于Debian |
资源占用 | CPU损耗1%~6% | CPU损耗1% |
易用性 | 较为易用,操作简洁 | 操作界面简单、易用,配合命令行可以实现较为复杂的功能 |
硬件兼容性 | 相对较弱,主要面向专业的服务器硬件 | 本质上为Linux系统,兼容性较好 |
授权 | 首次免费试用60天,免费注册后会有功能限制,一年授权¥1700 | 可以免费使用,付费用户可以享受到官方稳定源等支持 |
考虑到自己有几年Linux系统的使用经验,对系统的操作相对熟悉,也喜欢折腾,因此ProxmoxVE看起来比较适合我。
PS:在选型时,我更偏向于成熟的开源软件,可能是因为可玩性高,能够折腾。
2.宿主机系统安装
这一部分我不打算细说,因为ProxmoxVE的安装教程网上一抓一大把,没有太大细说的必要。当然,提到PVE的安装,就不得不提一点,安装之后,默认的硬盘会主要被分割成两个部分,这两个部分都是基于LVM机制的,方便未来对系统的存储容量进行调整。一部分为“local”,另一部分为“local-lvm”。其中local主要默认存储的是系统的镜像文件,而local-lvm是基于lvm-thin的,主要用于存储虚拟机系统盘等。
在安装好PVE之后,我们默认可以通过“https://{宿主机}:8006/”访问虚拟机管理界面,对宿主机上运行的所有虚拟机进行管理。
当前最新版的PVE主要支持两种虚拟化技术,一种是基于KVM的虚拟机,另一种是基于LXC的容器。关于这两种虚拟化的技术,我不在此多说,网上有太多对这两者对比的文章。
3.虚拟机系统安装与配置
我们在硬件平台上安装PVE后,理论上,我们可以在这个宿主机上安装任意的虚拟机来满足不同的需求。在最初我们搭建这个硬件平台其实就是为了实现文件共享等NAS相关的功能,因此我们首先需要安装NAS系统。
其实作为一个NAS系统,最主要、也最核心的的功能就是文件共享,围绕着文件共享这个功能,其实还衍生出很多其他的需求,比如离线下载、私人网盘、家庭多媒体系统、数据保护、系统监控等等。这每一个功能,其实目前都有各种开源的或者商业的软件,比如,我们可以只用安装一个Linux系统的发行版(Debian、Ubuntu等),在此基础上,为了实现文件共享,我们可以安装Samba;为了实现离线下载,我们可以自己安装Aria2等等,其实各种现成的NAS系统很多也是用的现成的工具。可以发现,这种完全自主选择确实给我们带来了极大的灵活性,可以随意定制,很自由。但是这种也带来了很大的一个问题,就是所有的功能都得自己调配,表面上我们似乎只要像搭积木一样就可以实现任意想要的功能,实际上,随着我们安装的工具越来越多,我们需要花费大量的时间解决权限、防火墙、更新等各种各样的问题,这极大的增大了我们的运维成本。基于以上考虑,我们决定安装一个现成的NAS系统。
目前现成的NAS系统很多,unRaid、TrueNAS、TrueNAS Scale等,由于我们的内存支持ECC,TrueNAS Scale也是基于Linux的,免费,因此最终选择了这个系统。
安装TrueNAS Scale系统如何安装的就在此不细表了。在系统安装完成之后,为了能够更好的发挥硬件的性能(毕竟我们有两个万兆网口、4个6T的企业级硬盘),保证数据传输性能及读写速度,我们打算将其中一个万兆网卡和一个SATA控制器直通给NAS系统,完全由NAS系统控制。为了实现这个功能,需要做以下几件事:
3.1. 开启宿主机IOMMU
进入PVE管理页面,进入PVE的Shell,或者直接利用SSH进入PVE的命令行。使用nano或者vi打开 /etc/default/grub,找到变量 GRUB_CMDLINE_LINUX_DEFAULT 注释掉,如果当前宿主机使用的是Intel的CPU,则将GRUB_CMDLINE_LINUX_DEFAULT 变量改成如下值:
1 | GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on" |
如果宿主机的CPU是AMD,则将GRUB_CMDLINE_LINUX_DEFAULT 变量改成如下值:
1 | GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on" |
保存编辑的内容。然后在Shell中执行如下命令:
1 | update-grub |
该命令执行成功之后,重启宿主机。重启完成之后,为了确保IOMMU已经正确打开,我们再次登陆Shell,执行如下命令:
1 | dmesg | grep -e DMAR -e IOMMU |
如果有输出,则说明IOMMU已经正确打开,否则说明并为正确打开,需要排查问题的原因。
3.2. 检查CPU是否支持VT-D技术
可以拿着当前宿主机的CPU型号,到官网上搜索一下,在技术特性部分即可查看当前CPU是否支持该技术。
3.3 直通指定的硬件
在这一步中,我们就需要正式的将我们指定的硬件设备直通给指定的虚拟机了。
这一步操作非常危险,如果错误地将PVE宿主机启动盘对应的SATA控制器直通给NAS虚拟机,将会导致PVE宿主机无法正常启动,因此,请务必取消虚拟机的开机自动启动,这样即使直通设备搞错了,只要重启一下PVE宿主机即可,因为虚拟机没有设置宿主机开机自动启动,也就不会导致冲突而无法正常开机。
首先,我们登陆PVE宿主机的管理后台,选择我们需要直通的虚拟机,点击硬件标签。然后在页面左上点击添加PCI设备。在弹出的对话框中选择需要直通的设备,并勾选PCI-Express选项,如下图。最后点击OK即可。
这样,我们就把指定一个万兆网卡、插着4个6T硬盘的SATA控制器,直通给了虚拟机。重启TrueNAS Scale虚拟机后,登录TrueNAS Scale管理后台,就可以看到我们直通的一个万兆网卡和4块硬盘了。
特别说明一下,直通之后的PCIe设备是无法再通过PVE宿主机管理的。也就是说,对于网卡这种设备来说,一旦直通,就不能再PVE的管理后台看到流量情况了,因为该设备已经完全被TrueNAS Scale虚拟机接管了。
完成硬件直通之后,我们就可以愉快地在TrueNAS的管理后台中设置存储池、设置网卡IP、打开文件共享服务、安装各种插件来扩展增加我们的NAS系统了。
对于我自己的这个NAS来说,我主要做了以下几个配置:
- 将4块6T硬盘组成了一个磁盘阵列,冗余级别为RAIDZ2;
- 开启了一系列硬盘保护任务:磁盘阵列一致性校验;快速SMART测试;长期SMART测试;关键数据集快照;
- 开启了Samba服务,用于与手机、电脑等设备共享文件;
- 开启了NFS服务,用于与宿主机及各个虚拟机内共享数据及文件,并不对外部系统提供服务;
- 安装了nextcloud私人云盘服务,用于自动共享各种照片、文档;
- 安装了aria2服务,用于离线下载;
- 安装了netdata服务,用于监控NAS虚拟机各项运行指标。
PVE宿主机上除了安装TrueNAS Scale虚拟机外,还安装了以下几个虚拟机:
- Windows系统:作为沙箱,用于临时安装不受信任的Windows专有软件;
- Ubuntu系统:作为编译机,安装了一些工具链,用于编译各种开源软件;
- Home Assistant系统:作为智能家居中枢,用于控制各种智能家居设备(以后有机会会单独介绍Home Assistant的使用);
- OpenWRT系统:作为旁路由,上面搭建了透明代理及反向代理,用于自由上网及打洞(以后也会单独开一篇博客介绍)。
为了每次在折腾的时候没有后顾之忧,在PVE宿主机管理后台开启了每天定时备份任务,会将全部虚拟机备份一遍,并保存最近5天的备份记录。即使虚拟机折腾挂了,也可以轻松会退到前一个正常时间点。
这个主机整体的系统结构如下图所示:
从上图中,其实可以发现,我们的硬件配置为6C32G,但是PVE上所有的虚拟机总配置已经达到18C36.5G,严重超售。但是PVE宿主机上运行的虚拟机系统中,除了TrueNAS Scale、Home Assistant、OpenWRT需要7*24全天候运行外,其他两个系统并不会长期开机,仅在需要的时候才会开机。此外,实测这三个全天候运行的系统,日常CPU消耗在15%以下,整体内存占用也小于32G。这三个系统也不会有CPU密集型的任务,即便某个虚拟机偶尔CPU密集型的任务运行,也是错峰的,出现多个虚拟机同时执行CPU密集型的任务的概率极小。
最后
本次主要介绍了这个自组NAS系统的软件结构。其实从上面的介绍来看,这个系统已经超越了常规意义上的NAS系统,因为在引入了ProxmoxVE之后,我们不仅可以在上面安装各种NAS体统来实现NAS的相关功能,还可以通过安装其他虚拟机的方式自定义其他功能,因此我个人认为,这已经可以称之为all in one的主机了,也契合我之前希望折腾的愿望。
其实本次还想介绍一下,这个主机以及家里现在的网络结构的,但是限于篇幅,本次就先不讲了,放在下一篇来重点介绍这部分内容。
好了,就这样吧~🤪