動かざることバグの如し

近づきたいよ 君の理想に

systemdで起動すると/etc/security/limits.confの設定は効かない

検証環境

背景

Ubuntuサーバー上にElasticsearchを構築しようと思った。

が、起動時に以下のようなエラー

[2019-04-10T15:59:19,986][ERROR][o.e.b.Bootstrap          ] [es01] node validation exception
[1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is not locked

完全に理解した、の顔とともにエラーメッセージでググる。するとちゃんと解決策が載ってた。

要はカーネルパラメータを設定すればいいとのこと 早速/etc/security/limits.confに以下を追記して

elasticsearch hard memlock unlimited
elasticsearch soft memlock unlimited

で、Elasticsearchを再度起動。。。しても同じエラーになる。

原因

以下のサイトの解説が詳しい

PAM認証を介さないようなdaemon系プログラムの制限には/etc/security/limits.confは使えない

どういうことかというと、 /etc/pam.d/sudo とか /etc/pam.d/sshd

session required pam_limits.so

があることで、普段はlimits.confが適用される、と。

しかし、systemdでは当然/etc/pam.d/sudo なんぞ効かないし、共通の/etc/pam.d/common はデフォルトではpam_limits.soの設定ないためにsystemdで起動したプロセスには無効 ということ

解決策

設定は/etc/security/limits.confに書かずにsystemd側に書くのがベストプラクティスぽい

例えばelasticsearchのsystemdの設定ファイルは /usr/lib/systemd/system/elasticsearch.service である。

が、これを直接いじるのはリスキー、、、で実はsystemdにはデフォルトの設定を追記する機能がある。

systemctl edit elasticsearch

すると編集画面になるので、以下を追記

[Service]
LimitMEMLOCK=infinity

(余談だが、実際には/etc/systemd/system/elasticsearch.service.d/override.confというファイルを編集している。)

でリロードで反映

systemctl daemon-reload

実はこれElasticsearchの公式ドキュメントにちゃんと書いてあった。ちゃんと読もうな、、、