要約:先日VirtualBox上のCentOS 7仮想マシンに入れたPostgreSQL 9.5 Alpha 1に、ホストのWindowsからpsqlpgAdminで接続するまでのメモ。PostgreSQLサービスの手動追加と、ポートを通す所がCentOS 6.6と少し違ってた以外、ちょうど1ヶ月前の記事の繰り返しで新鮮味がないけど、一応記録として。まぁそれだけ安定して環境構築できるのはいいことです。
Contents


実行環境、参考サイト
実行環境は、先日PostgreSQL 9.5 Alpha 1を入れた時のまま。再掲すると次のとおり。

• ホストOSWindows
7 32bit
• ゲストOSCentOS 7 64bit
• ゲストOSの元 …
OS Boxes - CentOS 7(VDIファイル)
• 仮想化ソフトウェア … Portable VirtualBox 4.3.6

操作は全てホストOSのコンソールからSSHで行い、仮想マシンのウィンドウは不要なので非表示(VirtualboxHeadlessモード)。この準備過程は
一昨日の記事にあります。またCentOS 7でのサービスやファイアウォール設定は、下記を参考にしました。m(_)m

» 働きたくないゆとりの備忘録: CentOS 7PostgreSQL最新版をインストール
»kakiro-web : CentOS7.1 64bit firewalldによるアクセス制御
» マイノリティでいこう: Red Hat EL 7(CentOS 7)ifconfigとかレガシーなnet-toolsがなくなった


PostgreSQLサービスの追加(仮想マシン起動時に自動実行)
先日PostgreSQL 9.5 Alpha 1を入れた時は、とりあえず一時的にpg_ctlで起動・終了させました。今回から、仮想マシン起動時にPostgreSQLが自動で立ち上がるようサービス化します。最初にサービス設定ファイルがあるか確認。下の画像は、ホスト側コンソールでSSHログインする所から。
[login]
ls /usr/lib/systemd/system | grep postgres


postgresql-9.5.serviceというファイルがあり、
先日yumpostgresql95-serverを入れた時に出来たようで、自前で設定ファイルを書く必要がなく一安心。↓ は試しにサービスを起動したところ(要ルート権限)。画像にはpsqlでのテストも入ってます。
su
[input password]
# systemctl start postgresql-9.5


以上の確認を経て、↓ のコマンドでPostgreSQLサービスを有効化(要ルート権限)。
# systemctl enable postgresql-9.5


念のため仮想マシンを再起動し確認すると、確かにPostgreSQLが動いてました。
service postgresql-9.5 status


CentOS 7firewalld設定(ポートを通す)
CentOS 6.6の時はiptablesを設定しましたが、CentOS 7ではfirewalldを使うのがデフォルトになった模様。下はその動作状況を確認したところ。publicゾーンのサービスにSSHがあるのでホスト側からリモートログインできてると分かり、同様にPostgreSQLを追加します。
service firewalld status
firewall-cmd --list-all


具体的には下のコマンドで。当初、サービス設定ファイル名と同じpostgresql-9.5--add-serviceに指定したらエラーになり(画像参照)、バージョン番号のないpostgresqlを指定したら成功。--permanentで次回以降の仮想マシン起動時も同様にし、--reloadで即反映させました。
su
[input password]
# firewall-cmd --permanent --add-service=postgresql
# firewall-cmd --reload


↓ 結果確認。確かにPostgreSQLが追加されてます。
firewall-cmd --list-all


PostgreSQLへの外部からの接続設定
いつもと同様、postgresql.confpg_hba.confを変更します。まずファイルの場所を確認。↓
cd /var/lib/pgsql/9.5/data
ls # check files


postgresql.confpg_hba.confviで修正。後者はVirtualBoxのネットワーク設定がNATの場合、ゲストOSから見るとゲートウェイ(=ホストOS)が10.0.2.2なので、そこからのパスワード認証による接続を許可。ついでにパスワード設定のためpsqlALTER ROLEコマンドを実行。別途ユーザを設定したり接続先データベースを限定したりする場合、このpg_hba.conf編集とALTER(CREATE)ROLE等のSQLを適宜組み合わせます。
vi [.../]postgresql.conf

#-----------------------------------------
# CONNECTIONS AND AUTHENTICATION
#-----------------------------------------

# - Connection Settings -

listen_addresses = '*'
...
vi [.../]pg_hba.conf

# TYPE  DATABASE        USER            ADDRESS                 METHOD
...
# IPv4 local connections:
host    all             all             127.0.0.1/32            trust
host    all             all             10.0.2.2/32             md5
...
/usr/bin/psql
# ALTER ROLE postgres password '********';


↓ 設定を即反映させるため、PostgreSQLサービスを再起動(要ルート権限)。
su
[input password]
service postgresql-9.5 restart


以上で仮想CentOS 7での作業終了。↓ はポートの待ち受け状態を確認したところ(CentOS 6.6でのnetstatコマンドの代わりにssコマンド)。PostgreSQLが使うポート5432番が確かにLISTENされてます。
ss -ntpa


VirtualBoxポートフォワーディング設定
通常の(ポータブル版でない)VirtualBoxなら、ホスト → ゲストの通信にホストオンリーアダプタ等の方法もありますが、ポータブル版VirtualBoxでは、ネットワークアダプタを追加しないNAT+ポートフォワーディングが手軽。仮想マシン起動中でもポートフォワーディング設定を変更でき、即反映されます。

仮想マシン設定画面 → ネットワーク →Advancedメニューを表示 → 下の方のポートフォワーディングを開き、適当な名前で設定を追加。ホスト・ゲストともIPlocalhostなら空欄で良いようです。ゲスト側ポートは仮想マシンの実際の番号を、ホスト側は接続時に使いたい番号を適当に。


Windowsホストから接続確認
VirtualBoxのポートフォワーディングを設定したら、即反映されてるはず。確認のためホスト側のpsqlから接続テストし ↓ 確かにできました。IPアドレスはlocalhostのままでいいので接続オプション不要。警告が二つ出てますが(psqlの方がバージョンが古い、コードページが違う)今日の件とは特に関係ないです。
[...\]psql -U postgres -p 5437


最後に、WindowspgAdminにサーバ追加し接続テスト。メニューのFileAdd Serverでダイアログを開き、psqlと同様にlocalhostで、ポートフォワーディング設定したポート番号を入力します。


サーバ追加ダイアログを閉じると同時に接続を試み、つながれば ↓ のようにバージョン違いの警告(pgAdminPostgreSQL
9.4までしか対応してない旨)が出ますが、接続自体は特に問題なし。


これでクエリもローカルのデータベースと同様に可能。PostgreSQL
9.5Windows版が出るのはもう少し先だと思うので(ベータ版から?)、しばらくはこの仮想マシンで試します。