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

编辑

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

编辑

这仅适用于 Linux。

Elasticsearch 使用 Java 本地访问 (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 组件可能会失败,并显示消息表明这是 because JNA is not available

要解决这些问题,请从您的 /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 文件系统来实现此目的。