【问题标题】:Implementing basic file system实现基本文件系统
【发布时间】:2011-01-12 11:37:56
【问题描述】:

作为一个大学项目,我需要在一个文件中实现一个基本的文件系统。那么我该怎么做呢?我需要知道哪些事情?要求包括在后台有一个守护进程。此外,使用该系统的应用程序需要使用 Unix 域套接字连接到服务器

文件系统应具备以下能力:

  1. 列出存储的文件及其大小。
  2. 创建文件
  3. 允许更改文件
  4. 删除文件

【问题讨论】:

  • 我们可以在这里做一些假设吗:我们不是在创建一个真正的文件系统:也就是说,我们不希望使用普通的 ls 或 dir 命令来查看内容。相反,我们正在实现一项服务,该服务通过套接字上的自定义接口公开文件。我们正在编写服务器和客户端库。服务器的数据存储在单个文件中。这是正确的吗?
  • 类似的更通用的问题:*.com/questions/4714056/…

标签: linux file filesystems


【解决方案1】:

看看这个是否有帮助。 http://www.geocities.ws/ravikiran_uvs/articles/rkfs.html

如果您想在用户空间创建文件系统,FUSE 可以帮助您。 http://fuse.sourceforge.net/

【讨论】:

    【解决方案2】:

    这里是an example 的一个非常非常基本的 FUSE 实现,它由一个美化的共享内存段 (xenstore) 支持。它是我维护的原始 xenstore FUSE 文件系统的一个分支。

    您还将找到一些代码,向您展示如何在调试 FUSE 实现时使 Valgrind 更有帮助。

    您为 open / create / read / write / truncate / getattr / etc 编写函数并将它们传递给 fuse(行号来自链接的示例):

       343 static struct fuse_operations const xsfs_ops = {
       344  .getattr = xsfs_getattr,
       345  .mknod = xsfs_mknod,
       346  .mkdir = xsfs_mkdir,
       347  .unlink = xsfs_rm,
       348  .rmdir = xsfs_rmdir,
       349  .truncate = xsfs_truncate,
       350  .open = xsfs_open,
       351  .read = xsfs_read,
       352  .write = xsfs_write,
       353  .readdir = xsfs_readdir,
       354  .create = xsfs_create,
       355  .destroy = xsfs_destroy,
       356  .utime = xsfs_utime,
       357  .symlink = xsfs_symlink,
       358  .init = (void *)xsfs_init
       359 };
    

    如您所见,它非常不言自明。稍加搜索就会发现许多基本的文件支持的 FUSE 实现示例。

    我强烈建议您完全在用户空间进行,除非您有足够的时间来熟悉内核。

    【讨论】:

      【解决方案3】:

      文件系统本质上是文件的数据库。您需要的主要是用于存储字节偏移量和文件长度的查找表。文件名也可以存储在表中,或者它们可以存储在每个偏移量的前几个字节中。如果您将文件系统设置为固定大小,这对您来说会容易得多。

      这类似于 FAT 文件系统的工作方式。

      您也可以查看http://en.wikipedia.org/wiki/Database_storage_structures,因为在最低级别的文件系统和数据库非常相似。

      【讨论】:

        【解决方案4】:

        最简单的方法是构建一个模板来存储数据,然后将文件解析到ram中,当然这不是最有效的。

        类似...

        某些/位置/文件名 >>> 文件的内容在这里,等等等等 >> 另一个文件的内容在这里

        然后列出一个目录,使用正则表达式查找所有以 >>> 结尾的行,然后解析到第 X 个斜杠(基于搜索文件夹中斜杠的数量),并进行区分大小写的搜索,取决于您是否希望它区分大小写。当然,正如我提到的将其加载到内存中,您可以搜索 key->value hashmap,这可能会简单得多。

        【讨论】: