确保 JNA 临时目录允许可执行文件

编辑

确保 JNA 临时目录允许可执行文件编辑

这仅与 Linux 相关。

Elasticsearch 使用 Java Native Access (JNA) 库和另一个名为 libffi 的库来执行一些平台相关的本地代码。在 Linux 上,这些库的本地代码在运行时被提取到一个临时目录中,然后映射到 Elasticsearch 地址空间中的可执行页面。这要求底层文件不在使用 noexec 选项挂载的文件系统上。

默认情况下,Elasticsearch 会在 /tmp 中创建其临时目录。但是,一些加固的 Linux 安装默认情况下会使用 noexec 选项挂载 /tmp。这会阻止 JNA 和 libffi 正确工作。例如,在启动时,JNA 可能会因 java.lang.UnsatisfiedLinkerError 异常而无法加载,或者显示类似于 failed to map segment from shared object 的消息,或者 libffi 可能会报告类似于 failed to allocate closure 的消息。请注意,异常消息在不同的 JVM 版本之间可能会有所不同。此外,依赖于通过 JNA 执行本地代码的 Elasticsearch 组件可能会因消息而失败,表明这是 因为 JNA 不可用

要解决这些问题,请从您的 /tmp 文件系统中删除 noexec 选项,或者通过设置 $ES_TMPDIR 环境变量来配置 Elasticsearch 使用不同的位置作为其临时目录。例如

  • 如果您直接从 shell 运行 Elasticsearch,请按如下方式设置 $ES_TMPDIR

    export ES_TMPDIR=/usr/share/elasticsearch/tmp
  • 对于通过 RPM 或 DEB 包完成的安装,需要通过 系统配置文件 设置环境变量。
  • 如果您使用 systemd 将 Elasticsearch 作为服务运行,请在 服务覆盖文件 中的 [Service] 部分添加以下行

    Environment=ES_TMPDIR=/usr/share/elasticsearch/tmp

如果您需要更精细地控制这些临时文件的位置,您还可以使用 JVM 标志 -Djna.tmpdir=<path> 配置 JNA 使用的路径,并且可以通过设置 LIBFFI_TMPDIR 环境变量来配置 libffi 用于其临时文件的路径。Elasticsearch 的未来版本可能需要额外的配置,因此您应该尽可能地设置 ES_TMPDIR

Elasticsearch 不会删除其临时目录。您应该在 Elasticsearch 未运行时删除剩余的临时目录。最好自动执行此操作,例如在每次重启时。如果您在 Linux 上运行,您可以通过使用 tmpfs 文件系统来实现这一点。