要約:先日VirtualBox上のCentOS 7仮想マシンに入れたPostgreSQL 9.5 Alpha 1に、ホストのWindowsからpsqlやpgAdminで接続するまでのメモ。PostgreSQLサービスの手動追加と、ポートを通す所がCentOS 6.6と少し違ってた以外、ちょうど1ヶ月前の記事の繰り返しで新鮮味がないけど、一応記録として。まぁそれだけ安定して環境構築できるのはいいことです。
実行環境、参考サイト
実行環境は、先日PostgreSQL 9.5 Alpha 1を入れた時のまま。再掲すると次のとおり。 • ホストOS … Windows7 32bit • ゲストOS … CentOS 7 64bit • ゲストOSの元 … OS Boxes - CentOS 7(VDIファイル)
• 仮想化ソフトウェア … Portable VirtualBox 4.3.6
操作は全てホストOSのコンソールからSSHで行い、仮想マシンのウィンドウは不要なので非表示(VirtualboxのHeadlessモード)。この準備過程は一昨日の記事にあります。またCentOS 7でのサービスやファイアウォール設定は、下記を参考にしました。m(_)m » 働きたくないゆとりの備忘録 : CentOS 7にPostgreSQL最新版をインストール
» 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というファイルがあり、先日yumでpostgresql95-serverを入れた時に出来たようで、自前で設定ファイルを書く必要がなく一安心。↓ は試しにサービスを起動したところ(要ルート権限)。画像にはpsqlでのテストも入ってます。
su
[input password]
# systemctl start postgresql-9.5
以上の確認を経て、↓ のコマンドでPostgreSQLサービスを有効化(要ルート権限)。
# systemctl enable postgresql-9.5
念のため仮想マシンを再起動し確認すると、確かにPostgreSQLが動いてました。
service postgresql-9.5 status
CentOS 7のfirewalld設定(ポートを通す)
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.confとpg_hba.confを変更します。まずファイルの場所を確認。↓
cd /var/lib/pgsql/9.5/data
ls # check files
↓ postgresql.confとpg_hba.confをviで修正。後者はVirtualBoxのネットワーク設定がNATの場合、ゲストOSから見るとゲートウェイ(=ホストOS)が10.0.2.2なので、そこからのパスワード認証による接続を許可。ついでにパスワード設定のためpsqlでALTER 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メニューを表示 → 下の方のポートフォワーディングを開き、適当な名前で設定を追加。ホスト・ゲストともIPはlocalhostなら空欄で良いようです。ゲスト側ポートは仮想マシンの実際の番号を、ホスト側は接続時に使いたい番号を適当に。
Windowsホストから接続確認
VirtualBoxのポートフォワーディングを設定したら、即反映されてるはず。確認のためホスト側のpsqlから接続テストし ↓ 確かにできました。IPアドレスはlocalhostのままでいいので接続オプション不要。警告が二つ出てますが(psqlの方がバージョンが古い、コードページが違う)今日の件とは特に関係ないです。
[...\]psql -U postgres -p 5437
最後に、WindowsのpgAdminにサーバ追加し接続テスト。メニューのFile→Add Serverでダイアログを開き、psqlと同様にlocalhostで、ポートフォワーディング設定したポート番号を入力します。 サーバ追加ダイアログを閉じると同時に接続を試み、つながれば ↓ のようにバージョン違いの警告(pgAdminがPostgreSQL9.4までしか対応してない旨)が出ますが、接続自体は特に問題なし。 これでクエリもローカルのデータベースと同様に可能。PostgreSQL9.5のWindows版が出るのはもう少し先だと思うので(ベータ版から?)、しばらくはこの仮想マシンで試します。