Wrapfs: 一种空层或者叫包装层的堆栈式文件系统


=========================================================

注:下面关于wrapfs的解析是我的理解,原文并无此内容。

wrapfs并不是一个像ext4, vfat, yaffs2等真实访问物理存储设备的文件系统。

而是VFS和其它文件系统之间的一个中间件,即上层文件系统(VFS)与底层文件系统之间的一个钩子,通过下图就比较好理解了:

图1: 来自于《A Stackable File System Interface For Linux》

stackPane是什么容器_stackPane是什么容器

=========================================================

wrapfs 维护者: Erez Zadok <ezk AT cs DOT stonybrook DOT edu>
wrapfs官网: <http://wrapfs.filesystems.org/>


-------------------------------------------------------------------------------------------------------------------------------------------------------

wrapfs 优点:

wrapfs是一种简单的堆栈式文件系统,类似于BSD的nullfs。

wrapfs算是比较简单的了,代码少于1800行, 相比eCryptfs和Unionfs,代码都多于10000行。

因此,wrapfs简单,易读,易理解。

如下几点,足以说明wrapfs是非常有价值的:

1、wrapfs是一种理想的小模板,可以修改,逐步改造出新的文件系统功能。

2、在其他Linux可堆叠文件系统(例如,eCryptfs)作为一个平台,测试和调试的一般堆积的问题更容易。

3、wrapfs可以当作一种方法,用于测试linux VFS超强的堆叠能力。

4、wrapfs可以当作学习VFS,或学习如何写新的Linux文件系统的一个好工具。


wrapfs最早版本于1994年发布,并被全球用户广范使用。

后于2010年,在kernel 2.6.32 重写、并发布。

----------------------------------------------------------------------------------------------------------------------------------------------

wrapfs操作描述:


这篇文章只是简要描述wrapfs是如何操作的

wrapfs可堆栈文件系统的基本功能是传递具体的操作和参数到更低一层文件系统。

针对 VFS 的每个对象 (索引节点, 目录项, 文件, 超级块),  

Wrapfs层的对象与更低一层文件系统的所有对象之间都有一对一的映射关系。

我们可以将wrapfs对象称作上层对象,而更低一层文件系的对象称作底层对象。


wrapfs将这种对象映射以指针的形式保存在VFS对象的文件,目录项,超级块等的私有数据指针中。

例如: dentry->d_fsdata, sb->s_fs_info, and a container for inodes.
=========================================================

注:这句话,可能翻译得不易理解。下面关于wrapfs的对象与VFS对象管理是我的理解,原文并无此内容。

wrapfs每个对象 (索引节点, 目录项, 文件, 超级块)的私有数据指针,都用于保存底层文件系统的相对应的对象结构。

这样,wrapfs就可以容易调到底层文件系统的处理函数。如下图:

stackPane是什么容器_stackPane是什么容器_02

图2:来自于《A Stackable File System Interface For Linux》



另外为方便理解也请参考wrapfs.h 如下代码:

static inline struct wrapfs_inode_info *WRAPFS_I(const struct inode *inode)
 {
return container_of(inode, struct wrapfs_inode_info, vfs_inode);
 }
 /* dentry to private data */
 #define WRAPFS_D(dent) ((struct wrapfs_dentry_info *)(dent)->d_fsdata)
 /* superblock to private data */
 #define WRAPFS_SB(super) ((struct wrapfs_sb_info *)(super)->s_fs_info)
 /* file to private Data */
 #define WRAPFS_F(file) ((struct wrapfs_file_info *)((file)->private_data))


=========================================================



堆栈操作有两种类型:创建新VFS对象,和不创建新VFS对象。


下面摘取的代码片断展现的是不创建新VFS对象的方法。

该方法仅仅传递VFS对象到底层,并返回可能的错误信息给VFS:

int wrapfs_unlink(struct inode *dir, struct dentry *dentry)
 {
 int err;
 struct inode *lower_dir;
 struct dentry *lower_dentry;
 lower_dir = get_lower_inode(dir);
 lower_dentry = get_lower_dentry(dentry);
 err = lower_dir->i_op->unlink(lower_dir, lower_dentry);
 return err;
 }



下面摘取的代码片断展现的是重新创建新VFS对象的方法。

底层文件系统对象创建好后,wrapfs也要创新它自已的对象,它们之间通过interpose方法建立连接。

int wrapfs_create(struct inode *dir, struct dentry *dentry, int mode)
 {
 int err;
 struct dentry *lower_dentry;
 struct inode *lower_dir;
 lower_dir = wrapfs_lower_inode(dir);
 lower_dentry = wrapfs_lower_dentry(dentry);
 err = vfs_create(lower_dir, lower_dentry, mode);
 if (!err)
 err = wrapfs_interpose(dentry, dir->i_sb);
 return err;
 }


The wrapfs_unlink code snippet above can be easily modified to change the

behavior of unlink(2).  For example, if an ->unlink operation is changed to

->rename, this could become the basis for an "undo" file system; or if the

lower_dentry's name gets encrypted before calling the lower ->unlink, this

could be part of an encryption file system.


----------------------------------------------------------------------------------------------------------------------------------------------

wrapfs使用说明:


首先,你必须有一个已经通过其它文件系挂载好的底层文件系统目录,比如:/some/lower/path。

然后,要将这个已有的、挂载好的目录再挂载到/mnt/wrapfs目录,就可以使用如下命令:


# mount -t wrapfs /some/lower/path /mnt/wrapfs

通过wrapfs,就可以使用挂载点/mnt/wrapfs访问该底层文件系统目录的文件,


----------------------------------------------------------------------------------------------------------------------------------------------

wrapfs注意事项:



wrapfs的在各系统上的测试情况,这部份就不翻译了。

如果要使用,使用者自必对稳定性负责就是了!



----------------------------------------------------------------------------------------------------------------------------------------------

wrapfs 历史:

  初始版本1994年,linux 2.1上哥伦比亚大学读研究生开发。


  .....................................其它略...............................


哈哈,翻译了这么多!wrapfs到底有什么用,你不够明白?