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

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

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics