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
即可运行
相关推荐
适用于macOS的Fuse的备用安装方法 如果已点击则可以通过安装用于macOS的保险丝。 要点击“自制酒桶” : brew tap homebrew/cask 要验证上述水龙头是否是brew的一部分: brew tap 在输出中寻找homebrew/cask 。...
该软件包允许从Go编写和挂载用户空间文件系统。 如下安装: go get -u github.com/jacobsa/fuse 之后,请参阅以下三个软件包的文档: 软件包提供了对安装新文件系统... 该软件包的灵感和与内核相关的大部分代码都 。
读取屏幕上的警告/错误(保险丝字节也将在此处打印,但是最好是从microSD或通过TegraRcmSmash.exe -r通过USB读取它们)变化GPLv2许可要求此部分基于初始代码除保险丝原色外,所有其他材料均已移除(从“大气层”中...
FTerm是一个通用的仿真终端软件。FTerm最初是由浙江大学笑书亭BBS的站长fuse...FTerm采用Delphi作为开发环境,核心代码由Francois Piette编写的ICS控件衍生而来,并且做了较大修改,目前此部分代码为开放源代码。
关于 文件系统。 安装 首先,您需要安装 。...目前,该程序的功能只有一小部分被实际实现,而且大部分代码都非常糟糕。 不要指望这会奏效。 发展 要对 MPDFS 做出更改,请通过电子邮件将补丁发送给其中一个开
我们将使用FUSE接口实现几个常见的文件系统,并最终将代码合并到Simple-OS内核中。 依存关系 :该项目已经过测试,将由GCC进行编译。 :我们使用FUSE帮助我们实现文件系统(请参阅“ Implementing File System...
用法将文件夹BCPlayer和组件复制到您的项目文件夹中修改.unoproj文件,并将"**.js:Bundle"行添加到“ Includes部分中 " Includes " : [ " **.js:Bundle " , " * " ], 要在代码上使用播放器,请使用此代码<...
本教程的第二部分将在FUSE挂载上处理crypt4gh。 这将允许通过系统上的任何工具进行加密以及读取/操作加密文件。 在crypt4gh的C实现上测试samtools 获取源代码 mkdir $HOME/opt; cd $HOME/opt git clone ...
您可以跨多个linux和Windows节点挂载blob容器(或其中的一部分)。 重要笔记: 这是blobfs的linux / mac版本,请从找到Windows版本的blobfs。 对于blobfs的核心库,可以从找到它。 负责处理所有潜在的天蓝色blob...
s3monkey:像访问本地文件一样访问S3存储桶像这样的平台不允许使用FUSE文件系统,因此我不得不变得有点创意。 引入s3monkey ,它是模拟所有标准Python库系统文件操作的库,允许您使用已编写的代码与Amazon S3交互。 ...
电子React套件打字稿这是用于构建Electron应用程序的TypeScript和React入门套件。 了解一些选择和动机。例你必须带来自己的真棒。...保留对您有用的东西,其余部分放弃状态管理... mobx ? / redux ? ...都很棒。 都排
(3)使用CVAVR中的编程下载程序时应特别注意,由于 CVAVR编程下载界面初始打开时,大部分熔丝位的初始状态定义为“1”,因此不要使用其编程菜单选项中的“all”选项。此时的“all”选项会以熔丝位的初始状态定义来...