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