由于开发者不断迭代升级,以前的aufs文件系统插件现在扩展为unionfilesystem插件,文件系统策略也不止aufs一种,本篇就unionfilesystem插件做简单介绍,以便读者选择适合自己的文件系统策略。截止到2016年4月,unionfilesystem中集成了三种文件系统:aufs、mergerfs、mhddfs。
其实这三种文件系统都是基于FUSE的,他们有太多的相似之处,由于之前介绍过aufs,这里不再做重复介绍,可以翻阅之前的文章了解。当然,除了相似之外,它们也有不少的独自特点,由于设计到存储知识太多,本人水平有限,不能全部进行讲解,本篇只针对OMV插件中涉及功能做简单说明,详细差异及介绍请分别参考官方介绍:
aufs:http://aufs.sourceforge.net/aufs4/man.html
mergerfs:https://github.com/trapexit/mergerfs
mhddfs:http://svn.uvw.ru/mhddfs/trunk/README
mhddfs最近一次更新是在2012年,由于长时间没有进行更新及修复bug,于是诞生了mergerfs,mhddfs由于开发较早,所提供功能也不多,在OMV插件中只有一个参数可设,就是剩余空间阈值,如下图所示:
比如该值设为4G,那意思就是如果第一个分支剩余空间小于4G了,mhddfs就会选择下一个分支来进行存储,依次进行到最后一个分支。当所有分支属于空间都小于4G时,则选择分支中剩余空间最大的进行存储。
mergerfs作者借鉴了mhddfs的理念,同时强化了更多的功能,OMV插件中提供的选项有:
由于mergerfs分了四种事务类型:action、create、search、N/A。策略描述中涉及到这四种事务类型的执行方式,引用作者介绍如下:
Category | FUSE Functions |
---|---|
action | chmod, chown, link, removexattr, rename, rmdir, setxattr, truncate, unlink, utimens |
create | create, mkdir, mknod, symlink |
search | access, getattr, getxattr, ioctl, listxattr, open, readlink |
N/A | fallocate, fgetattr, fsync, ftruncate, ioctl, read, readdir, release, statfs, write |
Policy | Description |
---|---|
all | Search category: acts like ff. Action category: apply to all found. Create category: for mkdir, mknod, and symlink perform on all read/write drives with at least minfreespace. create filters the same way but acts like ff. |
eplfs (existing path, least free space) | If the path exists on multiple drives use the one with the least free space. Falls back to lfs. |
epmfs (existing path, most free space) | If the path exists on multiple drives use the one with the most free space. Falls back to mfs. |
erofs | Exclusively return -1 with errno set to EROFS. By setting create functions to this you can in effect turn the filesystem readonly. |
ff (first found) | Given the order of the drives, as defined at mount time or when configured via xattr interface, act on the first one found. |
lfs (least free space) | Pick the drive with the least available free space but more than minfreespace. Falls back to mfs. |
mfs (most free space) | Use the drive with the most available free space. Falls back to ff. |
newest (newest file) | Pick the file / directory with the largest mtime. |
rand (random) | Calls all and then randomizes. |
由于可以查阅资料有限,个人建议使用最多剩余空间的策略,这样可以先使用空间大的分支,方便管理。
为了简化操作,插件中提供的aufs选项也做了精简,只提供了基础的创建策略选项,分支只能以磁盘为单位进行选择,实际上aufs是可以选择磁盘中单个文件夹的。创建策略如下:
aufs开发者比较活跃,从2005年发布aufs1开始到现在已经发展到aufs4,功能也越来越完善,详细的策略介绍请查阅官网资料。
创建策略:
tdp | top-down-parent:选择父目录剩余空间最大的分支写入,如果父目录不存在,那么执行内部向上拷贝,默认向上拷贝的策略是’bottom-up’的。
rr | round-robin:循环选择可写分支,当你有2个可写分支而创建10个新文件时,每个分支将分别创建5个新文件。而系统调用mkdir(2)则不同。当你创建10个目录,所有的都会创建在同一个分支。
pmfs[:second]:选择存在父目录的可写分支,类似tdp模式,当多个可写分支都存在父目录的话,aufs选择剩余空间最大的那个,类似mfs模式。
mfs[:second] | most-free-space[:second]: 选择剩余空间最大的可写分支,为了提高性能,可以指定aufs记住上次检索的最大剩余空间分支的时间,最长可以记住3600秒,这样就不用每次写入都检索最大剩余空间。默认记住时间是30秒,超过30秒写入数据是系统会再次检索最大剩余空间的分支。
总之,以上的三种文件系统都有类似之处,就是将不同大小,不同类型的文件系统映射到一个挂载点,这样可在一个挂载点管理不同磁盘的文件,在管理细节上存在各自的特点,推荐使用aufs,官网资料最详细,可查资料也最多。由于涉及的专业知识太多,疏漏之处在所难免,如有错误之处欢迎邮件或加Q群指出,共同学习。