原英文版地址: https://www.elastic.co/guide/en/elasticsearch/reference/7.7/executable-jna-tmpdir.html, 原文档版权归 www.elastic.co 所有
本地英文版地址: ../en/executable-jna-tmpdir.html

不使用noexec挂载JNA临时目录

这仅与Linux相关。

Elasticsearch 使用 Java Native Access (JNA) 库来执行一些平台相关的本地代码。 在 Linux 上,支持这个库的本地代码是在运行时从 JNA 档案中提取的。

默认情况下,这段代码被提取到 Elasticsearch 临时目录中,该目录默认为 /tmp 的子目录。 或者,可以用 JVM 标志 -Djna.tmpdir=<path> 来控制这个位置。

由于本地库作为可执行文件被映射到 JVM 虚拟地址空间中,因此提取此代码的位置的底层挂载点 不能 使用 noexec 来挂载,因为这会阻止 JVM 进程将此代码映射为可执行文件。

在一些强化的 Linux 安装上,这是 /tmp的默认挂载选项。

使用 noexec 挂载底层的一个迹象是,在启动时,JNA 抛出 java.lang.UnsatisfiedLinkerError 异常而无法加载,并显示一条像 failed to map segment from shared object 这样的消息。 注意,不同 JVM 版本的异常消息可能不同。

此外,Elasticsearch 依赖于通过 JNA 执行本地代码的组件将会失败,并显示指示 because JNA is not available 的消息。 如果你看到这样的错误消息,必须重新挂载用于 JNA 的临时目录,以不使用 noexec 的方式进行挂载。