OpenMediaVault之联合文件系统插件unionfilesystem简介

由于开发者不断迭代升级,以前的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插件中只有一个参数可设,就是剩余空间阈值,如下图所示:

image

比如该值设为4G,那意思就是如果第一个分支剩余空间小于4G了,mhddfs就会选择下一个分支来进行存储,依次进行到最后一个分支。当所有分支属于空间都小于4G时,则选择分支中剩余空间最大的进行存储。

mergerfs作者借鉴了mhddfs的理念,同时强化了更多的功能,OMV插件中提供的选项有:

image

由于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是可以选择磁盘中单个文件夹的。创建策略如下:

image

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群指出,共同学习。