FreeBSD jail PostgreSQL FATAL

FreeBSD jailでPostgreSQLを動かそうとして手こずったメモ。

FreeBSD jailを使っている場合に、子ホスト環境でPostgreSQLを動かす難易度が高いのは、比較的有名な話である。
jailとは無関係な話、PostgreSQLはOSの共有メモリ領域(shared memory)というものを使う。
子ホスト環境は、デフォルトでは親ホスト環境の共有メモリ領域を使用できない。
よって実行そのものがままならない、というメカニズムである。

この現象に見舞われるのはPostgreSQLだけではなく、共有メモリ領域を使用するすべてのプログラムだと捉えて差し支えない。

<現象の再現>
portsでのmake installまでは正常に完了する。
問題はその後のinitdb(データベースを格納するディレクトリの初期化)である。

下記のようなエラーが発生する。

# su -l pgsql -c initdb
The files belonging to this database system will be owned by user “pgsql”.
This user must also own the server process.

The database cluster will be initialized with locale C.

creating directory /usr/local/pgsql/data … ok
(中略)
creating configuration files … ok
creating template1 database in /usr/local/pgsql/data/base/1 … FATAL: could not create shared memory segment: Function not implemented
DETAIL: Failed system call was shmget(key=1, size=1327104, 03600).

child process exited with exit code 1
initdb: removing data directory “/usr/local/pgsql/data”

<解決方法>
いま分かっている限りで最も手順が少ないのは下記。
・/etc/sysctl.confへのパラメタ追記

security.jail.sysvipc_allowed=1

・/etc/rc.confで、子ホストへの共有メモリ使用を許可
jail_sql_parameters="allow.sysvipc=1"

起動スクリプトを組んでいる場合は、jail -cで子ホストを起動した直後に下記記述を追記する。

jail -m jid=XXXX allow.sysvipc=1

XXXXの箇所は各自の環境に読み替える。

<所見>
インターネットを検索すると、この件の解決方法は実に「諸説ある」。
rc.confに記述を追加する人、loader.confとsysctl.confに共有メモリ確保を明示的に記述する人、実にさまざまである。
実のところ、上記手順から1つ目のsysctl.confへの追記は省略しても目的は実現できてしまう。
つまり、たにぐちさんの環境(10.1)ではパラメタを1か所追加するだけで済んでしまった。
FreeBSDのバージョンによっても変わってくるのかもしれないな。

下記は最終的に一番参考になったページ。
BMT Solutions

コメントを残す

メールアドレスが公開されることはありません。

名前:たにさん or たにぐちさん
職業:むかし、元オタク
  • アーカイブ

  • 最近の投稿

  • 最近のコメント

  • イマ☆ドキ地味なアクセス件数