【ITニュース解説】Q&D: PostgreSQL 18 on OpenBSD
2026年09月15日に「Dev.to」が公開したITニュース「Q&D: PostgreSQL 18 on OpenBSD」について初心者にもわかりやすく解説しています。
ITニュース概要
OpenBSDにPostgreSQL 18をインストールする際、データベース初期化でセマフォ不足エラーが出ることがある。これはシステム制限が低いためで、`sysctl`コマンドで`kern.seminfo.semmni`と`kern.seminfo.semmns`の値を上げ、`/etc/sysctl.conf`に追記すると解決する。
ITニュース解説
OpenBSDという堅牢なオペレーティングシステム上で、PostgreSQLという人気のデータベース管理システムを最新バージョンで利用しようとすると、システムの設定によっては初期化段階でエラーに遭遇することがある。この解説では、その具体的なエラー内容と、システムエンジニアとしてどのように対応し解決していくかの一連の流れを詳細に見ていく。
まず、OpenBSD上でPostgreSQLサーバーをインストールするには、pkg_add postgresql-serverというコマンドを実行する。これは、必要なソフトウェアパッケージをシステムに導入する一般的な手順である。インストールが完了した後、データベースを利用するためには、まずデータベースの「初期化」という作業が必要となる。これは、データベースがデータを保存するための領域や初期設定ファイル群を作成する工程であり、initdbというコマンドで行う。記事では/var/postgresqlディレクトリに移動し、doas -u _postgresql initdb -D dataと実行している。ここで_postgresqlはPostgreSQLが動作するための専用ユーザーアカウントを指し、dataはデータベースのデータが保存されるディレクトリ名を指定している。
しかし、このinitdbコマンドの実行中に、次のようなエラーが発生した。「FATAL: could not create semaphores: No space left on device」。このメッセージを見て、「No space left on device」という部分からディスクの空き容量が不足しているのではないかと誤解しがちだが、PostgreSQLのエラーメッセージは、それがディスク容量の問題ではないことを明確に示している。「HINT: This error does not mean that you have run out of disk space. It occurs when either the system limit for the maximum number of semaphore sets (SEMMNI), or the system wide maximum number of semaphores (SEMMNS), would be exceeded. You need to raise the respective kernel parameter.」とあるように、これはシステムが提供するセマフォという仕組みに関する上限値が不足しているために発生している。
セマフォとは、複数のプログラムやプロセスが共有するシステムリソース(資源)を安全に管理し、それらの間で処理の順序を同期させるための仕組みである。これにより、複数のプロセスが同時に同じ資源にアクセスして不整合を起こすといった問題を防ぐことができる。PostgreSQLのようなデータベースシステムは、多くのプロセスが同時に動作し、メモリやファイルなどの資源を共有するため、このセマフォを多用する。OpenBSDのデフォルト設定では、PostgreSQLが要求する数のセマフォを確保できないことがあり、それが今回のような初期化失敗の原因となるのだ。エラーメッセージには、システムコールsemgetが失敗したこと、そしてセマフォの最大セット数(SEMMNI)またはシステム全体の最大セマフォ数(SEMMNS)が不足している可能性が指摘されている。
この問題を解決するためには、OpenBSDカーネルのセマフォに関するパラメータを変更する必要がある。具体的には、kern.seminfo.semmni(セマフォセットの最大数)とkern.seminfo.semmns(システム全体のセマフォの最大数)という二つのパラメータが該当する。これらは、sysctlというコマンドを使って一時的に変更できる。
記事ではまず、doas sysctl kern.seminfo.semmni=256と実行し、kern.seminfo.semmniの値をデフォルトの10から256へと引き上げている。次に、doas sysctl kern.seminfo.semmns=2048と実行し、kern.seminfo.semmnsの値をデフォルトの60から2048へと大幅に増加させている。これらの変更によって、PostgreSQLが初期化に必要なセマフォ資源を十分に確保できるようになる。
システムパラメータの変更が完了したら、再びinitdbコマンドを実行する。doas -u _postgresql initdb -D dataというコマンドを投入すると、今度はエラーが発生することなく、データベースの初期化が無事に完了した。「Success.」というメッセージと共に、データベースサーバーの起動方法も示される。初期化の過程では、データベースのエンコーディングやタイムゾーン、そしてmax_connections(最大接続数)やshared_buffers(共有バッファサイズ)といった初期設定値が決定される。記事の成功例では、max_connectionsが100、shared_buffersが128MBというデフォルト値が設定されたことが示されている。これは、変更前のデフォルト値であるmax_connections 20、shared_buffers 400kBから増強されており、システムリソースが増加したことと関連している可能性がある。
データベースの初期化が成功した後、実際にデータベースサーバーを起動するには、doas rcctl start postgresqlというコマンドを実行する。rcctlはOpenBSDのサービス管理コマンドであり、これでPostgreSQLサービスが開始される。記事ではpostgresql(ok)と表示され、起動が成功したことを示している。
ここで注意すべきは、sysctlコマンドで直接変更したシステムパラメータは、システムの再起動によってデフォルト値に戻ってしまうという点である。そのため、これらの設定を永続化させるには、/etc/sysctl.confというシステム設定ファイルに追記する必要がある。記事では、echo "kern.seminfo.semmni=256" | doas tee -a /etc/sysctl.confとecho "sysctl kern.seminfo.semmns=2048" | doas tee -a /etc/sysctl.confというコマンドを使って、変更した二つのパラメータをこの設定ファイルに追記している。tee -aは、指定した内容をファイルに追記する際に使用される。これにより、次にシステムが再起動された際にも、これらのセマフォ設定が自動的に適用されるようになる。
最後に、データベースが正しく動作していることを確認するため、psqlコマンドを使ってPostgreSQLデータベースに接続する。doas -u _postgresql psql postgresと実行することで、_postgresqlユーザーとしてpostgresというデフォルトのデータベースに接続できる。接続が成功すると、psql (18.6)とPostgreSQLのバージョンが表示され、postgres=#というプロンプトが表示される。これは、データベースの操作が可能な状態になったことを意味する。
このように、一見すると難解なシステムエラーも、エラーメッセージを注意深く読み解き、適切なシステム知識とコマンド操作を組み合わせることで解決できる。システムエンジニアを目指す上で、このような問題解決の経験は非常に重要であり、エラーメッセージの分析能力や、OSのカーネルパラメータといった低レイヤーの知識が求められることを示している。