时隔5个月多,2020年11月换了一个城市打工,每天忙于新工作环境的适应和工作内容的掌握熟悉,再加上我个人没有写日记的习惯,导致博客的基本没有什么有效内容产出,就连这一篇随记也是空闲了下来才想着摸着鱼,一边写一边回忆这一周以来折腾家里原来跑着Windows Server 2019的NAS主机。

正篇

Unraid系统除了拥有一般NAS系统的功能,还能运行Docker、虚拟机,直通硬件也十分方便,并且社区扩展活跃丰富,能添加各式各样嵌入到系统界面的插件,非常适合做全功能一体机的底层系统。

目前家里的主机的所有Docker容器和虚拟机都正常在Unraid内运行,已经稳定运行一个月。

系统安装

网上有很多教程,甚至还有很多盗版教程,系统安装这一部分没有什么需要填坑的地方,需要注意的是如果想入正版Key,一般只能通过正常安装试用Trial key,然后在系统Tools - Registration里点击购买,官网没有相关的购买链接。

NAS

Unraid的NAS部分十分简洁,整个系统按照授权版本限制可加入序列的存储硬盘数量,包括校验盘Parity Drive和缓存盘Cache Drive,但不包括用于启动的U盘。

Shares/共享文件夹

在系统安装完毕后,在MAIN页面可以看到所有被系统识别出来的存储设备,包括启动引导用的USB设备。硬盘序列Array加入硬盘后,需要在下方执行Format格式化才能供Unraid使用。在Array启动之后,Shares页面默认创建几个文件夹,对应的是不同分类文件的存储,并且默认启用SMB方式共享。

appdata:主要存放Docker容器的文件,包括从容器内挂载volume出来的数据

domains:存放一些虚拟机会用到的镜像、虚拟磁盘文件,比如x86软路由的虚拟磁盘img、黑群晖的启动引导文件

isos:系统镜像、安装引导文件等等都存放在这里

system:Docker功能虚拟磁盘的默认存储路径,虚拟机主要虚拟磁盘的存放地方

点击文件夹名字后会进入该文件夹具体的设置页面,需要注意的地方:

Allocation method:

①High-water:以1T+2T+3T举例,当新文件写入的时候,系统会检测一次所有在array里的硬盘剩余容量,以最大容量硬盘的50%容量为基准 (3T÷2=1.5T),随机写入到剩余容量>1.5T的硬盘内(也就是2T和3T的硬盘),等到两个硬盘剩余容量都只剩1.5T,则进行第二次检测,基准变为0.75T,以此类推,系统会优先把文件写入剩余容量最大的硬盘内。
②Fill-up:系统以array中硬盘的顺序依次写入新文件,一般要搭配最小剩余容量使用,不然会引发因空间不足导致的Docker和虚拟机报错运行的问题
③Most-free:系统选取剩余容量最大的硬盘写入,需要注意的是每写入一个文件都会检测一遍各个硬盘的剩余容量,大量小文件写入时可能会大幅度影响array的I/O性能

Minimum free space:该文件夹的最小剩余容量

Split Level:分散目录的层级,默认为自动分散。简单来说就是根据设定的层级锁定文件夹分散到哪个硬盘里,Level 1是在Shares页面创建的文件夹Media,设置Top Level 1意味着Media文件夹可以分散存储到各个硬盘内但后续所有层级的文件夹则固定存储在对应的硬盘内;Top Level 2意味着Media/xxx这两层文件夹都会分散存储到各个硬盘内但后续第三层Media/xxx/xxx以后的所有层级文件夹都被固定存储在相应的硬盘内

Included disks:该文件夹存储包含的物理硬盘,默认为ALL,即新文件写入会随机存储到其中一个硬盘内

Excluded disks:该文件夹存储排除的物理硬盘,默认为None,即不排除新文件写入某一个或几个硬盘内

Use Cache:系统默认有一个每天03:40启动的程序Mover,用来针对这个设置的
①No:不使用缓存盘,即新文件写入到该文件夹时直接写入Array的硬盘内

②Yes:使用缓存盘,即新文件写入到该文件夹时直接写入到缓存盘内,但Mover运行会将文件从缓存盘中转移到Array中

③Only:只使用缓存盘,即新文件一直留存在缓存盘内,即使Mover运行也不会转移数据

④Prefer:该文件夹倾向于使用缓存盘,直到缓存盘剩余容量低于该文件夹设置的最小剩余容量,比如缓存盘120G容量,设置60G最小剩余容量,那么当缓存盘剩余60G的时候,企图写入该文件夹的新文件就会转为直接写入Array中,一般只有存放临时或不重要的文件夹才会设置为这个策略。但个人不推荐使用这种方式,容易导致让启用缓存盘共享文件夹的相关软件因空间不足而报错

Export:No、Yes、Yes(hidden)对应不共享、共享、共享但隐藏显示

Security:
①Public:所有人都可以读写

②Secure:访客只能读取不能写入,可以在下方单独设置每个用户的读写权限

③Private:访客不能读写,可以在下方单独设置每个用户的读写权限

Docker

First of all,Unraid的Docker是可以基本还原大部分容器运行状态的,最起码我个人使用的服务中都能通过详细配置正常使用

更换镜像源

首先当然是给Docker更换源加速下载部署,通过网页界面webui右上角的Terminal或者直接SSH登录进Unraid,新建或修改/etc/docker/daemon.json添加镜像源地址

mkdir -p /etc/docker 
tee /etc/docker/daemon.json <<-'EOF' 
{ 
  "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn"] 
} 
EOF
Docker Template界面

在社区应用内有大量的docker模板提供下载,需要事先下载安装社区应用插件,即Community Applications,整个应用市场都托管在Github上,需要想点办法出国,不然会访问困难

Template

模板,在社区应用APPS页面可以直接下载并加载到该页面并配置好所有东西,手动添加容器,在APPLY运行后系统也会默认将手工配置保存为用户模板,方便下次直接调用修改

Repository

镜像仓库路径可以直接使用docker hub的注册镜像库路径,比如docker pull nginx拉取官方nginx镜像,则在这一行直接填入nginx就可以执行同样的命令

Network Type

网络类型,Docker在启动后默认创建3个驱动分别为bridge、host、null的网络连接,容器默认使用Bridge桥接Unraid的bond0接口

最后一项是核心,可以添加Path、Port、Variable、Label、Device参数,分别对应docker run中的-v、-p、-e、--label、--device,这5个选项就可以基本还原容器运行环境

踩过的坑:

  1. 每一次更改APPLY都是docker stop、docker rm、docker run,在运行比较大的容器时,要注意不能关闭页面,最好通过Terminal手工执行操作,不然通过网页操作不小心误关页面可能会导致容器启动异常
  2. 某些游戏服务端的Docker镜像在启动时会无法识别Unraid自身的文件映射路径,比如我运行的求生之路2服务端,如果将服务端所在的路径/serverdata/serverfiles挂载到/mnt/user/appdata/l4d2server,如果实际文件被分散写入到disk1和disk2,那么在第二次重启运行的时候,容器就无法识别到所有在/mnt/user/appdata/l4d2server的文件。解决方法是指定挂载到物理硬盘路径内,比如/mnt/disk2/l4d2server
  3. 默认的bridge网络可能不能实现容器间互通,需要创建自定义的网络才可以
  4. 默认不支持Docker compose,目前官方也没放出消息要集成docker compose功能,涉及到多容器间协作的服务需要手工一个一个添加配置运行
  5. DOCKER页面的容器可以长按拖动调整顺序,这个顺序也是启用autostart的容器启动顺序
  6. 要十分!十分!十分!十分!注意容器运行用户是哪一个,默认运行nobody:users,根据容器umask设置不同,有可能从容器内部挂载出去的文件夹通过smb访问没有权限修改写入甚至读取,如果不熟悉chown和chmod的可以直接在tools - new permissions里选择容器对应的挂载路径把权限全部重置一遍
VM虚拟机

这一块涉及不深,我只有基本的虚拟软路由翻墙和黑群晖同步照片2个虚拟机的需求,手里多了一台Intel Nuc 8放客厅作为父母的Windows娱乐影视机,所以也就没必要再折腾显卡直通,以后有机会升级到6.9还会尝试的(因为6.9对直通硬件进行了一系列优化和简便化操作)

踩过的坑

  1. Unraid界面提供的配置选项还不够实用,虚拟网卡默认驱动都是virtio,想要上千兆或万兆网的朋友要手动切换高级视图编辑xml更改为e1000才行
  2. 为了稳定兼容运行,引导方式最好选用SeaBIOS(即Legacy模式)
  3. 虚拟机是可以直通硬盘的,前提是硬盘未加入Array,通过/dev/disks/by-id/硬盘ID挂载,不会影响原来就在Array里的硬盘数据,相当于同时把硬盘物理连接到unraid和虚拟机
APPS插件篇

这一块实用插件太多了,我只列举我自己用到的

Community Applications

最核心的插件,社区应用其本身,没了它也就没有其他的事了,安装后直接在主界面显示APPS标签页

Unassigned Devices

硬盘挂载的核心,可以挂载NTFS文件系统的硬盘,安装后默认选项在Main - Unassigned Devices,找到对应的硬盘选择Mount,点击硬盘ID左边的+号展开,对应分区点进去打开Share并等待一会,就能在Unraid的SMB共享里看到对应文件夹

User Scripts

比较关键的APP,相当于在unraid主机上的crontab,安装后默认选项在SETTINGS - User ultilities - User Scripts

Fix Common Problems

检测Unraid运行的常见问题,主要是能看到登录尝试次数,查看是否有人爆破服务器,SETTINGS - User ultilities - Fix Common Problems

Dynamix Wireguard

基于WireGuard的VPN服务端,安装后可以配置私人VPN,配合tunsafe之类的客户端可以接入Unraid所在的内网访问资源,十分方便,SETTINGS - Network services - VPN Manager

Dynamix Cache Directories

缓存目录访问记录到内存里,注意不是缓存读取的文件到内存里,这个插件仅加速文件目录路径的访问,安装后选项默认在SETTINGS - User ultilities - Folder Caching

Dynamix SSD TRIM

使用缓存盘必备的插件,能定时为SSD执行TRIM,安装后选项默认在SETTINGS - Scheduler

前篇

一切的开端

2019年10月,我和家人收藏影音资源和存档的照片越来越多,家里人对数据存储已经产生了比较迫切的需求,恰逢工作交接期,周末比较空闲,就想着要买一台NAS主机。起初打算考虑品牌机,比如群晖Synology、威联通QNAP,这几家品牌机基本都属于明面上卖产品,实际上卖系统软件服务的厂商,所以主机硬件性能普遍弱,而我们又想着既然都要花钱买NAS,干脆自己组一台AIO主机,于是就着手购买相关硬件。

主板:英业达B400G3_10G(带6个+4个SATA3口,2个SATA控制器,2个PCI-E x16槽位,自带超低规格的显示核心,4物理网口的4张板载千兆网卡)
CPU:Intel E3 1230 v3
内存:二手服务器拆机ECC内存8GB x4
显卡:GTX750Ti (不需要额外供电)
底层系统的选择

因为家里人需要Windows系统,所以AIO主机在底层系统可供的选择很少,常见的是ESXi和PVE,但都有不可回避的问题存在。

ESXi:商业系统成熟稳定,硬件直通操作方便,但是不知是什么原因,主机配的Nvidia GTX750亮机卡始终不能直通到Win7虚拟机内使用,这也就没办法利用显卡流畅播放各种视频

PVE:基于Debian的Linux系统,可视化操作太少,基本依赖命令,一旦需要调试,家里人根本不会操作

最后选择了可以驱动N卡又能组建硬盘存储池的Windows Server,毕竟硬盘都是从现成的电脑主机上拆下来,3T+2T如果分开存储,在文件管理和容量上都会很不方便

Windows Server实现All in One的局限

在满足各种需求的过程中,我逐渐感受到Windows系统在自建功能服务的局限性,林林总总的服务端都提供不了持续稳定的windows版更新支持,而且Windows的Docker在使用上经常会出现我无法调试的文件系统错误,主要体现在容器运行时内外部文件读写执行上。

Docker for windows切换为Linux内核后,通过创建一个基于Linux系统的Hyper-V虚拟机实现Docker服务运行。Docker需要访问Windows宿主机文件系统时提示需要开启共享盘,所以个人猜测Docker是基于smb方式与宿主机实现文件系统互通的,于是就出现了一系列解决不了的问题。

Windows的Mysql被容器使用的时候会出现莫名其妙的连接错误,包括网络连接超时失败、文件读写权限错误等等,最后是改成使用Mariadb容器将数据库环境运行在Docker内部才正常运作使用,同样的情况也出现在Windows的Nginx上

Windows还有一个非常影响体验的问题,那就是十分让人迷惑的本地文件系统权限以及网络共享SMB权限机制,可能给Server启用AD域管理会简便明了一点,可是我没有仔细研究,因为马上就要回到正篇考虑更换底层操作系统了。

最后修改:2022 年 03 月 12 日
个人分享,随意打赏