文件系统是一种用来存储和组织计算机文件、目录及其包含的数据的方法,它使文件、目录以及数据的查找和访问得到简化。如果您正在使用一台计算机,很可能使用了多个文件系统。文件系统能提供丰富的扩展能力。它可以编写成底层文件系统的一个封装程序,从而对其中的数据进行管理,并提供一个增强的、具有丰富特性的文件系统(例如 cvsfs-fuse,它为 CVS 提供了一个文件系统的接口;或 Wayback 文件系统,它提供了一种用于保留原始数据文件的文件备份机制)。
在用户空间的文件系统出现之前,文件系统的开发曾是内核开发人员的工作。创建文件系统需要了解内核编程和内核技术(例如 vfs)方面的知识。调试则需要 C 和 C++ 方面的专业技能。但是其他开发人员需要熟练地操作文件系统以添加个性化特性(例如添加历史记录或转发缓存)及对其改进。
FUSE 简介
使用 FUSE 您可以开发功能完备的文件系统:其具有简单的 API 库,可以被非特权用户访问,并可以安全的实施。更重要的是,FUSE 以往的表现充分证明了其稳定性。
使用 FUSE,您可以像可执行二进制文件一样来开发文件系统,它们需要链接到 FUSE 库上 —— 换言之,这个文件系统框架并不需要您了解文件系统的内幕和内核模块编程的知识。
就文件系统来说,用户空间的文件系统就不再是新奇的设计了。用户空间文件系统的商业实现与学术实现的实例包括:
LUFS 是一个混合用户空间的文件系统框架,它对用于任何应用程序无数的文件系统提供透明支持。大部分LUFS 包括一个内核模块和一个用户空间的守护进程。从根本上来说,它将大部分 VFS 调用都委托给一个专用的守护进程来处理。
UserFS 让用户进程可以像普通的文件系统一样进行加载。这种概念性的原型提供了 ftpfs,这可以使用文件系统接口提供匿名 FTP 访问。
Ufo Project 是为 Solaris 提供的一个全局文件系统,它允许用户将远程文件真正当作本地文件一样对待。
OpenAFS 是 Andrew FileSystem 的一个开源版本。
CIFS 是 Common Internet FileSystem 的简称。
与这些商业实现和学术实现不同,FUSE 将这种文件系统的设计能力带到了 Linux 中来。由于 FUSE 使用的是可执行程序(而不像 LUFS 一样使用的是共享对象),因此可以简化程序的调试和开发。FUSE 可以在 2.4.x 和 2.6.x 的内核上使用,现在可以支持 Java™ 绑定,因此您可以不必限定于使用 C 和 C++ 来编写文件系统了。(有关更多使用 FUSE 的用户层的文件系统的内容,请参阅 参考资料。)
要在 FUSE 中创建一个文件系统,您需要安装一个 FUSE 内核模块,然后使用 FUSE 库和 API 来创建自己的文件系统。
要开发一个文件系统,首先请下载 FUSE 的源代码(请参阅 参考资料)并展开这个包:tar -zxvf fuse-2.2.tar.gz。这会创建一个 FUSE 目录,其中保存的是源代码。fuse-2.2 目录的内容如下:
./doc 包含了与 FUSE 有关的文档。现在,这只有一个文件 how-fuse-works。
./kernel 包含了 FUSE 内核模块的源代码(对于使用 FUSE 开发文件系统来说,您当然不用懂得这些代码的机制)。
./include 包含了 FUSE API 头,您需要这些文件来创建文件系统。您现在唯一需要的就是 fuse.h。
./lib 中存放的是创建 FUSE 库的源代码,您需要将它们与您的二进制文件链接在一起来创建文件系统。
./util 中存放的是 FUSE 工具库的源代码。
./example 当然包含的是一些供您参考的例子,例如 fusexmp.null 和 hello 文件系统。
编译并安装 FUSE
在 fuse-2.2 目录中运行 configure 脚本: ./configure。这会创建所需要的 makefile 等内容。
运行 ./make 来编译库、二进制文件和内核模块。查看 kernel 目录中的文件 ./kernel/fuse.ko —— 这是内核模块文件。还要查看 lib 目录中的 fuse.o、mount.o 和 helper.o。
运行 ./make install 完成 FUSE 的安装。
另外一种选择:如果您希望使用 insmod 自己将这个模块安装到内核中,就可以跳过这个步骤。例如:/usr/local/sbin/insmod ./kernel/fuse.ko 或 /sbin/insmod ./kernel/fuse.ko。记住要使用 root 特权才能安装所需要的模块。
如果希望,只在一个步骤中就可以完成上面的步骤。在 fuse-2.2 目录中,运行 ./configure; make; make install;。
重要提示:在编译 FUSE 时,系统中需要有内核头文件或源代码。为了简单起见,请确保将内核源代码放到 /usr/src/ 目录中。
定制文件系统
现在让我们来创建一个文件系统,这样就可以使用一个较旧的 Linux 内核来访问一个具有最新内核的 Linux 系统上的 AFS 空间了。您需要两个进程:一个是在较旧的 Linux 内核上运行的服务器进程,另外一个是在具有最新内核的 Linux 系统上运行的一个 FUSE 客户机进程。不论何时请求到达您的 FUSE 客户机进程上时,它都会与远程服务器进程进行联系。为了进行通信,这个文件系统使用了 RX RPC 代码,这是 AFS 的一部分,因此您需要编译 OpenAFS。
AFS-FUSE 文件系统概述
编译 OpenAFS
下载 OpenAFS Linux 源代码并展开源代码。
在展开源代码的目录中,运行 ./make ./configure --enable-transarc-paths。如果 ./configure 无法理解编译使用的 sysname,就请使用 --with-afs-sysname 选项提供正确的 sysname。
要在 Linux 2.4 内核上编译,请使用下面的命令:./configure --enable-transarc-paths --with-afs-sysname=i386_linux24。
运行 ./make,然后运行 ./make dest。检查在编译过程中出现的错误。
如果编译过程一切顺利,那么 AFS 源代码树就可以使用了。现在,您需要准备一个开发目录 afsfuse。在这个目录中,创建另外两个目录:
include 目录包括 OpenAFS 和 FUSE 的 include 目录的头文件。
lib 目录包含 OpenAFS 和 FUSE 的库文件。
拷贝头文件和库文件。
首先从 OpenAFS 目录中拷贝 AFS 的头文件,方法是将 dest\i386_linux24\include 中的目录和文件全部拷贝到 include 目录中。然后将 fuse-2.2 目录中的 FUSE 的 include 目录拷贝到这个目录中。对库文件也重复相同的步骤,将它们全部拷贝到 lib 目录中。
创建应用程序的结构。
对于这两组进程,您需要使用两组文件。使用命名规则 afsfuse_client.* 来命名客户机进程的文件;使用命名规则 afsfuse_server.* 来命名服务器进程的文件。
这样您就有了一个 afsfuse_client.c 文件,其中包含了 FUSE 进程的代码;一个 afsfuse_server.c 文件,其中包含了在远程机器上运行的进程使用的服务器代码;一个 makefile;一个 rxgen 文件,用来创建 RPC 头文件(例如 afsfuse.xg)。
afsfuse_client.c 文件可以创建 afsfuse_client 进程代码, FUSE 文件系统调用它来创建文件系统(使用 fuse-2.2/example/fusexmp.c 来创建这个文件)。
定义需要的函数
要使用 FUSE 来创建一个文件系统,您需要声明一个 fuse_operations 类型的结构变量,并将其传递给 fuse_main 函数。fuse_operations 结构中有一个指针,指向在执行适当操作时需要调用的函数。
创建客户机和存根文件
接下来使用 rxgen 编译 afsfuse.xg 文件,从而创建客户机和存根文件。从包含 afsfuse_server 和 afsfuse_client 的源代码的目录中,运行命令 openafs-1.2.13/i386_linux24/dest/bin/rxgen afsfuse.xg。这会创建以下文件:
afsfuse.cs.c 是与 afsfuse_client.c 进行链接的客户机存根代码。
afsfuse.h 是包含您的 FUSE RX 代码的各种定义的头文件。
afsfuse.ss.c 是与 afsfuse_server 代码进行链接的服务器存根代码(代理代码)。
afsfuse.xdr.c 包含了用来处理在 afsfuse.xg 中定义的 3 个结构所使用的代码。
现在为 afsfuse_client.c 和 afsfuse_server.c 添加一些执行实际工作的代码。大部分调用都如下所示:
Our_call_in_afs_fuse_client()。分析参数并准备执行 RPC。对 RX [RPC] 调用 afsfuse_server。组合参数。将这些值拷贝到传递给这个函数的行参数中。
Our_call_in_afs_fuse_server()。组合参数。调用本地文件系统或 AFS 特有的函数。分析参数准备执行 RPC。生成 RX RPC 调用。
afsfuse_client.c 调用如下所示:
int afsfuse_readlink(const char *path, char *buf, size_t size){
rx_connection *local& int ret& char *buffer = malloc (512)&
memset(buffer,0,512)& memset(buf,0,size)& local = getconnection()&
ret = rxc_rxc_readlink(local,path,512,&buffer) // rpc call
relconnection(local)&
strncpy(buf,buffer,512-1)&
//<- demarshall the parametrs
return ret&
}
afsfuse_server.c 调用如下所示:
清单 3. afsfuse_server.c 调用
int rxc_rxc_readlink( struct rx_call *call, char * path, afs_uint32 size, char**data)
{ int ret& char lbuff[512] ={0}&
translatePath(path,lbuff)& //<- make filesystem call
*data = malloc(512)&
res = readlink(lbuff, *data, 512-1)&
if(res == -1) return -errno& (*data)[res] = '\0'& return 0&
}
简单地,您可以在其他函数中添加代码来对文件系统进行增强。
您需要创建一个 makefile 来编译代码。记住在编译 afsfuse_client 的代码时包括以下选项:-D_FILE_OFFSET_BITS=64 和 -DFUSE_USE_VERSION=22。
相关推荐
#### 一、FUSE简介 FUSE(Filesystem in Userspace)是一种机制,允许非特权用户创建自己的文件系统,而无需修改内核代码或获得超级用户权限。FUSE的核心设计是将文件系统的实现从内核空间移到用户空间,通过一个...
#### Pyro Fuse简介与作用 Pyro Fuse,又称热熔断器,是一种特殊类型的保险丝,主要用于在电池系统遭遇异常情况(如电流过大或温度过高)时能够迅速熔断,切断电源,防止电池系统遭受更大的损坏。这一特性使得Pyro ...
【Laravel开发与fuse简介】 Laravel是一款基于PHP的开源Web应用框架,它以其优雅的语法、强大的功能和丰富的生态系统赢得了开发者们的喜爱。Laravel旨在让开发者能够更高效地构建高质量的Web应用,同时保持代码的可...
JBoss Fuse是一个强大的开源企业服务总线(Enterprise Service Bus,ESB),它将多个关键的开源组件集成到一个单一的、轻量级的容器中,为企业的应用集成提供了灵活且可扩展的解决方案。该产品源自Red Hat公司,其...
Dokan简介 Dokan是FUSE在Windows上的实现,它提供了一个API,使得C/C++开发者能够按照标准的文件系统接口编写代码。Dokan库处理了与Windows内核交互的细节,开发者只需要关注文件操作的逻辑。 ### 3. Dokan API ...
**FUSE简介** FUSE(Filesystem in Userspace)是一个在Linux操作系统中运行的库,它为非特权用户提供创建自定义文件系统的能力。传统的Linux文件系统是在内核中实现的,而FUSE将这一过程转移到用户空间,这样...
go-mtpfs, 通过FUSE挂载MTP设备 简介go mtpfs是一个简单的FUSE 文件系统,用于将Android设备作为MTP设备安装。它将在挂载中公开设备的所有存储区域,并且只根据需要读取文件元数据,使它的快速挂载。 它使用Android...
**Arvados简介** Arvados是一个开源的、专为生物医学数据设计的云存储和计算平台。它旨在简化大规模数据管理,支持数据的长期保存,并提供高效的分析工具。Arvados的核心特性包括版本控制、数据完整性保护以及对大...
**FuseFilesystem与RAMDISK简介** `FuseFilesystem`是一种基于`FUSE`(Filesystem in Userspace)框架的自定义文件系统实现。FUSE是Linux操作系统中的一个库,它允许用户在用户空间中创建自己的文件系统,而无需...
### 一、Apache ActiveMQ简介 - **定义**:Apache ActiveMQ 是一个开源的消息中间件,它实现了 Java 消息服务(JMS)规范,并且提供了高性能的企业级消息传输服务。 - **特点**: - 支持多种协议,如 AMQP、...
## 项目简介 本项目是一个开源的NTFS文件系统挂载工具,名为ntfs3g。它使用FUSE(Filesystem in Userspace)框架,使得用户空间的应用程序能够像操作本地文件系统一样操作NTFS文件系统。项目的主要目标是提供比早期...
**leveldb简介** leveldb是由Google开发的一个轻量级、高性能的键值对存储库,广泛用于日志记录、数据库和其他需要高效读写操作的应用场景。它支持顺序写入、随机读取,以及通过可配置的压缩来优化存储空间。leveldb...
**开关站(SwitchYard)简介** 开关站(SwitchYard)是一个开源的企业服务总线(ESB)和业务流程管理(BPM)框架,它提供了构建、部署和管理企业级应用服务的能力。SwitchYard 的核心设计理念是简化企业级应用的...
1 Android 分区存储简介 分区存储(Scoped Storage)是Android操作系统针对隐私保护和用户数据管理的一项重要更新,旨在限制应用程序对全局存储空间的访问,提高用户的数据安全。自Android 10.0开始,Google引入了...
本文将详细介绍如何利用App Fuse来快速构建J2EE项目,并通过一个具体的例子——一个简单的员工管理系统——来演示整个流程。 #### 二、AppFuse简介 AppFuse是一个用于构建基于Web的应用程序的开源框架。它集成了多...
简介:电缆连接器是一款基于PipeMania(1989)的单人2D益智游戏,它测试了玩家从起点到终点连接给定电缆集合的能力。 简介:基于PipeMania及其建立的迷你游戏类型,Cable Connector是一款单人2D益智游戏,其中必须...
### encfs 简介 encfs是一个用于在Linux和Unix系统上创建一个加密的虚拟文件系统的工具。它通过FUSE(Filesystem in Userspace)框架来挂载一个加密的目录到一个普通的目录上。FUSE允许用户模式下的程序访问文件系统...
**Fuse Message Broker 简介** - **产品背景**:Fuse Message Broker 是一款开源的消息中间件,用于实现消息传递功能。它支持多种消息传递模式,如点对点 (point-to-point) 和发布/订阅 (publish/subscribe) 模式...