Skip to content

Latest commit

 

History

History
37 lines (31 loc) · 1.78 KB

executable-jna-tmpdir.asciidoc

File metadata and controls

37 lines (31 loc) · 1.78 KB

JNA temporary directory not mounted with noexec

Note
This is only relevant for Linux.

{es} uses the Java Native Access (JNA) library, and another library called libffi, for executing some platform-dependent native code. On Linux, the native code backing these libraries is extracted at runtime into a temporary directory and then mapped into executable pages in {es}'s address space. This requires the underlying files not to be on a filesystem mounted with the noexec option.

By default, {es} will create its temporary directory within /tmp. However, some hardened Linux installations mount /tmp with the noexec option by default. This prevents JNA and libffi from working correctly. For instance, at startup JNA may fail to load with an java.lang.UnsatisfiedLinkerError exception or with a message that says something similar to failed to map segment from shared object. Note that the exception message can differ amongst JVM versions. Additionally, the components of {es} that rely on execution of native code via JNA may fail with messages indicating that it is because JNA is not available.

To resolve these problems, either remove the noexec option from your /tmp filesystem, or configure {es} to use a different location for its temporary directory by setting the $ES_TMPDIR environment variable. For instance:

export ES_TMPDIR=/usr/share/elasticsearch/tmp

Alternatively, you can configure the path that JNA uses for its temporary files with the JVM flag -Djna.tmpdir=<path> and you can configure the path that libffi uses for its temporary files with the LIBFFI_TMPDIR environment variable.