【问题标题】:Running a Java application in its own fake filesystem在自己的假文件系统中运行 Java 应用程序
【发布时间】:2012-12-20 00:42:40
【问题描述】:

我正在设计一组 Java 程序,希望有朝一日能将它们变成基于 Java 的操作系统。在我得到一个内核工作之前,我只想在 Linux 系统上运行它们(我使用的是 Ubuntu,如果这很重要的话)。因此,我需要将所有文件系统调用定向到我的主文件夹中的不同目录,因此从 Java 中访问 / 实际上会访问 /home/<user>/Thunderbolt/

我基本上需要与this questionalso this question 相同的东西,但对于Java。

我看过关于chroot 的东西,我认为这可能有效,但我不知道如何让它与Java 一起工作。我根本不需要担心安全性,我只需要不同的假文件系统。

此外,需要访问核心 Java 库,而无需将它们复制到假文件系统中。

这可能吗?如果可以,我该如何设置?

【问题讨论】:

标签: java linux file


【解决方案1】:

不确定,但如果您只想重现文件系统语义(可能用于测试),我建议您抽象文件系统后端。

一个不错的选择是使用commons-vfs。它模仿一个虚拟文件系统,支持:

  • .zip 文件/.jar 文件
  • .gz 文件
  • 内存文件系统
  • 基于类路径的文件系统
  • 基于网址

所以基本上,您的“thunderbolt”目录将是另一个实现的文件系统,您可以将其用于测试和设计。

您的所有应用都需要依赖调用 VFS,但我认为这不是一个大问题。

【讨论】:

  • 我的目标是能够使用正常的文件系统访问 API(文件、FileInputStream 等),就像我一旦进入具有自己的内核等的单独系统但同时在顶部运行时一样Linux,只需将调用重定向到一个特殊的目录。我不确定commons-vfs,但它看起来不像这样做?
  • 不,它没有。当然,你可以重写整个 JVM。或者甚至想出一个更好的。做我的客人:)
【解决方案2】:

[Linux] Chroot 是正确的(但并不简单)。对于不重新复制所有库...您可以使用

mount --bind -o ro /source/ /destination/

手动安装了解更多信息)

【讨论】:

  • 所以你是说如果我设置了一个 Chroot,我可以将 Java 库绑定到我的 Chroot 中?
  • 正确!您可以将 chroot 外部的子目录绑定到 chroot 内部。这样您就可以节省空间,而不必单独更新版本
  • 感谢您的帮助!我得到了我想要使用 chroot 工作的东西;到目前为止,我只是复制了大部分我想要的库,但我确实将 Java 安装绑定到了我的 chroot 中。这是我为使其工作所做的工作:askubuntu.com/a/236821/109543.
【解决方案3】:

系统库中以文件路径字符串为参数的类并不多。文件确实如此,可能是 FileInputStream、FileReader、RandomAccessFile,可能是 URL 应该审查,也可能是其他一些 - 几天审查应该揭示最多。

根据您的具体情况,考虑使用开源并允许这样做的OpenJDK 调整 Java 系统库可能是合理的。还有另外两个可选的 FOSS 项目,GNU ClasspathApache Harmony,它们可能更容易构建(我过去多次构建 GNU Classpath)但这些项目目前不是很活跃。它们专门针对研究或其他项目需要修改 Java 系统库的情况而启动。

如果您发现这些项目难以构建,您可以尝试单独构建并仅替换几个系统类。

此解决方案还允许运行无法修改的第三方 Java 程序,以通过 commonsfs API 路由所有文件系统访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2017-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-16
    • 1970-01-01
    相关资源
    最近更新 更多