`
湖大-软件-杨锦涛
  • 浏览: 7403 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

FUSE简介,安装,部分代码

阅读更多

FUSE(用户文件系统)

一,fuse介绍

FUSE实现实现了内核与用户之间的隔离,用户想要写一个文件系统只需修改根据用户想要实现的操作来改写fuse提供的API就可以了,这里还要提一个挂载的概念,就是将一个目录添加到了另一个目录下(类似于U盘一样),然后。可以对这个目录中的数据进行操作,就是挂载

 

二,fuse安装

本文末尾有fuse-2.9.3.tar.gz 下载包

解压:tar -zxvf fuse-2.9.3.tar.gz

进入解压包:cd fuse-2.9.3

安装:./configure (后面可以加  --prefis=/目录  这样可以指定安装路径,有时候系统为64位时,文件会被安装到了/usr/local/bli)

编译:make

安装:make install

卸载摸个目录下的挂载:fusermount -u 目录

 

用python 编辑fuse需要安装fusepy

下载fusepy(本文附带fusepy-2.0.0.tar.gz的下载包)

解压:tar -zxvf fusepy 

进入解压后的文件夹:cd fusepy-2.0.2

这时候你会看到setup.py 

运行fusepy:python setup.py install

然后回到有你的修改好的文件的文件夹中(文件以.py结尾)

运行:python 文件名 挂载文件夹 挂载路径(这个文件夹要为空才行)

如:[root@localhost fuse]# python test.py /usr  /nn(这里nn文件夹要为空哦)

然后你就看到程序“停止了”其实已经挂载成功了

重新打开一个窗口,进入你的挂载路径,然后ls,你会发现这个文件夹下面的目录和你挂载的文件夹目录一样

 

[root@localhost usr]# ls

bin  etc  fusetest  games  include  java  lib  lib64  libexec  local  sbin  share  src  tmp

[root@localhost usr]# cd /yjt/jj/

[root@localhost jj]# ls

bin  etc  fusetest  games  include  java  lib  lib64  libexec  local  sbin  share  src  tmp

[root@localhost jj]# 

 

然后还可以里面的文件进行操作哦

 

三,fuse目录

 1 ./doc 包含FUSE相关文档

 2 ./include 包含了FUSE API头,对创建文件系统有用,主要用fuse.h

 3 ./lib 存放FUSE库的示代示

 4 ./util 包含了FUSE工具库的示代示

 5 ./example 参考的示子

四,关于fuse API修改

如果你用的是C的话,必须对C相当了解这里重点说python的修改

主要用到了python的os,os.path两个库可以试着去先看一下这些库里面函数的用法API的修改会容易的多

如文件的重命名函数的重写

    def rename(self, old, new):

        return os.rename(self._full_path(old), self._full_path(new))

就只用调用os.rename()这个函数就可以了

这里提供一个fuse的案例大家可以看一下

#!/usr/bin/env python

from __future__ import with_statement

import os
import sys
import errno

from fuse import FUSE, FuseOSError, Operations


class Passthrough(Operations):
    def __init__(self, root):
        self.root = root

    # Helpers
    # =======

    def _full_path(self, partial):
        if partial.startswith("/"):
            partial = partial[1:]
        path = os.path.join(self.root, partial)
        return path

    # Filesystem methods
    # ==================

    def access(self, path, mode):
        full_path = self._full_path(path)
        if not os.access(full_path, mode):
            raise FuseOSError(errno.EACCES)

    def chmod(self, path, mode):
        full_path = self._full_path(path)
        return os.chmod(full_path, mode)

    def chown(self, path, uid, gid):
        full_path = self._full_path(path)
        return os.chown(full_path, uid, gid)

    def getattr(self, path, fh=None):
        full_path = self._full_path(path)
        st = os.lstat(full_path)
        return dict((key, getattr(st, key)) for key in ('st_atime', 'st_ctime',
                     'st_gid', 'st_mode', 'st_mtime', 'st_nlink', 'st_size', 'st_uid'))

    def readdir(self, path, fh):
        full_path = self._full_path(path)

        dirents = ['.', '..']
        if os.path.isdir(full_path):
            dirents.extend(os.listdir(full_path))
        for r in dirents:
            yield r

    def readlink(self, path):
        pathname = os.readlink(self._full_path(path))
        if pathname.startswith("/"):
            # Path name is absolute, sanitize it.
            return os.path.relpath(pathname, self.root)
        else:
            return pathname

    def mknod(self, path, mode, dev):
        return os.mknod(self._full_path(path), mode, dev)

    def rmdir(self, path):
        full_path = self._full_path(path)
        return os.rmdir(full_path)

    def mkdir(self, path, mode):
        return os.mkdir(self._full_path(path), mode)

    def statfs(self, path):
        full_path = self._full_path(path)
        stv = os.statvfs(full_path)
        return dict((key, getattr(stv, key)) for key in ('f_bavail', 'f_bfree',
            'f_blocks', 'f_bsize', 'f_favail', 'f_ffree', 'f_files', 'f_flag',
            'f_frsize', 'f_namemax'))

    def unlink(self, path):
        return os.unlink(self._full_path(path))

    def symlink(self, target, name):
        return os.symlink(self._full_path(target), self._full_path(name))

    def rename(self, old, new):
        return os.rename(self._full_path(old), self._full_path(new))

    def link(self, target, name):
        return os.link(self._full_path(target), self._full_path(name))

    def utimens(self, path, times=None):
        return os.utime(self._full_path(path), times)

    # File methods
    # ============

    def open(self, path, flags):
        full_path = self._full_path(path)
        return os.open(full_path, flags)

    def create(self, path, mode, fi=None):
        full_path = self._full_path(path)
        return os.open(full_path, os.O_WRONLY | os.O_CREAT, mode)

    def read(self, path, length, offset, fh):
        os.lseek(fh, offset, os.SEEK_SET)
        return os.read(fh, length)

    def write(self, path, buf, offset, fh):
        os.lseek(fh, offset, os.SEEK_SET)
        return os.write(fh, buf)

    def truncate(self, path, length, fh=None):
        full_path = self._full_path(path)
        with open(full_path, 'r+') as f:
            f.truncate(length)

    def flush(self, path, fh):
        return os.fsync(fh)

    def release(self, path, fh):
        return os.close(fh)

    def fsync(self, path, fdatasync, fh):
        return self.flush(path, fh)


def main(mountpoint, root):
   FUSE(Passthrough(root), mountpoint, foreground=True)
if __name__ == '__main__':
    main(sys.argv[2], sys.argv[1])

将这一个代码复制,然后命名为.py文件,可能会有缩进的问题,大家修改一下,按照上面的提示

[root@localhost fuse]# python test.py /usr  /nn

即可运行

分享到:
评论

相关推荐

    基于FUSE的简单文件系统 完整代码

    本主题“基于FUSE的简单文件系统 完整代码”将深入探讨如何使用FUSE库创建一个基本的用户空间文件系统,并提供了一份完整的代码示例。 FUSE的主要优势在于它的灵活性和易用性。开发者可以通过编写C语言程序,利用...

    fuse的源代码

    1. **FUSE库**:库文件是FUSE的核心部分,它提供了用户空间程序与内核FUSE驱动交互的接口。比如`fuse.h`头文件定义了各种函数原型,如`fuse_main`用于启动FUSE文件系统,`fuse_lowlevel_ops`结构体定义了文件系统...

    fuse-3.1.1.tar.gz

    FUSE的核心理念是将文件系统操作的大部分工作从内核转移到用户空间,这得益于Linux内核提供的一个名为`fuse`的内核模块。通过FUSE,开发者可以使用常见的高级编程语言(如C或Python)编写文件系统逻辑,而不需要直接...

    Fuse设计选型详解(个人总结)

    熔体是Fuse的核心部分,由金属材料制成,当电流超过设定值时会熔断,从而断开电路。电极是连接熔体与电路的部分,需要具备良好的导电性和低电阻。支架则提供机械支撑,确保熔体的稳定,并通常具有绝缘、耐热和阻燃...

    cenos fuse-exfat

    标签“fuse-exfat”是这个过程的关键部分,它指示我们使用的软件工具。FUSE(Filesystem in Userspace)允许非特权用户在Linux内核中实现自己的文件系统,而无需修改内核代码。fuse-exfat就是这样一个用户空间文件...

    fuse-2.9.2

    5. **内存管理**:FUSE库管理着与内核通信的数据结构和缓冲区,理解这部分代码可以帮助你优化文件系统的内存使用和性能。 6. **安全性和权限**:FUSE文件系统需要遵循标准的Unix权限模型。了解如何在用户空间中实现...

    fuse文件系统源码

    FUSE (File System in Userspace) 是一个开源的Linux内核模块,它允许用户在用户空间实现自己的文件系统,而无需直接编写内核代码。Fuse文件系统为开发人员提供了便利,因为它降低了创建新文件系统的技术门槛,使得...

    fuse相关流程.docx

    内核态部分主要负责实现完整的文件系统框架,包括与用户态的交互机制。其中的关键组件包括: - **/dev/fuse设备驱动**: 这是用户态程序与内核态之间通信的桥梁。用户态程序通过此设备驱动发送请求给内核,内核再...

    FUSE 用户级文件系统

    FUSE(Filesystem in Userspace)是一种在用户空间实现文件系统的机制,它允许程序员无需深入理解内核代码就可以创建自己的文件系统。这个概念的出现,大大降低了创建自定义文件系统的技术门槛,使得开发者可以更...

    前端开源库-fuse-npm

    4. **请求**: 当代码运行到需要使用某个npm包时,fuse-npm会自动处理导入,确保包在需要时被正确引入到浏览器环境中。 Fuse-npm的实现基于对ES模块系统的理解,它利用了动态导入(`import()`)特性,这是ES6引入的...

    fuse-2.9.4.tar.gz

    在开源的世界里,FUSE(File System in Userspace)是一个极具创新性的技术,它允许非特权用户在Linux操作系统上实现自己的文件系统,无需修改内核代码。标题中的"fuse-2.9.4.tar.gz"正是这个关键项目的源码压缩包,...

    基于fuse的简单文件系统实现

    Fuse(File System in Userspace)是一种允许用户空间程序实现文件系统的接口,它为开发者提供了一种灵活的方式来创建自定义的文件系统,而无需修改内核代码。本项目名为"基于fuse的简单文件系统实现",其目标是通过...

    dotnet-FuseStudio是一款可视桌面工具套件可用于Fuse框架

    下载并解压这个文件,开发者可以获得Fuse Studio的源代码或者安装程序,从而开始使用或者进行二次开发。这将有助于开发者深入理解Fuse Studio的内部工作原理,或者定制化自己的开发环境。 综合上述信息,Fuse ...

    fuse-ext2:Fuse-ext2是一个多操作系统FUSE模块,用于安装具有读写支持的ext2,ext3和ext4文件系统设备和_或映像。

    适用于macOS的Fuse的备用安装方法 如果已点击则可以通过安装用于macOS的保险丝。 要点击“自制酒桶” : brew tap homebrew/cask 要验证上述水龙头是否是brew的一部分: brew tap 在输出中寻找homebrew/cask 。...

    用户态文件系统fuse概念学习.docx

    FUSE将文件系统的大部分操作转移到用户空间,使得开发人员可以在熟悉的环境中编写代码,利用高级语言的特性,提高开发效率和代码可读性。然而,用户态和内核态之间的切换确实会引入一定的性能开销,这需要在灵活性和...

    exfat源代码

    要编译和运行这个源代码,开发者需要在Linux环境中安装必要的依赖,例如GCC编译器、FUSE库等。然后,他们可以按照提供的构建脚本进行编译,生成可执行文件,接着使用这个可执行文件挂载exFAT设备。 通过分析和研究...

    sd_fuse.rar

    标题 "sd_fuse.rar" 暗示了这个压缩包包含与三星SBC(System-on-Chip)4412相关的固件烧录工具和资料,特别是与SD卡启动相关的部分。描述中提到的"移植uboot"是指将U-Boot引导加载程序适配到4412平台的过程,而"bl1...

    shfs-fuse-2.2.tar.gz

    5. **配置和使用**:安装SSHFS时,通常需要先安装FUSE库,然后编译并安装sshfs源代码。配置时,可能需要设置SSH密钥对,以实现无密码自动登录。使用时,通过`sshfs`命令指定远程主机和本地挂载点即可。 6. **性能和...

    Go-Go的一个跨平台FUSE库

    FUSE是一个开源工具,它提供了一种方式,让用户可以在用户空间中创建自定义的文件系统,而无需修改内核代码。 FUSE库的主要作用是为开发者提供了一个抽象层,简化了与操作系统内核交互的过程,使得创建复杂的文件...

Global site tag (gtag.js) - Google Analytics