编辑中 把折腾进行到底——我的高性能家用NAS搭建之二:软...
本帖最后由 阿崔 于 2018-3-27 16:16 编辑上篇
4 软件
4.1 前言
这篇文章作为硬件篇的后续,本来应该在去年完成,但是由于作者懒癌晚期,就算看到之前有坛友从自组服务器变成给群晖做贡献,依然怀着内疚之情拖到今年春节才算完成。当然了这期间系统也有了不少升级,性能和易用性都得到了不小的提升。
4.2 设计
这个在前文中已经介绍过了,在新系统中随着后续应用,一个是因为网络性能,使用proxmox替换掉了ESXi,iSCSI的4k性能提升了大约30%。另一个是发现了可以和OnlyOffice整合的Nextcloud。整体系统架构如下。
4.3 网络
从安全和易用性的角度,把家中的网络分为几大部分:
[*]台式机
[*]智能家居
[*]网络设备管理
[*]无线设备
[*]访客网络
[*]打印机
[*]iSCSI存储网络
结构如下:
4.4 虚拟机系统
4.4.1 简介
使用基于KVM的Proxmox VE。相比同样免费的VMWare的ESXi,尽管在易用性上有所缺失,但是在网络性能和功能上都要好于ESXi。
4.4.2 安装
从 https://www.proxmox.com/en/downloads/category/iso-images-pve 下载PVE的ISO,当前最新版本为5.1。
如果使用服务器主板,可以用管理界面自带的虚拟光驱远程安装。
首先选择第一项安装Proxmox VE。
然后选择系统安装位置。默认会把对应设备按ext4+LVM进行分区,如果需要其他选项(比如ZFS的Raid 1),请点击options按钮进行设置。
之后会让你选择所在地区、系统时区和键盘设置。
再下面是设置root密码和邮件地址。配置正确之后系统会向对应邮箱发送一些重要的事件提醒。
最后是管理网络设置,这里是未来Proxmox VE Web管理界面的地址,推荐和常用网络分开。
全部完成后等待安装完成重启。
然后前往之前配置的地址所在的Web管理界面进行后续配置(端口8006)
登录后会提示没有订阅,不用管
4.4.3 网络配置
根据我使用的主板和交换机,我使用LACP聚合NAS上的两个千兆端口来同时提供Web管理界面和FreeNAS上的存储以及Ubuntu Server提供的其他服务。万兆端口将直接把PCI设备Passthrough给FreeNAS,用于提供iSCSI服务。Ubuntu Server通过本地桥接访问FreeNAS。网络结构如下。Proxmox VE提供了Linux桥接和Open vSwitch两种方式配置网络。考虑到配置的方便性和扩展性,这里我使用Open vSwitch方式配置网络。
[*]安装Open vSwitch
Debian自带的Open vSwitch据说基本不可用,所以我们需要使用Proxmox提供的版本。点击Shell(JS)进入Proxmox VE的命令行。依次执行如下命令:
[*]wget -q -O- 'http://download.proxmox.com/debian/pve/dists/stretch/proxmox-ve-release-5.x.gpg' | apt-key add -
[*]echo "deb http://download.proxmox.com/debian/pve stretch pve-no-subscription" > /etc/apt/sources.list.d/pve-no-subscription.list
[*]apt update
[*]apt install -y openvswitch-switch
[*]创建网络
首先删除默认的 vmbr0
建立两个OVS Bridge,一个 vmbr0 用于聚合的千兆端口,另外一个 vmbr1 用于同一物理节点下不同系统间的通信。除了名字的所有选项均先设为空。
然后建立一个OVS IntPort,用于管理端口的vlan tag为50的 vlan50 ,对应OVS Bridge为 vmbr0 ,地址为管理端口所需地址。
之后再建立一个OVS IntPort,名字为 internal ,对应OVS Bridge为 vmbr1 ,用于该物理节点下不同系统间通信,地址和其他网络不重复即可。
最后建立一个OVS Bond,名字为 bond0 ,聚合模式为 LACP(balance-slb) ,slaves一项填两个千兆网口对应的名字,中间用空格分开,这里为 ens18 ens19 ,对应OVS Bridge为 vmbr0 。
然后修改DNS设置,把DNS服务器的IP地址填对。重启物理机之后使用刚才配置的管理地址访问Web管理界面。
4.4.4 开启PCI Passthrough
[*]修改GRUB设置
先执行
nano /etc/default/grub
找到 GRUB_CMDLINE_LINUX_DEFAULT="quiet" 一行,改为 GRUB_CMDLINE_LINUX_DEFAULT="quiet intel_iommu=on"
如果是AMD CPU,改为 GRUB_CMDLINE_LINUX_DEFAULT="quiet amd_iommu=on" 然后根据下方提示按 Ctrl+x 再按 y 键和回车键存盘并退出。
之后执行
update-grub
[*]增加需要的内核模块
执行
echo -e "vfio\nvfio_iommu_type1\nvfio_pci\nvfio_virqfd" >> /etc/modules然后重启即可
4.4.5 添加磁盘
[*]通过节点的磁盘一项找到对应的设备名称,这里是 /dev/sdb 如果是NVMe设备,那么就是类似 /dev/nvme0n1 这种名字;
[*]打开节点的命令行窗口;
[*]执行 sgdisk -N 1 /dev/sdb
或者 sgdisk -N 1 /dev/nvme0n1
在新磁盘中创建分区;
[*]执行 pvcreate -y -ff /dev/sdb1
或者
pvcreate -y -ff /dev/nvme0n1p1
创建LVM物理卷;
[*]执行 vgcreate vmcache /dev/sdb1
或者 vgcreate vmcache /dev/nvme0n1p1
创建名为 vmcache 的LVM卷分组;
[*]执行
lvcreate -L 400G -T -n cachepool vmcache
创建名为 cachepool 的大小为 400G 的LVM-thin存储池;
[*]执行 pvesm add lvmthin cache-lvm --thinpool cachepool --vgname vmcache --content images,rootdir
创建名为 cache-lvm 的,用于存放虚拟机镜像和LXC容器的存储空间。
4.4.6 UPS配置
这里以APC支持USB通信的UPS为例,其他型号配置请参考NUT的文档。
[*]执行 lsusb
确认UPS已经通过USB连接上;
[*]执行 apt install -y nut
安装NUT;
[*]执行nano /etc/nut/ups.conf在最后添加:
driver = usbhid-ups
port = auto
之后按下方提示退出并保存。执行
upsdrvctl start
,如果 ups.conf 没有问题的话,会显示驱动版本号并回到命令提示符。如果反复显示 Driver failed to start 那么就是配置有问题或者UPS不支持,按 Ctrl+c 终止执行。
[*]执行 nano /etc/nut/upsd.conf
找到 # LISTEN 127.0.0.1 3493 这样一行,去掉前面的 # ,然后按下方提示退出并保存;
[*]执行
nano /etc/nut/upsd.users
在最后添加:
password = blahblah
upsmon master
之后按下方提示退出并保存;
[*]执行 nano /etc/nut/upsmon.conf
找到 # RUN_AS_USER nut 删除前面的 # 。找到 # MONITOR myups@localhost 1 upsmon pass master(or slave) 在下面一行添加MONITOR mainups@localhost 1 upsmon blahblah master 。然后按下方提示退出并保存。
[*]执行 nano /etc/nut/nut.conf
把 MODE=none 替换为 MODE=standalone 。然后按下方提示退出并保存。
[*]执行
systemctl start nut-server ;
[*]执行 upsc mainups@localhost
测试
如果 ups.conf 和 upsd.conf 都没问题就会显示相应的UPS信息,否则请修改配置文件。
4.5 操作系统
4.5.1 FreeNAS
[*]安装
首先从 http://www.freenas.org/download 下载最新版的FreeNAS,目前最新版是11.1-U2。
然后在虚拟机环境的Web管理界面找到名为 local 的存储,点击上传按钮,上传内容选择 ISO image,文件选中刚才下载好的文件,开始上传。
然后开始创建FreeNAS的虚拟机,名字填freenas。
这里ISO 映像选刚才上传好ISO文件,类型选 Other 。
硬盘设置里面总线/设备选 SCSI ,存储选 local-lvm ,磁盘大小16G就够了。
然后CPU核心数根据实际情况选填,一般4就可以了,我这里填成8。
内存大小填65536,也就是64G。
网络设置使用桥接模式,网桥选之前建立的 vmbr0 。网卡型号更换成 VirtIO 以达到最高性能。
确定全部配置正确之后就可以创建虚拟机了。
之后进入虚拟机的硬件设置,先把显示从默认改为 SPICE 。
然后添加用于节点内部通信的基于vmbr1 的网卡,网卡型号仍然使用 VirtIO 。
然后进入选项设置,把BIOS从 默认(SeaBIOS) 改为 OVMF(UEFI) 。
然后回到硬件设置,添加一个 EFI Disk ,存储位置 local-lvm 。
之后回到节点的Shell界面,在里面执行
lspci
找到需要由FreeNAS直接控制的设备,我这里是一个NVMe的SSD,一个万兆网卡,和LSI的9211-8i接口卡。记下他们的所在行最前面的数字ID,这里分别是 01:00.0 、 03:00.1 和 05:00.0 ( 03:00.0 准备用在提供上层服务的ubuntu server上面)。
然后在节点的Shell里面执行
nano /etc/pve/qem-server/100.conf
编辑FreeNAS虚拟机的配置文件。在里面添加如下内容:
hostpci0: 05:00.0
hostpci1: 03:00.1
hostpci2: 01:00.0
这样这些设备就会在启动后由FreeNAS直接控制。
最后检查一下硬件设置
选项设置
然后点击 启动 就可以开始安装FreeNAS了,点击控制台进入操作界面。安装过程非常简单,这个大家可以在网上搜索教程,我就不特意写了。
[*]网络配置
登录之后默认会开启向导,直接退出即可。
先进入系统->常规里面更改语言选项。
然后在网络->网络接口->添加网络接口里面给各个网卡添加对应的IP地址,推荐写成固定的,避免DHCP服务器重启或者宕机时候影响整个系统。
推荐WebUI跑在独立VLAN上,减少安全风险。
使用网络->VLAN->添加VLAN给对应网卡添加VLAN。
然后使用网络->网络接口->添加网络接口给新添加的VLAN指定IP地址。
最后在系统->常规里面,把WebGUI使用的IP地址修改成VLAN所在地址。
[*]ZFS配置
使用存储器->卷->卷管理器创建新的存储池,对于小规模的NAS,推荐使用RaidZx形式。尤其是桌面/NAS硬盘,出于对数据安全的考虑y,超过4盘之后推荐使用RaidZ2以上的阵列形式。可以把额外的SSD作为读缓存(L2ARC)使用,以此做到对常用数据的快速访问。
注意,由于ZFS的工作原理,对于家庭应用,不推荐给阵列使用写缓存(ZIL)。
我的NAS最后的结构是一个使用6盘的RaidZ2+500G NVMe SSD的读缓存的主阵列 base。
一个使用双盘互为镜像的备份阵列 backup。
[*]SMB共享
SMB共享也就是Windows共享,由于不管是Linux、OSX、Windows还是手机,都对它有很好支持,
所以一般在家庭中作为主要共享方式使用。
使用存储器->卷->/mnt/base->创建数据集来创建共享所用的数据集,我这里有一个用于存放软件、游戏、文档之类的Public,一个用于存放多媒体文件的Multimedia,和一个用于存放用户数据的users。共享类型全部为windows。
然后使用共享->Windows(SMB)共享列表->添加Windows(SMB)共享来给每个数据集创建对应的SMB共享。
注意users要勾选用作主目录共享。这样会给每个用户在访问SMB的时候都会有一个专属于自己的共享目录。
然后使用账户->所有用户->添加用户来添加可以登陆的用户。
之后就可以使用任意一个地址和用户名/密码访问SMB共享目录了。
[*]NFS共享
NFS主要用于Unix主机访问,性能要好于SMB,但是兼容性较差。我这里主要用于存储docker、sage和一个Linux桌面系统的数据。
还是先用存储器->卷->/mnt/base->创建数据集来创建NFS所用的数据集,注意这里共享类型要选成UNIX。
使用共享->Unix(NFS)共享列表->添加Unix(NFS)对象来创建NFS共享。
注意,对于需要支持root用户的NFS共享来说,由于FreeNAS和Linux的root不太一样,需要把高级模式里的Maproot用户设为root,Maproot组设为wheel。另外NFS是根据uid和gid来分配权限的,所以使用同一个NFS的不同主机,相同的用户需要有相同uid和gid。
[*]iSCSI共享
和其他共享方式不一样,iSCSI是把存储作为块设备共享出去的。在使用iSCSI的系统中,iSCSI是作为一个类似硬盘的设备来使用的。所以iSCSI有着最高的性能,但是跨系统的兼容性也最差。比较适合给各种设备提供中心化的硬盘,比如家里的游戏电脑和HTPC,完全可以就装一个用来启动系统的小容量ssd,然后使用万兆网和iSCSI共享来为这些设备提供大容量存储,这样每个设备都有相当于有了一个大容量/高可靠性/高性能的ZFS阵列,减少了很多维护上的复杂性,设备也不用再考虑硬盘位的问题。
为了达到最高性能,iSCSI需要的在存储中建立zvol,使用存储器->卷->/mnt/base->创建zvol来完成。如果不是对性能有特别极端的需求,可以勾选松散卷一项,这样会根据实际使用情况来分配占用的存储空间。可以更有效的利用存储。
iSCSI中有几个特别的名词,Initiator就相当于其他共享协议中的客户端,Target相当于一个共享对象,Portal是用来进行用户授权和列出所有可用Target的服务。所以一个简单的iSCSI共享需要至少一个Portal和至少一个Target,以及一个Initiator组用来确定可连接的设备。
使用共享->阻止(iSCSI)->Initiator->添加Initiator,来添加新的基于IP地址和名称的对iSCSI客户端的认证。
然后使用共享->阻止(iSCSI)->Portals->添加Portal,来创建新的Portal。
之后使用共享->阻止(iSCSI)->Target->添加Target,来创建新的Target,Portal组ID和Initiator组ID分别使用刚才创建的两个。
然后使用共享->阻止(iSCSI)->Extent->添加Extent,来创建新的Extent,Extent类型选设备,设备选刚才创建好的zvol共享。
最后用共享->阻止(iSCSI)->Target/Extent->添加Target/Extent来把Target和刚刚创建的Extent关联起来。
需要更灵活权限控制的情况下,可以使用共享->授权访问->添加授权访问来创建新的认证规则,然后把Portal的发现认证组以及Target的认证组编号设为对应的认证规则,Target的认证方式根据实际情况选择。
[*]维护任务
待完善
4.5.2 Ubuntu Server
[*]安装
[*]网络配置
[*]挂载FreeNAS共享
4.6 应用
4.6.1 Docker
[*]安装
[*]Aria2
[*]NextCloud
[*]Onlyoffice整合
[*]Draw.io整合
[*]Plex
[*]Ubnt Network Manage System
[*]Home Assistance
4.6.2 Sage
4.6.3 Ubnt UniFi Contoller
二楼用于答疑 很高级,英文的完全看不懂![雷人] 前排支持 前排收藏了,今年准备跳进NAS的坑[偷笑] 收藏收藏!大神,orz一个。看看自己家里的nas,简直low到底了。
收藏收藏 细细的看 期待后面的教程,对后面Docker的内容非常期待,大神加油! 等看,学习
家里的4盘位已经满了,升级无头绪中 [偷笑]我的6800k可以用起来了。 拓扑图要是能把图标再美化一下的话。。。 那么多VLAN ? 楼主用三层交换,还是单臂路由器? 完全看不懂,但很高大上。 虽然我看不懂,仍然感觉到很厉害的样子 阿崔 发表于 2018-2-25 04:03
二楼用于答疑
这是干嘛的?好复杂,我以为是群辉啥的
我家用一个PC做了个SERVER,现在除了做NAS和HTPC外,我想不出还能做点什么。。。。。。。。。。 硬件篇呢 我咋没找到啊 楼主 不错,感谢提供新思路
虽然我用esxi,还是支持一下! 编辑完了和我说~ 原来nas这么复杂啊,还是发点硬件照片让我先有个直观认识吧,毕竟我是交换机和路由器都没分清楚的人 很佩服楼主的精神,去年我也想自己搭一台 最后还是屈服买了个屏蔽牌 az6338890 发表于 2018-2-26 14:25
看不懂看不懂。。。。只会用services2012开smb
和你一样,最近纠结要不要干掉2012,干脆弄成WIN10算了 太高端了,单一个英文界面就让易用性大打折扣,我还是老实用群晖。 我觉得这应该是门户啊,完全看不懂,但是感觉好厉害~ [困惑]好高端啊,完全看不懂,装了个SERVER 2016,弄了两天NFS共享搞不定,客户机连接一直显示网络错误53,用iscsi又不是一般的卡,第一次搞给搞懵了。 太复杂了。。。楼主都主要有些什么应用?我觉得家庭的使用需求群晖足够了[狂笑] 技术贴! 高端技术贴。。。厉害!