【问题标题】:Solaris: Mounting a file system on an application's handlersSolaris:在应用程序的处理程序上安装文件系统
【发布时间】:2010-12-06 19:25:40
【问题描述】:

当挂载 NFS 文件系统时,所有数据处理都通过 nfs 客户端进行。我如何编写自己的处理程序来使用 NFS 以外的东西?

另一种方法是 localhost NFS 服务器,但它的接缝非常低效

编辑

应该发生的事情的例子

通常你会得到一个文件系统:应用程序读取/写入文件系统,Solaris 会看到它的安装位置,如果它是磁盘,那么它会读取/写入磁盘。如果是软件镜像,它会读取和写入镜像软件。如果它是 NFS,它会读取和写入远程 NFS 服务器。我希望它能够读取和写入自定义存储软件,而不是上述任何选项。

我们的存储软件用于存储应用程序使用的文件,它适用于未存储在数据库中的大型或经常替换的数据块。它还包括我们公司特有的某些灵活性。

旧的/现有的应用程序不知道我们的新软件。他们只知道读/写一个目录。我们可以告诉 Solaris,该目录托管在 NFS 上,然后 NFS 服务器转换并连接到存储软件。我们更愿意将 Solaris 从未听说过的新程序告诉 Solaris,然后教 Solaris 如何与我们的程序对话。

【问题讨论】:

  • 您希望应用程序直接与 NFS 服务器通信?你问的是这个吗?有什么特别的原因吗?
  • 我想要一种方法来拦截来自使用文件/文件系统的现有应用程序的数据。 NFS 客户端只是一个例子。我可以编写一个 NFS 服务器并以这种方式挂载它,但重点是挂载数据,而不是与 NFS 对话。
  • 您能否提供您所期望的具体示例,并解释为什么 localhost NFS 服务器会以低效的方式完成这项工作?
  • 您可以挂载 NFS 文件系统并将其指向手动编写的 NFS 服务器。然后,该 NFS 服务器将与我们的处理软件进行交互。但是,该示例要求您通过 NFS 客户端、环回接口运行所有数据。如果我可以将我的代码放在与 NFS 客户端相同的位置,那么这些额外的层将被消除,因为它可以使用数据处理软件而不使用环回接口,并且我可以跳过与 NFS 的转换。但是,如果我有一个使用 Java 的 NFS 服务器,我会采用效率较低的路线……只是为了节省开发时间。
  • 嗯,我仍然不知道你在找什么。您是否正在寻找编写自己的文件系统?或者只是一个自定义设备驱动程序?您未能提供任何预期用途的“具体”示例。

标签: java unix filesystems solaris


【解决方案1】:

在我看来,这听起来像是您必须创建一个伪文件系统。 Solaris 使用 VFS(虚拟文件系统),在该系统下,您可以使用不同的文件系统作为一个统一的结构呈现给用户空间。无论您挂载 UFS 或 NFS 还是任何文件系统,用户和应用程序都可以使用与文件系统无关的工具与 VFS 进行交互。

这意味着你需要创建一个伪文件系统;管理 vnode 和 vfs 操作(VFS 系统调用接口)的文件系统,例如 read()、write() 等并将它们绑定到数据库后端(决定当有人打开特定文件时要做什么等)你的选择。

阅读全文:

http://developers.sun.com/solaris/articles/solaris_internals_ch14_file_system_framework.pdf

听起来像是一项艰巨的任务......

问候, jgr

【讨论】:

  • 使用我们的数据存储软件(有点像数据库,但不完全一样),现有的应用程序都必须重写。但是,如果我们只是将文件系统挂载到设备控制的地方,那么我们就可以两全其美了。使用文件系统的应用程序不受影响,它们可以利用我们的存储软件的优势。
  • 好的,所以您的应用程序正在与您的数据库通信。数据库通过 Solaris VFS 写入文件系统。你需要再次做什么?恐怕还是一无所知...
  • 我需要一种将文件保存到我的数据库而不是直接保存到硬盘的方法。但我不想重写所有当前使用文件系统的现有应用程序。我没有使用 VFS。
  • 如果应用程序不是时间关键的,一种方法(更简单)是不改变应用程序的行为,即仍然写入磁盘,然后将该数据推入数据库通过 3:rd 代理,您必须编写。它可以是守护进程或 bash 脚本或其他任何东西,具体取决于您的应用程序生成的数据量。这就是我的想法。
  • 同步写入数据很重要。我编辑了我的问题。
【解决方案2】:

您可能想查看一些 CIFS 服务器。 Alfresco 有 JCIFS,它是 Java 中的 CIFS 服务器库。它使您可以将资源呈现为文件,就好像它们在 Windows 系统上一样。因此,这意味着程序可以“挂载”这些 CIFS 服务器,并且您可以通过该机制从数据库中发布数据。

我没有使用它,但这听起来像是你想做的事情,也许你可能想研究一下。

还有 FUSE 可让您在“用户模式”下创建自定义文件系统,而不必破解内核。它适用于 Unix 和 Mac OS,也可能有 Windows 版本。从理论上讲,这可以做任何事情。

例如,有些实例允许您使用 FUSE 系统通过 SSH 挂载远程系统。这些往往是用 C/C++ 编写的。

【讨论】:

  • 我们不使用 Windows.... 原因很明显。 FUSE 看起来很有趣。我认为比编写 NFS 翻译服务器要好得多:P
  • 如果你不是在文件级别做古怪的事情,Solaris 完全支持内置的 CIFS,所以你可能仍然需要考虑 CIFS 服务器。
【解决方案3】:

NFS 不是在软件上挂载目录,而是在目录上挂载远程共享。存储设备是否远程并不重要,它仍然是通过内核软件层。 Solaris 使用 VFS 提供第一层。你应该实现底层的。对于已经熟悉 VFS 的人来说,这将是一项相当艰巨的任务。由于您显然不熟悉编写内核代码,因此我对您的项目非常悲观...

我建议您改为使用更简单且风险更低的方法。实现一个插入库,它会拦截应用程序 I/O 代码(打开、读取、写入、关闭等,或者可能是 libc fopen、fwrite,您必须找出最好的插入位置)并调用您的存储软件而是。

这是一个简单的过程示例: http://developers.sun.com/solaris/articles/lib_interposers.html

【讨论】:

    猜你喜欢
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-25
    • 1970-01-01
    相关资源
    最近更新 更多