确保 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 使用不同的位置作为其临时目录。例如
如果您需要更精细地控制这些临时文件的位置,您还可以使用 JVM 标志 -Djna.tmpdir=<path>
配置 JNA 使用的路径,并且可以通过设置 LIBFFI_TMPDIR
环境变量来配置 libffi
用于其临时文件的路径。Elasticsearch 的未来版本可能需要额外的配置,因此您应该尽可能地设置 ES_TMPDIR
。
Elasticsearch 不会删除其临时目录。您应该在 Elasticsearch 未运行时删除剩余的临时目录。最好自动执行此操作,例如在每次重启时。如果您在 Linux 上运行,您可以通过使用 tmpfs 文件系统来实现这一点。