type
status
date
slug
summary
tags
category
icon
password
如需技术支持,请点击 👉 联系方式
由于 Unraid “聚合视图”功能的存在,用户共享文件夹(User Shares)是文件存储与管理的基本对象,文件在硬盘上的存储与读写会以共享文件夹的一些列属性为依据运作。本文将向读者介绍 Unraid 共享文件夹作用以及使用案例,方便新手朋友能更好的理解和使用 Unraid 。
关于 Unraid “聚合视图”功能的说明,读者可以参考博主的另一篇文章《为什么unRAID下载/拷贝文件时CPU占用高:详解FUSE-SHFS、I/O问题和解决办法》的第 2 章。
1、默认共享文件夹说明
在 Unraid 初始化时,会有以下 4 个默认的共享文件夹被创建:
appdata
:Docker 容器应用配置文件默认存储目录。
domains
:虚拟机虚拟硬盘默认存储目录。
isos
:系统安装镜像默认存放目录。
system
:Docker 和虚拟机的.img
镜像默认存放位置。
实际上,这些文件夹并不是必要的,只是 Unraid 提供了一个初始化的文件夹给到用户使用,当你了解这些文件夹的作用之后,你就可以自定义本文所提到的相关文件的默认存储位置。
就好像 Windows 系统不一定就得安装在 C 盘一样,你也可以安装到 D 盘或其他盘。
1.2、appdata
文件夹说明
在 Unraid 上,
appdata
文件夹默认用于 Docker 应用数据存储,当你从 CA 安装一个 Docker 应用时,这个应用的默认应用数据存储位置也是 appdata
:你也可以将默认的应用数据配置存放目录进行更改:
根据图片上的提示,你可以将此文件夹存放到固态硬盘中,从而实现 Docker 应用的运行加速。
1.3、domains
文件夹说明
domains
文件夹用于存储虚拟机的虚拟硬盘,当你创建了一个虚拟机并且虚拟机添加了虚拟硬盘,那么这个虚拟硬盘就会存储到 domains
共享文件夹。例如创建一个 Win 虚拟机并添加一个 10G 的虚拟硬盘:
但同样的,你不必一定需要将虚拟机的虚拟硬盘存储在此位置,如果你希望默认情况下存储在其他的文件夹,你可以在虚拟机服务的设置中将其指定到其他的文件夹:
1.4、isos
文件夹说明
isos
文件夹默认用于存储 ISO
镜像文件,与 domains
文件夹一样,你也可以在虚拟机设置中将 ISO
的默认存储路径指定到其他的文件夹:ISO
是一种光盘镜像文件,一般以.iso
为扩展名,是复制光盘上全部信息而形成的镜像文件,见的比较多的就是 Windows 的系统安装镜像,如cn_windows_10_enterprise_ltsc_2019_x64_dvd_9c09ff24.iso
。
当安装虚拟机的时候,“操作系统安装 ISO” 中展开的文件列表就是
isos
文件夹内的所有 .iso
文件,如:1.5、system
文件夹说明
system
文件夹用于存放 Docker 和虚拟机的 .img
镜像,此文件夹下面有两个子文件夹,分别为:docker
文件夹:存放docker.img
镜像
libvirt
文件夹:存放libvirt.img
镜像
Unraid 在 Docker 服务启动时将
docker.img
镜像文件进行挂载然后读取里面存储的相关数据,当你安装一个 Docker 应用时会将相关的镜像、相关参数存储到 docker.img
内,所以如果你不小心将 docker.img
文件删掉了,那么你所安装的所有 Docker 应用也将会消失(但只要你应用的配置文件还在,那么只需要重新安装即可)。libvirt.img
的作用跟 docker.img
也是一样的道理。因此有时候如果你发现 Docker 服务和虚拟服务无法启动,并且系统日志里面也提示了关于docker.img
和libvirt.img
镜像文件的报错信息(例如无法挂载),那么你可以尝试将这两个 img 镜像文件删除(删除之后 Unraid 会自动创建新的)来解决此问题。 假如说你遇到了因docker.img
镜像出问题而导致 docker 服务无法启动的情况,你可以参考这里的内容去处理 —— 《常见问题-8:Docker 服务无法启动/容器消失的解决办法》。
不管是 Docker 还是虚拟机,这两个
.img
文件的默认存放位置也都是可以改变的:2、共享文件夹分配方法说明
2.1、分配方法(Allocation method)说明
官方解释如下:
When you create a new user share, or when any object (file or directory) is created within a user share, the system must determine which data disk the user share or object will be stored on. In general, a new user share, or object within a user share, is created on the data disk with the most free space. However, there are a set of configuration parameters available to fine-tune disk allocation. 创建新用户共享或在用户共享中创建任何对象(文件或目录)时,系统必须确定用户共 享或对象将存储在哪个数据磁盘上。一般来说,新用户共享或用户共享中的对象会创建在可用空间最大的数据磁盘上。不过,有一组配置参数可用于微调磁盘分配。
由于 Unraid 的用户共享(User Shares)具有“聚合视图”的功能,所以对于用户来说当写入数据到某一个共享文件夹时,用户不需要去考虑文件应该存储在阵列中的哪一个硬盘,因为共享文件夹会依据“分配方法(Allocation method)”中的规则自行决定文件应该写入到哪一个硬盘中。
分配方法有以下几种:
- High-water :High-water 是默认的共享文件夹分配方法,大多数情况下我们保持此默认选项即可。
- 填满(Fill-up)
- 高可用(Most-free)
(1)High-water(高水位)
官方文档解释如下:
The High-water setting works with switch points based on continually halving the size of the largest drive in the array. It does multiple passes to fill each disk so at the end of each step there is equal free space left on each disk. This progressively fills each disk but without constantly going back and forth between disks each time new data is written. Most times, only a single disk will be needed when writing a series of files to the array so the array will only spin-up the needed disk. The high-water level is initially set equal to one-half of the size of the largest disk. A new high water level is again set to one-half of the previous high level once all the disks have less free space than the current high water level. High-water 设置的工作原理是将阵列中最大驱动器的大小持续减半。它会对每个磁盘进行多次填充,以便在每个步骤结束时,每个磁盘上剩余的可用空间相等。这样就能逐步填满每个磁盘,但在每次写入新数据时都不会在磁盘间来回切换。大多数情况下,向磁盘阵列写入一系列文件时只需要一个磁盘,因此磁盘阵列只会启动需要的磁盘。高水位最初设置为最大磁盘大小的二分之一。一旦所有磁盘的可用空间都小于当前的高水位,新的高水位又会被设置为前一个高水位的二分之一。
简单来说就是 High-water 方法会动态地划分出一条“高水位线”,以这条线为分界线去将数据写入到硬盘。高水位线由阵列中硬盘容量最大的那一个盘的存储容量除以 2 得到,然后随着阵列中硬盘可用空间的减少将会动态地计算出新的高水位线,而新的高水位线会以前一条高水位线的值除以二得到。
High-water(高水位)可以保证阵列中每一个硬盘的可用空间相等,避免写入数据时来回在多个硬盘间切换,这样可以保证大多数情况下只对某一个硬盘进行写入,而其他硬盘就可以进行休眠。
通过以下的例子你将明白具体的原理。
例如,下图中有三块硬盘组成了 Unraid 的阵列:一块 16T 硬盘、一块 6T 硬盘和一块 4T 硬盘,那么第一条高水位线的值通过将容量最大的那一个盘的总容量除以 2 得到 —— 16T / 2 = 8T 。
当此时往共享文件夹写入数据时,Unraid 将会以这条 8T 的高水位线为依据,去判断阵列中哪一个硬盘的可用空间大于 8T,也就是哪一个硬盘的可用空间在高水位线之上,然后就将数据写入到对应的硬盘中。如下图所以,由于高水位线的值为 8T,而这三个硬盘中只有 Disk1 硬盘的可用空间大于 8T,所以数据首先会写入到 16T 的硬盘中:
随着硬盘可用空间的越来越少,当所有硬盘的可用空间都小于高水位线时,将会在第一条高水位线的基础上再除以二得到第二条高水位线 —— 本例中就是 8T / 2 = 4T 。如下图所示,此时所有硬盘的可用空间都小于第一条高水位的值(8T),所以会选出新的高水位线(4T),并且此时有两个硬盘的可用空间都在新的高水位线之上 —— Disk1 和 Disk2 。由于 Disk1 和 Disk2 的可用空间都大于高水位线,此时会以硬盘的序号从小到大作为顺序去写入文件,而由于 Disk1 的序号比 Disk2 要小,所以写入数据时依然会先写入到 Disk1 :
而如果 Disk1 的可用空间小于高水位线了(< 4T),那么此时写入数据时就会写入到 Disk2 中而不继续再向 Disk1 写入数据了:
同样的,如果 Disk2 的可用空间也小于高水位线的值(< 4T),那么根据本例将会出现 3 个硬盘的可用空间都约等于 4T 的情况,此时就需要再重新计算出新的高水位线 —— 4T / 2 = 2T,如下图所示:
此时写入数据时依然是依据硬盘在阵列中的序号从小到大去写入数据到对应的硬盘中,整个过程再次重复。
(2)填满(Fill-up)
官方解释如下:
The fill-up allocation method attempts to fill each disk in order from the lowest numbered disk to the highest numbered disk. The fill-up allocation method must be used in conjunction with the minimum free space setting. Otherwise, Unraid will begin to give disk full errors and not allow any more transfers once the first disk gets close to being full. 填满分配法尝试按照从编号最低的磁盘到编号最高的磁盘的顺序填满每个磁盘。填满分配方法必须与最小可用空间设置一起使用。否则,一旦第一块磁盘接近填满,Unraid 就会开始提示磁盘已满错误,并不再允许任何传输。
写入数据到阵列中时,填满(Fill-up)方法以阵列中的硬盘序号从小到大为顺序,将数据写入到硬盘序号最小的那一个盘,直到这个盘的可用空间小于所设置的“最小可用空间”的值之后才会继续向后写入到序号最小的那一个硬盘。
使用填满方法必须同时设置共享文件夹的“最小可用空间”数值,否则一旦硬盘快满时 Unraid 将会开始提示磁盘已满的系统错误信息,并且无法再向共享文件夹写入任何的文件,即使其他的硬盘仍有足够的可用空间。
如下图所示,由于使用了 Fill-up 方法,并且“最小可用空间”设置为了 100G ,所以写入文件到阵列时会从 Disk1 - Disk3 按顺序写入,直到硬盘的可用空间小于“最小可用空间”所设置的值之后才会继续往下一个硬盘写入:
(3)高可用(Most-free)
官方解释如下:
The most free allocation method picks the disk with the most free space and writes the data to that disk. Each time a file is written Unraid will check the free space on the included disks and pick the one with the most free space. 最大可用空间分配法会选择可用空间最大的磁盘,并将数据写入该磁盘。每次写入文件时,Unraid 都会检查包含磁盘上的可用空间,然后选择可用空间最大的磁盘。
此方法的逻辑最为简单 —— 会选择可用空间最大的那一个盘进行写入。
一般很少会选择此方法进行使用,因为写入数据时可能会频繁的在多个硬盘之间来回写入数据,所以并不是一个比较理想的分配方法。
3、共享文件夹的相关使用案例
3.1、怎么让 unraid 系统,虚机,docker这些都运行在固态盘里?
此问题来源于 Unraid 论坛中文板块的一个提问,可能也是不少刚开始接触 Unraid 的用户所希望实现的一个效果,算是一个比较典型的需求,这里博主就此问题做相关的讲解。
(1)问题说明
首先需要说明的是,Unraid 系统自身是运行在内存中的,所以即使你使用的是固态硬盘来作为系统盘使用,到最后 Unraid 也只是运行在内存中,因此将 Unraid 自身的文件放到固态盘中意义不大。
其次,虚拟机和 Docker 的相关文件可以放到缓存盘中,这样可以实现 Docker 和虚拟机服务的加速运行,你可以将以下共享文件夹转移到缓存盘中进行使用:
appdata
:Docker 容器应用配置文件默认存储目录,将此文件夹放到缓存中可以加速 Docker 应用读取其配置文件。
domains
:虚拟机虚拟硬盘默认存储问目录,将虚拟硬盘放到固态盘中可以加速虚拟机的运行速度。
system
:Docker 和虚拟机的虚拟 IMG 镜像默认存放位置,将此文件夹放到固态硬盘中可以实现 Unraid 上 Docker 服务和虚拟机服务的加速运行。
(2)转移方法
为了转移共享文件夹,你可以通过缓存策略和 unBALANCE 插件实现。
1、缓存策略转移共享文件夹
这个方法的条件是你的固态盘是用作缓存盘来使用,如果你的固态硬盘并不是用作缓存盘那么请使用 unBALANCE 插件方法。
如果你还不是很清楚 Unraid 上的缓存策略,你可以先去了解博主的另一篇文章《新手教程:详解 Unraid 缓存策略及应用案例》。
如果你的固态硬盘是用作缓存盘,那么你可以将上面提到的那三个共享文件夹的缓存策略设置为“首选(Prefer)”:
“首选(Prefer)”是 6.12 版本之前的缓存策略。
或者如下图所示的
6.12
版本开始的新缓存策略:然后停止 Unraid 上的 Docker 服务和虚拟机服务:
然后执行“转移(Mover)”来让系统将这几个共享文件夹内的文件转移到缓存池中:
2、unBALANCE 插件转移
关于 unBALANCE 插件的具体使用方法,请参考博主的另一篇文章《unBALANCE 文件转移工具使用方法和应用案例介绍》,这里简单做一个介绍:
- 作者:JackieWu
- 链接:https://www.jackiewu.top/article/unraid-user-shares-role-and-use-case
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。