JNAの一時ディレクトリが実行可能ファイルを許可することを確認する
これはLinuxにのみ関連します。
ElasticsearchはJava Native Access (JNA)ライブラリと、プラットフォーム依存のネイティブコードを実行するためのlibffi
という別のライブラリを使用します。Linuxでは、これらのライブラリを支えるネイティブコードは、実行時に一時ディレクトリに抽出され、その後Elasticsearchのアドレス空間に実行可能ページとしてマッピングされます。これには、基盤となるファイルがnoexec
オプションでマウントされたファイルシステム上にないことが必要です。
デフォルトでは、Elasticsearchは/tmp
内に一時ディレクトリを作成します。しかし、一部の強化されたLinuxインストールでは、/tmp
がデフォルトでnoexec
オプションでマウントされています。これにより、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
であることを示すメッセージで失敗する可能性があります。
これらの問題を解決するには、noexec
オプションを/tmp
ファイルシステムから削除するか、$ES_TMPDIR
環境変数を設定してElasticsearchが一時ディレクトリの異なる場所を使用するように構成します。たとえば:
- シェルから直接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
が一時ファイルに使用するパスをLIBFFI_TMPDIR
環境変数を設定することで構成できます。将来のElasticsearchのバージョンでは追加の構成が必要になる可能性があるため、可能な限りES_TMPDIR
を設定することをお勧めします。
Elasticsearchは一時ディレクトリを削除しません。Elasticsearchが実行されていないときに残った一時ディレクトリを削除する必要があります。これは自動的に行うのが最良で、たとえば再起動のたびに行うのが理想です。Linuxで実行している場合は、tmpfsファイルシステムを使用することでこれを実現できます。