Linux 内存熔丝文件系统

Linux 内存熔丝文件系统,linux,filesystems,fuse,Linux,Filesystems,Fuse,编写一个存储在内存中的简单FUSE文件系统。文件系统必须支持以下命令: ls,mkdir,cp 这个问题最近在一次采访中被问到,我无法回答。 所以我决定学习它 进行了一些搜索,找到了一些关于构建我自己的FUSE文件系统的指南。 我真的不知道如何在内存中实现文件系统 我的问题是 我的方向对吗 我还应该读什么 解决办法是什么 我正在阅读的链接: 在最后一个链接中,提到了内存缓存。 我不确定这会有什么帮助 PS:这是一个书面面试问题,所以答案必须足够简单,可以在10-15分钟内写

编写一个存储在内存中的简单FUSE文件系统。文件系统必须支持以下命令:

ls,mkdir,cp

这个问题最近在一次采访中被问到,我无法回答。 所以我决定学习它

进行了一些搜索,找到了一些关于构建我自己的FUSE文件系统的指南。 我真的不知道如何在内存中实现文件系统

我的问题是

  • 我的方向对吗
  • 我还应该读什么
  • 解决办法是什么
我正在阅读的链接:

在最后一个链接中,提到了内存缓存。 我不确定这会有什么帮助


PS:这是一个书面面试问题,所以答案必须足够简单,可以在10-15分钟内写在纸上。

我参加了一门课程,我们必须构建一个内存中的分布式文件系统,其设计与之类似。这门课程深受学生的启发。完成他们最初的几个实验任务将是一个很好的练习


这也很有帮助

> P>您没有指定编程语言,虽然FASE是本地C++,但在Golang中实现了本机绑定。p> 我认为答案的主要部分需要包括以下内容:

  • 处理内存中文件系统树的数据结构
  • 节点描述及其与索引节点的关系
  • 钩子捕获FUSE服务器请求以处理cli命令
  • 有关使用FUSE服务器装载文件夹的说明 我最近使用此适配器编写了一个内存中文件系统:。我对其性能的描述如下:。很快,我做了几个选择:

    内存中的数据结构包含两个主要结构,即dir和file,它们都是节点:

    type Node struct {
        ID uint64 
        Name string 
        Attrs fuse.Attr 
        Parent *Dir 
    }
    
    type Dir struct {
        Node
        Children map[string]Node
    }
    
    type File struct {
        Node
        Data []byte 
    }
    
    如您所见,这是一个简单的树,可以通过
    子链接
    父链接上下遍历。文件的
    Data
    属性保存文件的所有内容。因此,文件系统只需要在装入点创建一个名为
    “\”
    的“根”目录,然后在
    mkdir
    上,将
    Dir
    添加到其子目录,在
    cp
    上,添加
    文件。在Go中,这非常简单:

    type FS struct {
        root *Dir 
    }
    
    func Mount(path string) error {
    
        // Unmount the FS in case it was mounted with errors.
        fuse.Unmount(path)
    
        // Mount the FS with the specified options
        conn, err := fuse.Mount(path)
        if err != nil {
            return err
        }
    
        // Ensure that the file system is shutdown
        defer conn.Close()
    
        // Create the root dir and file system 
        memfs := FS{
            root: &Dir{
                ID: 1, 
                Name: "\", 
                Parent: nil, 
            },
        }
    
        // Serve the file system
        if err := fs.Serve(conn, memfs); err != nil {
            return err
        }
    }
    
    现在需要挂钩来实现各种FUSE请求和调用。以下是
    mkdir
    的示例:

    func (d *Dir) Mkdir(ctx context.Context, req *fuse.MkdirRequest) (fs.Node, error) {
        // Update the directory Atime
        d.Attrs.Atime = time.Now()
    
        // Create the child directory
        c := new(Dir)
        c.Init(req.Name, req.Mode, d)
    
        // Set the directory's UID and GID to that of the caller
        c.Attrs.Uid = req.Header.Uid
        c.Attrs.Gid = req.Header.Gid
    
        // Add the directory to the directory
        d.Children[c.Name] = c
    
        // Update the directory Mtime
        d.Attrs.Mtime = time.Now()
    
        return c, nil
    }
    

    最后,通过讨论如何编译和运行服务器、装载到路径以及FUSE如何拦截内核调用并将它们传递到用户空间中的进程来结束访谈问题

    我知道这可能会回避这个问题,但是为什么不使用FUSE而不是通过FUSE滚动您自己的文件系统呢?@FrédéricHamidi:tmpfs是一个很好的选择,谢谢。但遗憾的是,这并没有回答您提到的问题。我猜存储在内存中意味着您必须分配某种缓冲区,并将该缓冲区用作fs后端?只需下载tar.gz,开始实现回调,就可以了。编写完回调代码后,您将清楚地看到没有编写的内容understand@Fr因为这是减少非特权用户对系统管理员依赖的一种方法?