皮皮网

【ubuntu 源码编译nginx】【struts源码分析】【app源码项目】fuse 源码

2024-11-18 23:51:05 来源:代购没有溯源码

1.fuse是源码什么
2.基于Fuse的最简单的文件系统
3.Appfuse作用
4.Windows Dokan简介

fuse 源码

fuse是什么

       FUSE是文件系统在Linux中的模块和框架。

       FUSE,源码全称为Filesystem in Userspace,源码是源码一个在Linux内核和用户空间应用程序之间构建文件系统的接口框架。它允许开发者创建自己的源码文件系统,并将其挂载到用户空间中,源码ubuntu 源码编译nginx以实现不同的源码存储、备份或版本控制策略等需求。源码这一技术的源码核心思想是将文件系统处理的任务从操作系统层面移至用户空间的应用程序层面。这样的源码设计提供了一种更为灵活的方式去构建定制的文件系统。其具体特点如下:

       首先,源码FUSE提供了一个编程接口,源码开发者可以使用这个接口来创建新的源码文件系统。这些文件系统在用户空间运行,源码这就意味着开发人员可以在不使用内核源代码的源码情况下开发新的文件系统特性或功能。这种灵活性使得FUSE在数据管理和存储领域具有广泛的应用前景。

       其次,struts源码分析FUSE的核心作用在于它是一个桥梁或者中介,在用户空间和内核之间建立一个通道,用户空间的应用程序通过这个通道来访问存储在存储设备上的数据。传统的文件系统通常是直接与内核交互的,而FUSE打破了这一传统模式,允许开发者在不修改内核的情况下实现自己的文件系统逻辑。这使得用户空间的应用程序能够与各种类型的存储设备进行交互,无论这些设备是传统的硬盘还是新兴的技术如闪存或云存储等。

       最后,对于需要进行文件级别操作的任何应用场景,FUSE都有着广阔的应用前景。它可以应用于实现定制的数据管理方案、增强型的文件版本控制工具以及其他对文件系统有特殊要求的应用场景。正是由于FUSE的灵活性,许多开发者选择在FUSE上构建自己的解决方案,以满足特定的app源码项目业务需求。因此,FUSE在数据管理和存储领域扮演着越来越重要的角色。

基于Fuse的最简单的文件系统

       从今天开始,我将在我的公众号“数据存储张”中创建一个合集,旨在从零开始,教大家如何开发一个文件系统。开发工作基于Ubuntu .,其他Linux版本亦可。通常,我们认为文件系统是内核模块,但实际情况并非如此,EMC的UFS就是一个用户态文件系统示例。开源分布式文件系统也多是用户态。

       鉴于内核态开发难度较高,我决定采用FUSE来开发一个用户态文件系统。通过实践本合集的delphi 游戏源码内容,希望能加深大家对《文件系统技术内幕》一书的理解。无论是内核态还是用户态,文件系统的原理基本一致。

       若后续大家对Linux内核文件系统实现感兴趣,我也会继续基于内核开发功能,让大家全面了解内核文件系统。

       回到文章主题,接下来我们将深入文件系统的概念。文件系统是将硬盘线性地址转换为层级结构的软件系统,核心是呈现目录树。文件系统中,文件与目录是两大关键概念:目录是容器,用于存储文件和子目录;文件则是数据存储实体,形式多样,如视频、音频、ecc算法源码Word文档及文本文件等。

       从普通用户角度看,文件系统提供层级式的文件组织方式,而程序开发视角下,文件系统提供API以访问文件和目录,如打开、关闭、读取和写入数据,以及目录的打开、遍历和关闭等操作。这些API在内核态有对应实现。

       FUSE提供在用户态开发文件系统的框架,大大降低了开发门槛,无需了解Linux内核内容。FUSE由用户态库和内核模块组成,内核态模块与VFS和其他文件系统关系密切,可理解为内核态文件系统,其功能是转发文件系统访问请求至用户态。

       FUSE用户态库提供一套API和接口规范,实现这些函数集合即完成文件系统开发。通过FUSE注册函数到内核模块后,内核态请求将调用用户态函数。例如,ceph_fuse就是基于FUSE实现的用户态文件系统,用于访问CephFS。

       接下来,我们将开发一个最简单的文件系统,严格意义上并非真正文件系统。该系统仅模拟层级结构,包含“dir”目录和“helloworld”文件,以及“.”和“..”目录。实现中,我们仅关注“getattr”和“readdir”两个函数,分别用于获取文件或目录详细属性及读取目录项。

       在头文件中,我们定义了文件系统类HelloWorldFS,并实现了上述两个函数。主函数文件简单实例化了HelloWorldFS类,并调用run函数完成文件系统挂载和注册等任务。

       cmake工程文件用于管理整个项目。通过cmake生成Makefile,并使用make编译,得到可执行程序helloworld。通过挂载到/mnt/test目录,我们验证了系统功能。

       本文实现的文件系统仅模拟层级结构,不具备创建、删除或读取文件内容功能。通过本教程,大家对文件系统概念和FUSE用法有了基础了解。后续,我们将基于当前实现,开发一个基于内存、可读写文件系统。

       相关源代码可在GitHub的SunnyZhang-IT/fs-from-zero库中找到。

Appfuse作用

       AppFuse是一个功能强大的集成框架,它在多个关键领域提供了便利。在持久层处理中,AppFuse支持Hibernate O/R映射工具和iBatis,这两种都是广泛使用的数据库访问解决方案。这让开发者能够高效地管理数据操作和对象关系映射。

       在容器管理方面,AppFuse与Spring Framework紧密结合,这意味着它能够利用Spring的管理能力和模块化设计,简化了应用的部署和管理。这为开发者提供了稳定且灵活的基础架构。

       在web框架选择上,AppFuse非常灵活,允许用户根据项目需求自由选择Struts、Spring/MVC、Webwork、Tapestry或JSF等流行的web开发框架,这提供了极大的定制性和扩展性。

       在开发模式上,AppFuse倡导Test-Driven Development (TDD),鼓励开发者通过JUnit进行单元测试,甚至对jsp输出进行深入测试,以确保代码质量。这种严谨的测试实践能够提高代码的稳定性和可靠性。

       在简化开发流程上,AppFuse预设了标准的目录结构和基类,省去了开发者手动设置的繁琐。它还提供了创建数据库、配置Tomcat、部署应用的Ant任务,大大节省了开发时间和资源。此外,它还能自动生成源代码和自动维护部分配置文件,减少了人工干预的复杂性,使得开发过程更加高效和易于维护。

Windows Dokan简介

       Dokan创建之初的目的和FUSE(Filesystem in Userspace)一样,即为了实现用户自己的文件系统。开发者通过dokan开发文件系统,实现的是一个应用程序而不是复杂的内核驱动。(Windows内核驱动开发也不见得比Linux简单。)Dokan就是Windows上的FUSE。而目前Dokan已经支持Fuse,意味着Linux Fuse程序也可以实现向Windows平台的迁移。

        目前Dokan已经被替换成Dokany(自0.6.0版本),广泛支持位或位X和ARM架构。支持的Windows版本有

        - Windows Server // R2// R2 SP1

        - Windows /8.1/8/7 SP1

        简而言之,和FUSE如出一辙。

        Dokan库包含用户态的动态链接库(dokan.dll)和内核态的驱动程序(dokan1.sys)。( 可以类比FUSE提供用户态的动态链接库libfuse.so和内核态驱动fuse.ko。) 使用dokan库创建的文件系统视为 文件系统程序 。 

        文件操作比如创建文件CreateFile、读文件ReadFile和写文件WriteFile的请求将会发送给内核态子系统,然后转递给驱动程序。 文件系统程序 通过用户态提供的函数接口,在驱动程序中注册回调接口。驱动程序到信息后会调用这些回调函数,最后这些请求在用户态的文件系统程序中被处理。Dokan扮演的是应用程序和 文件系统程序 直接的代理角色。

        第一步实现DOKAN_OPERATIONS结构体里的函数。这些函数会被注册成回调函数。DOKAN_OPERATIONS会在主函数DokanMain中作为参数传递使用。

        一般操作文件的顺序是

        - DOKAN_OPERATIONS::ZwCreateFile

        - 其他操作,比如写、读等

        - DOKAN_OPERATIONS::CleanUp

        - DOKAN_OPERATIONS::CloseFile

        即创建、实际操作、清理和关闭。清理主要是清理请求和关闭文件句柄,而关闭是清理尚存的上下文结构。

        每个操作成功返回STATUS_SUCCESS,如果失败则返回不同的错误状态NTSTATUS。另外,每一个Dokan操作都要带一个结构体DOKAN_FILE_INFO。每个文件句柄会关联该结构。该结构的主要目的是保存当前操作的文件信息,比如上下文操作信息、是否为目录类型、是否读缓存、同步操作等定义操作行为的信息。具体详见附录中地址。

        实现了 线程安全 的文件系统操作,调用DokanMain函数即可挂载文件系统到Windows中,该函数会在卸载之前保持阻塞状态。

        源码包里面提供了Mirror,可以作为案例入门Dokan的开发。

        Dokan Fuse在使用时需要链接 dokanfuse.dll 的动态库。 另外由于Linux和Windows在处理删除和重命名上的不同会导致一些移植出现问题 (Linux允许打开的文件被删除,而Windows则不允许)。

       é¡¹ç›®åœ°å€ï¼š/dokan-dev/dokany

        结构体DOKAN_FILE_INFO描述:https://dokan-dev.github.io/dokany-doc/html/struct_d_o_k_a_n___f_i_l_e___i_n_f_o.html