使用 Fuse 和 java 17 编写一个简单的文件系统


FUSE(用户空间中的文件系统)允许您在实现其接口时创建用户空间文件系统。FUSE 项目由两个组件组成:FUSE 内核模块和 libfuse 用户空间库。我们的实现将使用 libfuse 的高级 API。它提供了挂载文件系统、卸载文件系统、从内核读取请求以及发回响应的功能。
Project Panama 是 Java 语言改进的集合。该项目的目标是丰富和改进 Java 和本地(外部)接口之间的连接,这些接口通常由用 C 编写的应用程序使用。
Panama 由以下 JEP(JDK 增强提案)组成:

  • Foreign-Memory Access API JEP:JEP-370、JEP-383
  • 外部链接器 API JEP:JEP-389
  • 矢量 API JEP:JEP-338

我们将专注于 Foreign Linker API,因为它提供对本机代码的纯 Java 访问。使用外部链接器的另一个好处是它应该具有可比的性能或比 JNI 更好。
本文目标是探索 Project Panama 的外部链接器功能并创建我们的简单文件系统。我们将使用 Java 17 和 FUSE 来做到这一点。我们将研究如何进行向上调用、向下调用和使用内存地址来创建我们的内存文件系统。
 
安装
在开始之前,请确保您在 Linux/Mac 系统上安装了 FUSE(如果您使用的是 Windows,则可以使用 WSL1 或 WSL2 来跟随或任何 Linux VM)。我使用 libfuse 3.10.5 作为示例。在终端中运行ldconfig -p | grep libfuse 将显示安装的 Libfuse 版本。如果未安装 Libfuse,您将不会得到任何输出。
我们还需要 Jextract,它是一个从 C 头文件生成 Java 文件的工具,并且仅在 Panama 早期访问版本中可用。转到https://jdk.java.net/panama/并为您的系统下载最新版本并解压缩。我们只需要这个特定版本的 Java 来生成 Java 文件。我们要构建的项目可以使用任何 Java 17 GA 版本。
此外,在 ( https://github.com/libfuse/libfuse/releases )下载并解压缩安装在系统上的 Libfuse 源代码版本,我们将使用它作为 Jextract 的输入。
详细点击标题