Perl-5.8.7とDBI Pg XML::Parserのインストール

前回makeに失敗してパッケージでいれてしまったPerlですが、PostgreSQLを入れる際にgmakeが無かったという発見もあったので再度ソースからコンパイルに挑戦することにしました。

そういうことでパッケージのPerlを削除します。
# pkg_info
linux_base-8-8.0_6 Base set of packages needed in Linux mode (only for i386)
perl-5.8.7 Practical Extraction and Report Language

# pkg_delete perl-5.8.7

次にPerlと必要モジュールのダウンロードをします。今回の構成はProject-mmo用のゲームサーバーとしての構築なのでDBIやDBD::Pgの他にFLASHクライアントからのデータを処理するXML::Parserが必要になります。

Perlとモジュールの配布元
http://www.perl.com/CPAN/

Configureで問答するのはイヤなのであらかじめ用意されているconfigure.gnuを利用。
# tar zxvf perl-5.8.7.tar.gz
# cd perl-5.8.7
# ./configure.gnu
# make
# make install

make時に一部errorの表示があったがお構いなし。(後々解析して影響が無いか調べないといけないな)
Perlのインストールが終わったらこれからインストールするモジュールが既に組み込まれていないか確認する。

# find `perl -e ‘print “@INC”‘` -name ‘*.pm’ -print

DBIのインストール

# tar zxvf DBI-1.48.tar.gz
# cd DBI-1.48
# perl Makefile.PL
# make
# make install

DBD::Pgのインストール
# tar zxvf DBD-Pg-1.41.tar.gz
# cd DBD-Pg-1.41
# perl Makefile.PL
# make
# make install

ここまでは順調だったがXML::Parserについてはperl Makefile.PLを実行した段階でexpatが必要と警告が出て止まる。

XML::Parserインストールの前にexpatをインストール
http://sourceforge.net/projects/expat/

# tar zxvf expat-1.95.8.tar.gz
# cd expat-1.95.8
# ./configure
# make
# make install

XML::Parserのインストール

# tar zxvf XML-Parser-2.34.tar.gz
# cd XML-Parser-2.34
# perl Makefile.PL
# make
# make install

これで完了。用意したゲームサーバースクリプトも動作できました。

PostgreSQL8.1.0インストール

入手したソースアーカイブのチェック
# md5 postgresql-8.1.0.tar.gz
MD5 (postgresql-8.1.0.tar.gz) = 644b50b88cd2b93e465bb8ff30da09ed

FreeBSDの最小構成ではgmakeが入ってないのでmake時に失敗するためgmakeをインストール。

ftp://ftp.gnu.org/gnu/make/

# tar zxvf make-3.80.tar.gz
# ./configure
# make
# make install

postgresグループとユーザーを作成する。このとき出来るならばgidとuidを70にセットする。
これはアーカイブを解凍したときにchownを省略できるため。(元々postgresのuid/gidは70で定義されているみたい)※意味がわからなければ解凍後chownでpostgresにしてください。

今回はpwコマンドを初めて使ったので(というかリファレンス不足でpwコマンドの詳細が不明)uidとgidは後から編集しました。

# pw groupadd postgres
# pw useradd postgres -m -d /usr/local/pgsql -g postgres -s /bin/tcsh

## -g グループ
## -s シェル
## -d ホーム
## -m ホームが無ければ作成

パスワードを設定
# passwd postgres

uidを編集(vipwを使わなくて vi /etc/passwdでもOKです)
# vipw

gidを編集
# vi /etc/group

uid/gidが変わったのでホームディレクトリの所有者・グループを修正。
# chown -R postgres:postgres /usr/local/pgsql

解凍
# tar xzvf postgresql-8.1.0.tar.gz

postgresユーザーに切り替え( – をつけるとログインするユーザーのプロファイルを使用します)
# su – postgres

コンフィグレーション
% cd /usr/local/src/postgresql-8.1.0
% ./configure –enable-multibyte=EUC_JP –with-perl

–enable-multibyte=EUC_JP 日本語を使用するとき必要。コードセットはEUC
–with-perl Perl用Pgライブラリをコンパイル

コンパイル
% make

インストール
% make install

環境変数の設定(csh,tcshの場合)
% vi ~/.login

下記を追加

————————————————————
# PostgreSQL
setenv PG_HOME “/usr/local/pgsql”
setenv PATH “${PATH}:${PG_HOME}/bin”
setenv PGLIB “${PG_HOME}/lib”
setenv PGDATA “${PG_HOME}/data”

if ($?MANPATH) then
setenv MANPATH “${MANPATH}:${PG_HOME}/man”
else
setenv MANPATH “/usr/man:/usr/local/man:${PG_HOME}/man”
endif

if ($?LD_LIBRARY_PATH) then
setenv LD_LIBRARY_PATH “${LD_LIBRARY_PATH}:${PGLIB}”
else
setenv LD_LIBRARY_PATH “${PGLIB}”
endif
————————————————————

環境変数の変更を適用(csh,tcshの場合)
source ~/.login

データディレクトリの作成
% mkdir /usr/local/pgsql/data

データの初期化
% initdb /usr/local/pgsql/data

テスト
% postmaster -D /usr/local/pgsql/data

問題なければ起動
% postmaster -i -S -D /usr/local/pgsql/data

-i TCP/IP経由で接続する場合に使用。現在多くのサーバーシステムでは必須。
-S サイレントモード(バックグランドで起動)
-D [ディレクトリ] データディレクトリを指定

最小構成以外でLinuxやBSDを入れている人は、rpmやportsのpostgresが混入していないかチェックしてください。既に起動していてポートが使えなかったり、バージョンやディレクトリ構成の差異によって予期せぬ不具合を起こします。(違う場所のinitdbやpostmasterを呼び出したりなど)

自動起動(FreeBSD)
ここからはまたrootに戻って作業

ソースに起動ファイルがあるのでコピーする
# cd /usr/local/src/postgresql-8.1.0/contrib/start-scripts
# cp freebsd /usr/local/etc/rc.d/postgres.sh

オプションやパス等が正しいか確認する。(ここでは-iを追加)
# vi /usr/local/etc/rc.d/postgres.sh

実行権を与える
# chmod 755 /usr/local/etc/rc.d/postgres.sh

これで自動起動の設定は完了です。iオプションを有効にしているので外部からの接続が制限できているかpostgresユーザーになって下記のファイルを確認します。

# su – postgres
% less /data/pg_hba.conf

————————————————————
# TYPE DATABASE USER CIDR-ADDRESS METHOD

# “local” is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
host all all 127.0.0.1/32 trust
# IPv6 local connections:
host all all ::1/128 trust
————————————————————

デフォルトではこのようになっておりlocalhost以外からは接続できないように設定されているようです。これだけでは安心できないので前段にファイヤーウォールを設置した方が良いと思います。

サーバー管理コマンド

UNIX系どっぷり生活ですが(仕事でLinux、自宅でBSD)運用上よく使う管理コマンドをメモ。

# top

起動しているプロセスの一覧とCPU、メモリーの使用率を表示。
サーバーが重いなと感じたらまずこれを使いましょう。

# ps

起動しているプロセスの一覧、-xでシステムプロセス、-auで全てのユーザーのプロセスを表示。
全プロセスを確認するときはps -auxと入力。ここではサービス等が正常な状態で起動しているかどうか等をチェックする。

# df

パーティションの使用率を表示。 -hオプションでK(キロ)・M(メガ)・G(ギガ)等単位をつけて表示してくれるので便利です。

# du

ディレクトリの使用量を表示。du -sk * とするとカレント直下のディレクトリの使用量を表示。

# netstat
TCP/IPでサービスを行っているサーバーなら必須のコマンド。-nでポート番号を数値に変換。基本はnetstat -lnで使用しています。

# ipcs
共有メモリ内の使用状況を表示。サービスをkillコマンドで強制終了させた場合にゴミが残っていることがあるのでそのときはipcrmで駆除。

Perlをソースからインストール

まず、ココを読まれた方にお伝えしたいことがあります。
Perlはソースからインストールするメリットがわかりません。
特にカスタマイズするものではないので特にソースコンパイルに興味が無ければパッケージからインストールしてください。

今回のサーバー構築はスペック的にも厳しいものがあるので、使わないサービスは一切入れないこととパッケージインストールはせず意地ででソースコンパイルという名目もあるので、Perlもソースからコンパイルします。

Perlはhttp://www.perl.com/CPAN/src/より入手。実はWindowsからpscpを使って転送しました。

コンフィグ
./Configure

コンパイル
make

インストール
make install

これだけだと超カンタンに見えますが、実はコンフィグが対話式で沢山の質問に対してyesかnoで答えなければいけません。あまりに面倒なのでデフォルトでいいやと[Enter]連打したら…。

> cd /usr/local/bin
> ls
a2p5.9.2 h2ph5.9.2 perldoc5.9.2 pod2text5.9.2 s2p5.9.2
c2ph5.9.2 h2xs5.9.2 perlivp5.9.2 pod2usage5.9.2 splain5.9.2
corelist5.9.2 instmodsh5.9.2 piconv5.9.2 podchecker5.9.2 xsubpp5.9.2
cpan5.9.2 libnetcfg5.9.2 pl2pm5.9.2 podselect5.9.2
dprofpp5.9.2 perl5.9.2 pod2html5.9.2 prove5.9.2
enc2xs5.9.2 perlbug5.9.2 pod2latex5.9.2 psed5.9.2
find2perl5.9.2 perlcc5.9.2 pod2man5.9.2 pstruct5.9.2

ちょっとまて─────!
こんなんじゃ使いにくいだろボケ───!

という事でやり直しです。 orz…

PAM: authentication error

リモートでSSHログインが出来ないから、BSDマシンがDHCPだとダメなのか?hosts.allowに書いてないとダメなのかとやってみましたが、実はローカルでやってもダメだった。そこで出たエラーが

PAM: authentication error

何ですかねこれ?

ググッてみたらこの文章。
Note: The configuration defaults for sshd(8) have been changed. SSH
protocol version 1 is no longer enabled by default. In addition,
password authentication over SSH is disabled by default if PAM is
enabled.

翻訳したらこうなる。
注意: sshd(8)のための構成デフォルトを変えました。 セキュアシェル (SSH)

プロトコルバージョン1はデフォルトでもう可能にされません。 さらに、PAMが
有効にされるなら、SSHの上のパスワード認証はデフォルトで無効にされます。

何ー!?仕様変更でパス認証が無効になっているのか?

/etc/ssh/ssh_config内において
PasswordAuthentication yes
を有効にした時点でサーバー自身からsshログインは可能になった。
さらに、/etc/ssh/sshd_configも同様に設定すると、リモートからログインが出来たーー!!