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に似たメッセージが表示される場合や、libffifailed to allocate closureのようなメッセージを報告することがあります。例外メッセージはJVMのバージョンによって異なる場合があります。また、JNAを介してネイティブコードの実行に依存するElasticsearchのコンポーネントは、because JNA is not availableであることを示すメッセージで失敗する可能性があります。

これらの問題を解決するには、noexecオプションを/tmpファイルシステムから削除するか、$ES_TMPDIR環境変数を設定してElasticsearchが一時ディレクトリの異なる場所を使用するように構成します。たとえば:

  • シェルから直接Elasticsearchを実行している場合は、$ES_TMPDIRを次のように設定します:
    1. export ES_TMPDIR=/usr/share/elasticsearch/tmp
  • RPMまたはDEBパッケージを通じてインストールした場合、環境変数はシステム構成ファイルを通じて設定する必要があります。
  • systemdを使用してElasticsearchをサービスとして実行している場合は、サービスオーバーライドファイル[Service]セクションに次の行を追加します。

テキスト

  1. Environment=ES_TMPDIR=/usr/share/elasticsearch/tmp

これらの一時ファイルの場所をより細かく制御する必要がある場合は、JVMフラグ-Djna.tmpdir=<path>を使用してJNAが使用するパスを構成することができ、libffiが一時ファイルに使用するパスをLIBFFI_TMPDIR環境変数を設定することで構成できます。将来のElasticsearchのバージョンでは追加の構成が必要になる可能性があるため、可能な限りES_TMPDIRを設定することをお勧めします。

Elasticsearchは一時ディレクトリを削除しません。Elasticsearchが実行されていないときに残った一時ディレクトリを削除する必要があります。これは自動的に行うのが最良で、たとえば再起動のたびに行うのが理想です。Linuxで実行している場合は、tmpfsファイルシステムを使用することでこれを実現できます。