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