我发现FUSE用户空间库和内核接口已经从Linux开始,移植到许多其他系统,并提供了一个相对稳定的API,具有可能的小表面积.如果我想在用户空间中创建文件系统,而我不在计划9或赫德,我会认为FUSE是我的最佳选择.
但是,我不打算使用libfuse.这部分是因为实用主义; 使用C很难用我选择的语言(Monte).这也是因为我对编写C支持代码完全不感兴趣,并且libfuse的推荐用法与Monte哲学不兼容.这应该不是问题,因为C不是神奇的,并且可以使用标准系统调用打开/ dev/fuse.
然而,要找文件,我找不到.我没有找到/ dev/fuse ABI/API的文档,也没有其他人使用相同的非C-bound路由的故事.令人沮丧.
是否有任何类型的文档存在如何与语言无关的方式与/ dev/fuse和内核的FUSE子系统进行交互?如果是这样,你能指点我吗?谢谢!
更新:存在go-fuse,它在Go中,是一种比C更易读的语言.但是,它也不包含任何ABI/API文档.
更新:我注意到人们投票决定关闭此事.别担心,没有必要这样做.我对自己所希望的文档尚不存在感到满意.我将自己编写文档,发布它,然后在接受的答案中链接到它.希望下一个搜索此文档的人不会失望.
编写一个存储在内存中的简单FUSE文件系统.文件系统必须支持以下命令:
ls,mkdir,cp
这个问题最近在接受采访时被问到,我无法回答.所以我决定学习它.
做了一些搜索,找到了一些关于构建我自己的FUSE文件系统的指南.我真的对如何在内存中实现文件系统毫无头绪.
我的问题是
我正在阅读的链接:
在最后一个链接中,提到了使用PyFileSystem进行内存中缓存.我不确定这可能会有什么帮助.
PS:这是一个书面采访问题,所以答案必须足够简单,在10-15分钟内写在纸上.
我是否可以编写可以通过标准可用实用程序在非root工厂设备上运行的自定义用户空间文件系统?
我知道fuse-android的存在,但据我所知,它需要一个root设备.如果不是这样,请纠正我.
我想要实现的目标是创建一个实际安装到文件的"假"FS.
试图让我自己的文件系统使用fuse(用户空间,linux中的文件系统)工作我真的很好奇在哪里获得所用操作的详细最新文档?
大多数时候,我搜索其他文件系统实现,看看他们做了什么,但有些操作似乎没有被广泛使用,如poll/ioctl或bmap.并且保险丝api的文档没有多大帮助,因为例如操作的参数和返回值没有记录,因此我必须猜测如何使用em
所以问题是我在哪里可以获得有关如何实施这种异国情调的更好信息?
谢谢
我正在实现一个FUSE文件系统,旨在通过熟悉的POSIX调用提供对实际存储在RESTful API后面的文件的访问.文件系统首次检索文件后会对文件进行缓存,以便在后续访问中更容易使用它们.
我正在以多线程模式运行文件系统(这是FUSE的默认模式),但发现getattr调用似乎是序列化的,即使其他调用可以并行进行.
打开文件时,FUSE总是先调用getattr,而我支持的客户端需要这个初始调用返回的文件大小是准确的(我对此行为没有任何控制权).这意味着,如果我没有在文件缓存我需要真正获得通过的RESTful API调用的信息.有时这些呼叫是在高延迟网络上发生的,往返时间约为600毫秒.
由于getattr调用的明显顺序性质,对当前未缓存的文件的任何访问都将导致整个文件系统在为此getattr提供服务时阻止任何新操作.
我已经提出了很多方法来解决这个问题,但是所有这些方法看起来都很丑陋或啰嗦,实际上我只是想让getattr调用并行运行,就像所有其他调用一样.
查看源代码我不明白为什么getattr应该像这样,FUSE会锁定tree_lock互斥锁,但仅用于读取,并且没有同时发生写入.
为了在这个问题中发布一些简单的东西,我已经敲了一个非常基本的实现,它只支持getattr并且可以轻松演示问题.
#ifndef FUSE_USE_VERSION
#define FUSE_USE_VERSION 22
#endif
#include <fuse.h>
#include <iostream>
static int GetAttr(const char *path, struct stat *stbuf)
{
std::cout << "Before: " << path << std::endl;
sleep(5);
std::cout << "After: " << path << std::endl;
return -1;
}
static struct fuse_operations ops;
int main(int argc, char *argv[])
{
ops.getattr = GetAttr;
return fuse_main(argc, argv, &ops);
}
Run Code Online (Sandbox Code Playgroud)
使用几个终端在(大致)同一时间在路径上调用ls表示第二个getattr调用仅在第一个完成时启动,这导致第二个ls需要~10秒而不是5秒.
1号航站楼
$ date; sudo ls /mnt/cachefs/file1.ext; date
Tue Aug 27 16:56:34 …Run Code Online (Sandbox Code Playgroud) 目前我正在使用C语言的Linux(2.6内核)中的FUSE文件系统模块开发应用程序.由于某些编程错误,应用程序在安装文件系统后崩溃.因为我是Linux/C环境中的新手开发人员.你能告诉我调试这些程序的可能选项吗?
我正在尝试使用JNA创建与FUSE库的绑定,但我在路上遇到了障碍.我尽可能地减少了代码,使其在这里易于理解.
FUSE库附带了一些用C语言编写的示例文件系统.最简单的就是hello.c.以下是其代码的最小化版本,只需在文件系统函数中进行一些打印:
hello.c:
/*
FUSE: Filesystem in Userspace
Copyright (C) 2001-2007 Miklos Szeredi <miklos@szeredi.hu>
This program can be distributed under the terms of the GNU GPL.
See the file COPYING.
gcc -Wall hello.c -o hello `pkg-config fuse --cflags --libs`
*/
#define FUSE_USE_VERSION 26
#include <fuse.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <fcntl.h>
static int hello_getattr(const char *path, struct stat *stbuf)
{
printf("getattr was called\n");
return 0;
}
static int hello_readdir(const char *path, void *buf, …Run Code Online (Sandbox Code Playgroud) 我想在docker容器中挂载s3fs.
我用s3fs制作了docker图像,并且这样做:
host$ docker run -it --rm docker/s3fs bash
[ root@container:~ ]$ s3fs s3bucket /mnt/s3bucket -o allow_other -o allow_other,default_acl=public-read -ouse_cache=/tmp
fuse: failed to open /dev/fuse: Operation not permitted
Run Code Online (Sandbox Code Playgroud)
显示"不允许操作"错误.
所以我用谷歌搜索,并做了这样(再次添加--privileged = true):
host$ docker run -it --rm --privileged=true docker/s3fs bash
[ root@container:~ ]$ s3fs s3bucket /mnt/s3bucket -o allow_other -o allow_other,default_acl=public-read -ouse_cache=/tmp
[ root@container:~ ]$ ls /mnt/s3bucket
ls: cannot access /mnt/s3bucket: Transport endpoint is not connected
[ root@container:~ ]$ fusermount -u /mnt/s3bucket
[ root@container:~ ]$ s3fs s3bucket /mnt/s3bucket -o allow_other -o …Run Code Online (Sandbox Code Playgroud) 任何人都帮我在Perl中创建一个虚拟文件系统.非常简单,2深度级别,如
/subdir
subdir-l2
file2.txt
/file1.txt
Run Code Online (Sandbox Code Playgroud)
我尝试使用Fuse.pm,但不了解如何创建subdir级别.我创建%files hash,如果转到subdir,则使用新记录重新创建它.它仅供测试.
#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Fuse;
use POSIX qw(ENOENT EISDIR EINVAL);
my (%files) = (
'.' => {
type => 0040,
mode => 0755,
ctime => 1490603721
},
subdir => {
type => 0040,
mode => 0755,
ctime => 1490603721
},
"file1.txt" => {
type => 0100,
mode => 0755,
ctime => 1490603721
}
);
sub filename_fixup {
my ($file) = shift;
$file =~ s,^/,,;
$file = '.' unless …Run Code Online (Sandbox Code Playgroud)