linux 下fuse API修改

fuse的API修改

这里的fuse API基于python进行修改fuse的安装请参照fuse的安装博客

 

在你挂载的目录下你进行的操作才会调用到的FUSE的文件系统,例如,你将/usr 挂载到了/opt/fuse下面,当你进入/opt/fuse下以后你使用的指令才是你写的文件系统的指令

这些指令不光是由一个fuse的函数执行而是由多个函数共同实现的

如:cd 操作调用到的函数由

_full_path

getattr

access

_full_path函数返回当前文件的原本路径

getattr函数事项文件属性的获取

access函数实现当前径的转换

所以必须修改这两个函数才能实现cd操作

修改API大多调用python中的os,os.path库函数,大家可以试着去看一看这些库函数

如_full_path函数

def _full_path(self, partial):

        if partial.startswith("/"):

            partial = partial[1:]

        path = os.path.join(self.root, partial)

 

        return path

如getattr修改代码:

    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'))

 

如access代码:

    def access(self, path, mode):

        full_path = self._full_path(path)

        if not os.access(full_path, mode):

 

            raise FuseOSError(errno.EACCES)

以下提供以下指令调用函数的顺序

---挂载

_init_

 

---cd

 

---getattr

_full_path

access

 

_full_path

 

---ls

readdir

_full_path

getattr

_full_path

readline

_full_path

 

getattr

 

---mkdir

 

getattr

_full_path

mkdir

_full_path

getattr

 

_full_path

 

---rm

 

getattr

_full_path

getattr

_full_path

readdir

_full_path

rmdir

 

_full_path

 

---tab(键)

readdir

_full_path

getattr

 

_full_path

 

---cat

 

getattr

_full_path

open

_full_path

read

getattr

_full_path

flush

release

 

 

附带一个可运行的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

 

   def _full_path(self, partial):

        if partial.startswith("/"):

            partial = partial[1:]

        path = os.path.join(self.root, partial)

        return path

 

    def access(self, path, mode):

        full_path = self._full_path(path)

        if not os.access(full_path, mode):

            raise FuseOSError(errno.EACCES)

 

    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 main(mountpoint, root):

    FUSE(Passthrough(root), mountpoint, foreground=True)

 

if __name__ == '__main__':

 

    main(sys.argv[2], sys.argv[1])

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值