Webサーバとして有名な Apacheを64bit+IPv6環境で検証します
Apacheは Windows系 UNIX系で動作するメジャーな Webサーバです
オープンソース財団の The Apache Software Foundationも設立され
Webサーバ以外のオープンソースソフトも精力的に開発しています
上記 The Apache Software Foundationのトップページですが
多数のプロジェクトが管理されていることが分かります
今回 HTTP Server をインストールして 64bit環境 IPv6環境での動作検証を行います
検証環境
CPU
AMD PhenomII X4 905e (2.5GHz 4コア)
メモリ
16GB
OS
Gentoo-1.12.14ベース Linux-3.0 UTF-8
コンパイラ
gcc-4.5.2
Cライブラリ
glibc-2.13
Perl
5.12.2
PHP
SQLite
autoconf-3070800
BerkeleyDB
5.1.25.NC
PostgreSQL
9.1
MySQL
5.5.15
Oracle
11g Express Edition Release2
LDAP
OpenLDAP-2.4.23
Apache httpd
2.2.21
Apache apr
1.4.5
Apache apr-iconv
1.2.1
Apache apr-util
1.3.12
インストール
Apache(本家) から Stable Releaseをダウンロードします
ダウンロードしたソースを一時ディレクトリに展開します
$ tar -xjf httpd-2.2.21.tar.bz2
$ cd httpd-2.2.21
$ ls -F srclib/
Makefile.in apr/ apr-util/ pcre/
$
srclib/ に含まれている apr apr-util のパッケージを先にインストールする必要があります
これらプログラムは APR(Aapche Portable Runtime)と呼ばれ
OS間の差異を吸収する 共通ライブラリとして機能します
(具体的には メモリ確保 I/O ライブラリリンク スレッド 時刻 ユーザID など)
srclib/ に含まれていない apr-iconv も導入しておきたいので
apr apr-iconv apr-util をまとめて Portable Runtime Project
からダウンロードしておきましょう
aprのインストールは下記のように行いました
$ ./configure --prefix=/usr/apache --enable-threads
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
Configuring APR library
〜
config.status: creating apr-1-config
config.status: creating apr.pc
config.status: creating test/Makefile
config.status: creating test/internal/Makefile
config.status: creating include/arch/unix/apr_private.h
config.status: executing default commands
$ make
make[1]: ディレクトリ `/home/admin/apr-1.4.5' に入ります
〜
make[1]: ディレクトリ `/home/admin/apr-1.4.5' から出ます
$ su
# make install
make[1]: ディレクトリ `/home/admin/apr-1.4.5' に入ります
make[1]: `local-all' に対して行うべき事はありません.
make[1]: ディレクトリ `/home/admin/apr-1.4.5' から出ます
〜
/usr/bin/install -c -m 644 build/apr_rules.out /usr/apache/build-1/apr_rules.mk
/usr/bin/install -c -m 755 apr-config.out /usr/apache/bin/apr-1-config
#
ビルドを補助するためのコマンドで apr-1-config が使えるようになります
apr-iconvのインストールは apr-utilのインストールと同時に行います
そのためここでは アーカイブの展開だけしておきます
$ tar -xzf apr-iconv-1.2.1.tar.gz
$
続いて apr-utilのインストールを下記のように行いました
$ tar -xzf apr-util-1.3.12.tar.gz
$ cd apr-util-1.3.12
$ ./configure --prefix=/usr/apache --with-apr=/usr/apache --with-apr-iconv=../apr-iconv-1.2.1 --with-sqlite3=/usr --with-dbm=db51 --with-pgsql=/usr --with-mysql=/usr/mysql --with-oracle=$ORACLE_HOME --with-odbc=/usr --with-ldap=/usr
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
checking for a BSD-compatible install... /usr/bin/install -c
checking for working mkdir -p... yes
〜
config.status: creating include/apu_want.h
config.status: creating test/Makefile
config.status: creating include/private/apu_config.h
config.status: executing default commands
$ make
Making all in ../apr-iconv-1.2.1
make[1]: ディレクトリ `/home/admin/apr-iconv-1.2.1' に入ります
(cd lib; make CPPFLAGS=" ")
〜
dbd/apr_dbd_odbc.c: In function ‘odbc_start_transaction':
dbd/apr_dbd_odbc.c:1178:32: 警告: 異なるサイズの整数からポインタにキャストされました
/bin/sh /usr/apache/build-1/libtool --silent --mode=link gcc -g -O2 -pthread -release 1 -module -rpath /home/admin/lib/apr-util-1 -o dbd/apr_dbd_odbc.la dbd/apr_dbd_odbc.lo -L/usr/lib -lodbc
make[1]: ディレクトリ `/home/admin/apr-util-1.3.12' から出ます
$ su
# make install
/usr/apache/build-1/mkdir.sh /home/admin/lib/apr-util-1
Making all in ../apr-iconv-1.2.1
〜
/usr/bin/install -c -m 644 aprutil.exp /usr/apache/lib
/usr/bin/install -c -m 755 apu-config.out /usr/apache/bin/apu-1-config
#
apr-iconv関連では apriconv のコマンドが利用できるようになります
あと /usr/apache/lib/iconv/ 配下にやたらと各国語用のモジュールが追加されます
apr-util関連では apu-1-config がビルド補助用に使えるようになり
/usr/apache/lib/apr-util-1/ に各データベース接続用のモジュールが追加されます
–with-apr-iconv の指定により apr-iconvも同時にビルドされますが
インストールされた apu-1-config に修正が必要でした
(apu-1-config –libs とコマンドを叩くと apr-iconv関連のパス修正が必要と分かるでしょう)
29
30 LIBS="/home/admin/apr-util-1.3.12/../apr-iconv-1.2.1/lib/libapriconv.la -lexpat"
31 INCLUDES="/home/admin/apr-util-1.3.12/../apr-iconv-1.2.1/include "
32 LDFLAGS=""
LIBSの部分と INCLUDESの部分に ソースディレクトリが指定されてしまっているので修正します
下記のように修正しました
29
30 LIBS="/usr/apache/lib/libapriconv-1.la -lexpat"
31 INCLUDES=""
32 LDFLAGS=""
また検証環境では Oracleが認識されず configure前に下記作業が必要でした
# cd $ORACLE_HOME/lib
# ln -s libclntsh.so.11.1 libclntsh.s
つまり -lclntsh 付きの gcc がコンパイルできる必要があるのです
Oracleを使っているのに lib/apr-util-1/に apr_dbd_oracle〜 が見付からない場合は
上記の対応後 apr-utilsの再ビルドが必要です
以上でようやく apache本体のビルドが可能となります
$ tar -xjf httpd-2.2.21.tar.bz2
$ cd httpd-2.2.21/
$ ./configure --prefix=/usr/apache --localstatedir=/var --enable-suexec --with-suexec-caller=www --enable-so --enable-modules="most" --enable-mods-shared="most"
checking for chosen layout... Apache
checking for working mkdir -p... yes
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking target system type... x86_64-unknown-linux-gnu
Configuring Apache Portable Runtime library ...
〜
config.status: creating build/rules.mk
config.status: creating build/pkg/pkginfo
config.status: creating build/config_vars.sh
config.status: creating include/ap_config_auto.h
config.status: executing default commands
$ make
Making all in srclib
make[1]: ディレクトリ `/home/admin/httpd-2.2.21/srclib' に入ります
Making all in pcre
〜
/usr/apache/build-1/libtool --silent --mode=link gcc -g -O2 -pthread -o suexec suexec.lo
make[2]: ディレクトリ `/home/admin/httpd-2.2.21/support' から出ます
make[1]: ディレクトリ `/home/admin/httpd-2.2.21' から出ます
$ su
# make install
Making install in srclib
make[1]: ディレクトリ `/home/admin/httpd-2.2.21/srclib" に入ります
〜
mkdir /usr/apache/man/man1
mkdir /usr/apache/man/man8
mkdir /usr/apache/manual
make[1]: ディレクトリ `/home/deer/admin/httpd-2.2.21" から出ます
#
configureオプションですが –enable-so は動的モジュール化するのに必須です
–enable-modules="most" –enable-mods-shared="most"
で Apacheのオプション機能をほとんど有効化しモジュール化しています
$ ls /usr/apache/modules/
httpd.exp mod_authz_user.so mod_include.so
mod_actions.so mod_autoindex.so mod_info.so
mod_alias.so mod_cgi.so mod_log_config.so
mod_asis.so mod_dav.so mod_logio.so
mod_auth_basic.so mod_dav_fs.so mod_mime.so
mod_auth_digest.so mod_dbd.so mod_negotiation.so
mod_authn_anon.so mod_deflate.so mod_reqtimeout.so
mod_authn_dbd.so mod_dir.so mod_rewrite.so
mod_authn_dbm.so mod_dumpio.so mod_setenvif.so
mod_authn_default.so mod_env.so mod_speling.so
mod_authn_file.so mod_expires.so mod_status.so
mod_authz_dbm.so mod_ext_filter.so mod_substitute.so
mod_authz_default.so mod_filter.so mod_suexec.so
mod_authz_groupfile.so mod_headers.so mod_userdir.so
mod_authz_host.so mod_ident.so mod_version.so
mod_authz_owner.so mod_imagemap.so mod_vhost_alias.so
$
特に小容量の Apacheを作りたいなどカスタマイズの必要があれば
–enable-modules="alias cgi" のように個別に指定することも可能です
続いて Apache用の start/stopスクリプトを用意しましょう
下記で紹介するのは Gentoo形式に従ったスクリプトですが
Apacheには apachectlという管理コマンドが付属しているのでシンプルな記載になります
#!/sbin/runscript
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header$
depend() {
need net.eth0
}
start() {
ebegin "Starting apache"
/usr/apache/bin/apachectl start
eend $?
}
stop() {
ebegin "Stopping apache"
/usr/apache/bin/apachectl stop
eend $?
}
次に Apacheの設定ファイルをカスタマイズします
conf/httpd.conf が設定ファイルです
最近の Apacheはモジュールに関する設定を conf/extra/ に分けてインポートする記述のため
httpd.conf本体は だいぶ軽量化しています
httpd.confの修正点は下記の通りです
User www
Group daemon
httpd実行アカウントを指定します www のアカウントが既に存在していたので利用しました
ServerAdmin www@mydomain
ServerName www.mydomain:80
ServerAdminには管理者メールアドレスを指定します
ServerNameは 公開するHPのFQDNとポート番号を指定します ここは httpdの動作に必須の項目です
(mydomainの DNSに wwwホスト設定の追加もしておきます)
とりあえず最小限の設定は以上です まずは Apacheが動作するかを確認しましょう
# /etc/init.d/apache start
* Caching service dependencies ... [ ok ]
* Starting apache ... [ ok ]
#
IPv6クライアントの検証ページでApacheの正常動作を確認しました
(書きかけですが とりあえずここまで)
IPv6サーバツールへ戻る
PostgreSQLを試してみる
PostgreSQLは 高機能なオープンソースRDBMS(データベース)です
PostgreSQLは MySQLと 肩を並べるほどの高機能なオープンソースRDBMSです
日本語環境も充実しているので 日本での普及も進んでいるようです
今回 64bit環境 IPv6環境での動作検証を行います
検証環境
CPU
AMD PhenomII X4 905e (2.5GHz 4コア)
メモリ
16GB
OS
Gentoo-1.12.14ベース Linux-3.0 UTF-8
コンパイラ
gcc-4.5.2
Cライブラリ
glibc-2.13
Perl
5.12.2
TCL
8.5.9
libxml
libxml2-sources-2.7.8
libxslt
libxslt-1.1.26
PAM
Linux-PAM-1.1.3
SSL
openssl-1.0.0d
OpenLDAP
2.4.23
PostgreSQL
9.1
インストール
ここでのインストール作業は 主に以下の流れを解説しています
- PostgreSQLソースパッケージのダウンロード
- ソースコードからのビルドと PostgreSQLバイナリファイル郡のインストール
- postgresql.conf環境設定 start/stop起動スクリプトの設定
- データベース領域の新規作成
- postmasterの起動
早速 PostgreSQLのダウンロードサイトからソースコードをダウンロードします
ここではソースコードからビルドしますが
パッケージ管理機構を持つシステム用にパッケージ提供もされています
$ tar -xjf postgresql-9.1.0.tar.bz2
$ cd postgresql-9.1.0
$ ls
COPYRIGHT HISTORY Makefile aclocal.m4 configure contrib src
GNUmakefile.in INSTALL README config configure.in doc
$ ./configure --prefix=/usr --datadir=/usr/share/pgsql --enable-nls --with-pam --with-libxml --with-libxslt --with-perl --with-tcl --with-ldap --with-openssl
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking which template to use... linux
checking whether to build with 64-bit integer date/time support... yes
checking whether NLS is wanted... yes
checking for default port number... 5432
checking for block size... 8kB
checking for segment size... 1GB
checking for WAL block size... 8kB
checking for WAL segment size... 16MB
checking for gcc... gcc
〜
config.status: linking src/backend/port/unix_latch.c to src/backend/port/pg_latch.c
config.status: linking src/backend/port/dynloader/linux.h to src/include/dynloader.h
config.status: linking src/include/port/linux.h to src/include/pg_config_os.h
config.status: linking src/makefiles/Makefile.linux to src/Makefile.port
$ make
make -C src all
make[1]: ディレクトリ `/home/admin/postgresql-9.1.0/src' に入ります
make -C port all
make[2]: ディレクトリ `/home/admin/postgresql-9.1.0/src/port' に入ります
gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv -I../../src/port -DFRONTEND -I../../src/include -D_GNU_SOURCE -I/usr/include/libxml2 -c -o strlcat.o strlcat.c
〜
$ su
# make install
〜
# make install-docs
〜
#
–datadir は設定ファイルの置き場所となります (データベース設置場所ではありません)
また事前に libxml2 libxsltなど関連ライブラリがインストールされている必要があります
さらに検証した PostgreSQL-9.1 ではドキュメント類のインストールに
make install-docs が必要でした
次に システム管理者権限の環境変数設定を行っておきます PGLIB PGDATA の2つです
下記の設定を /etc/profile 等に追記してシステムログイン時に反映されるようにします
PGLIB=/usr/lib
PGDATA=/var/db/pgsql
PGDATAにデータベース領域をディレクトリで指定します
今後 /var/db/pgsql/ にデータベースを作成しメインで使っていくため指定しています
最後に PostgreSQLを起動/停止するための start/stopスクリプトを作成します
スクリプトの書き方は ディストリビューションによるので下記の例は参考程度のものです
下記は Gentoo用 /etc/init.d/pgsql (root 0755)
#!/sbin/runscript
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header$
depend() {
need net.eth0
after apache
provide pgsql
}
start() {
ebegin "Starting PostgreSQL"
su adm -s /usr/bin/bash -c "/usr/bin/pg_ctl start -w -D /var/db/pgsql -s"
eend $?
}
stop() {
ebegin "Stopping MySQL"
su adm -s /usr/bin/bash -c "/usr/bin/pg_ctl stop -D /var/db/pgsql -s -m fast"
eend $?
}
restart() {
ebegin "Restarting MySQL"
su adm -s /usr/bin/bash -c "/usr/bin/pg_ctl restart -w -D /var/db/pgsql -s -m fast"
eend $?
}
status() {
su adm -s /usr/bin/bash -c "/usr/bin/pg_ctl status -D /var/db/pgsql"
exit $?
}
基本的に -D データベース領域 を指定して pg_ctl にコマンドを渡す形です
複数のデータベースディレクトリを運営する場合は その分 pg_ctlの行が増えるイメージです
(検証環境では /var/db/pgsql のみの運営とします)
stop や restart で指定している -m fast はシャットダウンモードの指定です
smart(クライアント利用終了待ち) fast(クライアント強制切断) immediate(強制終了)など
3通りモードがあります (詳しくは pg_ctl –helpで)
admアカウントをデータベース管理アカウントとして pg_ctlの各種処理を行っています
(MySQLも admアカウントで運営しているので今回流用しました
通常なら postgresアカウントを作って使うのが一般的です)
以上がインストールまでの一通りの作業です
データベースの運営
ここでは データベースの初期化 設定 IPv6接続確認 まで紹介します
まずは データベースの管理についてですが
PostgreSQLは postmaster 1プロセス毎に 1データベース領域(=ディレクトリ)を管理します
ディレクトリの中に データベース(複数) 各種ログ 設定ファイル が含まれます
ここでは先ほどの start/stopスクリプトで定義したとおり
admアカウントを管理アカウントとする /var/db/pgsql/ を初期化します
# mkdir /var/db/pgsql
# chown adm /var/db/pgsql
# su adm -s /usr/bin/bash -c "initdb $PGDATA"
データベースシステム内のファイルの所有者は"adm"ユーザでした。
このユーザがサーバプロセスを所有しなければなりません。
データベースクラスタはロケールja_JP.utf8で初期化されます。
デフォルトのデータベース符号化方式はUTF8に設定されました。
initdb: ロケール"ja_JP.utf8"用の適切なテキスト検索設定が見つかりません
デフォルトのテキスト検索設定はsimpleに設定されました。
ディレクトリ/var/db/pgsqlの権限を設定しています ... ok
サブディレクトリを作成しています ... ok
デフォルトのmax_connectionsを選択しています ... 100
デフォルトの shared_buffers を選択しています ... 24MB
設定ファイルを作成しています ... ok
〜
警告: ローカル接続向けに"trust"認証が有効です。
pg_hba.confを編集する、もしくは、次回initdbを実行する時に-Aオプショ
ンを使用することで変更することができます。
成功しました。以下を使用してデータベースサーバを起動することができます。
postmaster -D /var/db/pgsql
または
pg_ctl -D /var/db/pgsql -l logfile start
#
ここでは initdbコマンドを直接叩きましたが
pg_ctlからでも同様のことができるので pg_ctlに統一したほうが覚えやすいかもしれません
/var/db/pgsql/ 内が初期化されデータベース領域を利用する準備が整いました
# ls /var/db/pgsql/
PG_VERSION pg_hba.conf pg_serial pg_twophase postmaster.pid
base pg_ident.conf pg_stat_tmp pg_xlog
global pg_multixact pg_subtrans postgresql.conf
pg_clog pg_notify pg_tblspc postmaster.opts
#
ユーザ管理についてですが この時点では
データベース管理ユーザとして initdbを行ったアカウント adm が設定されています
次に設定ファイル postgresql.conf pg_hba.conf pg_ident.conf をカスタマイズします
まず postgresql.conf から設定します
以下は追記/編集した行のみの情報です
data_directory = '/var/db/pgsql'
hba_file = '/var/db/pgsql/pg_hba.conf'
ident_file = '/var/db/pgsql/pg_ident.conf'
listen_addresses = 'localhost,fe80::1***:****:****:***a%eth0'
data_directory はデータベース領域そのものを表します
hba_file は pg_hba.conf の置き場所を指定します
ident_file は pg_ident.conf の置き場所を指定しますが
ident認証方式を選択したときに利用されるだけで 今回の検証では ident認証方式は使いません
listen_address は 接続を行うインターフェースを指定するものです
デフォルトは 'localhost' となり外部ホストから接続を受け付けません
IPアドレスを指定することでそのIPで listen()するようになります
(ちなみに PostgreSQL7系まで使われていた tcpip_socket は廃止となっています)
今回 localhost も /etc/hosts では ::1 になっているので完全な IPv6仕様です
続いて認証に関する設定は pg_hba.conf 内で設定します
local all all trust
host all all 127.0.0.1/32 trust
host all all ::1/128 trust
host all gamer fe80::1***:****:****:***a/64 md5
上3行はローカルホストからの接続設定で 全データベースユーザを無条件に利用可能(trust)
最後1行が追加行で IPv6アドレスのみ許可 パスワード認証(md5)も実施する設定です
(IPv6のアドレスの箇所は伏字で標記しています)
IPv6部分はリンクローカルアドレスを使うことでグローバルからのパケットは届かない仕組みです
gamerというアカウントに制限しているので 後ほど gamerアカウントを作成することにします
pg_ident.conf は今回使いません
以上で データベース領域の初期化と設定が完了です 早速 postmaster を起動しましょう
# /etc/init.d/pgsql start
* Starting PostgreSQL ...
/usr/bin/postgres: /lib64/libz.so.1: no version information available (required by /usr/lib64/libxml2.so.2)
/usr/bin/postgres: /lib64/libz.so.1: no version information available (required by /usr/lib64/libxml2.so.2)
LOG: データベースシステムは 2011-09-19 22:52:24 UTC にシャットダウンしました
LOG: データベースシステムの接続受付準備が整いました。
LOG: 自動バキュームランチャプロセス [ ok ]
# netstat -an | grep 5432
tcp6 0 0 fe80::1***:***:**:5432 :::* LISTEN
tcp6 0 0 ::1:5432 :::* LISTEN
unix 2 [ ACC ] STREAM LISTENING 43186 /tmp/.s.PGSQL.5432
#
IPv6で接続が可能な状態となっています ローカルホストから UNIXドメインソケット接続も可能です
ポート番号も 5432 でデフォルトのままです
(複数の postmasterを運用する場合カスタマイズする必要あります)
データベース領域に データベースを1つ追加します games という名前で作成します
$ createdb -h localhost -U adm games
$
-h localhost は接続先データベースホストを指定します localhostならば省略可能です
-U adm は指定必要です データベース管理権限ユーザを指定します
追加ユーザも作っておきましょう
pg_hba.conf では gamer を外部接続用に定義しているので gamerユーザを作成します
$ createuser -U adm gamer
新しいロールをスーパーユーザにしますか? (y/n)n
新しいロールに対してデータベースを作成する権限を与えますか? (y/n)n
新しいロールに対して別のロールを作成する権限を与えますか? (y/n)n
$
-P オプションでパスワードを同時に設定することもできますが 次のように DDLで設定します
$ psql -U adm games
psql (9.1.0)
"help" でヘルプを表示します.
games=# alter user gamer encrypted password 'gamer';
ALTER ROLE
games=# \\q
$
データベースに接続するために psql コマンドを使いました
データベース接続後 サブシェルが開いて各種コマンドが発行できます
とりあえずローカルホスト上でデータベースに接続できることを確認し
gamerのパスワードを設定しました
では IPv6接続の検証を行います 別ホストの端末から psqlで接続します
$ psql -U gamer -h fe80::1***:****:****:***a%eth0 games
Password for user gamer:
Welcome to psql 8.3.0 (server 9.1.0), the PostgreSQL interactive terminal.
Type: \copyright for distribution terms
\h for help with SQL commands
\? for help with psql commands
\g or terminate with semicolon to execute query
\q to quit
WARNING: You are connected to a server with major version 9.1,
but your psql client is major version 8.3. Some backslash commands,
such as \d, might not work properly.
games=> \\q
$
psql に -h オプションで外部ホストを明示します Linuxでは %eth0 も必要でした
別ホスト側が PostgreSQL-8.3.0 を使っていたので警告が表示されていますが
IPv6での接続性は OKです
ただし 以降のデータベース操作検証は PostgreSQL-9.1.0側のサーバに戻って実施します
理由は別ホスト側の文字コードが EUC-JP サーバ側の UTF-8 と食い違っているため
文字化けするのです
テーブルの作成と動作検証
gamesデータベースまで作成したので
実際にレトロ系テレビゲームのデータを投入して 各種検索もデモします
サンプルデータ tvgames.zip(EUC-JP) をデータベース化します
$ eunzip tvgames.zip
Archive: tvgames.zip
inflating: tvgames.txt
$ head -n 10 tvgames.txt | iconv -f euc-jp
ドンキーコング,FC,任天堂,4500,1983-07-15
ドンキーコングJR.,FC,任天堂,4500,1983-07-15
ポパイ,FC,任天堂,4500,1983-07-15
五目ならべ [連珠],FC,任天堂,4500,1983-08-27
麻雀,FC,任天堂,4500,1983-08-27
マリオブラザーズ,FC,任天堂,4500,1983-09-09
ポパイの英語遊び,FC,任天堂,4500,1983-11-22
ベースボール,FC,任天堂,4500,1983-12-07
ドンキーコングJR. の算数遊び,FC,任天堂,4500,1983-12-12
テニス,FC,任天堂,4500,1984-01-14
$
ファミコンから プレイステーション1まで 全11429タイトルを納めているので
検証用のデータベース素材としてお手頃です
このデータを格納するテーブルを作成します
$ psql -U gamer games
psql (9.1.0)
"help" でヘルプを表示します.
games=> create table tvgames ( name text, plathome text, company text, price int, release_date date );
CREATE TABLE
games=> \\dt
リレーションの一覧
スキーマ | 名前 | 型 | 所有者
----------+---------+----------+--------
public | tvgames | テーブル | gamer
(1 行)
games=> \\d tvgames
テーブル "public.tvgames"
カラム | 型 | 修飾語
--------------+---------+--------
name | text |
plathome | text |
company | text |
price | integer |
release_date | date |
games=> \\q
$
\\dt と叩けば定義されているテーブルを一覧で確認できます
\\d テーブル名 でテーブルの定義も見れます
サンプル tvgames.txtを insert文に加工して SQL投入できるようにします
$ iconv -f euc-jp -t utf-8 tvgames.txt | sed "s/'/''/g" | sed "s/^\\(.*\\),\\(.*\\),\\(.*\\),\\(.*\\),\\(.*\\)$/insert into tvgames ( name, plathome, company, price, release_date ) values ( '\\1', '\\2', '\\3', \\4, '\\5' );/" | less -r > tvgame_insert.txt
$ head -n 10 tvgame_insert.txt
insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-07-15' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( 'JR.', 'FC', '任天堂', 4500, '1983-07-15' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-07-15' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( ' [連珠]', 'FC', '任天堂', 4500, '1983-08-27' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-08-27' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-09-09' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-11-22' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-12-07' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( 'JR. の算数遊び', 'FC', '任天堂', 4500, '1983-12-12' );
insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1984-01-14' );
$
PostgreSQLでは ' をエスケープするために '' と 2つ重ねて指定します
では作成した insert文を流し込みますが
psql に -f でテキストファイルを指定すれば テキストの内容を順番に実施してもらえます
$ psql -U gamer -f tvgame_insert.txt games
INSERT 0 1
〜
INSERT 0 1
$
tvgamesテーブルの完成です
実際に SQLの select構文を使って各種検索をためしてみます まずは10レコード分の表示です
$ PAGER=cat psql -U gamer games
psql (9.1.0)
"help" でヘルプを表示します.
games=> select * from tvgames limit 10;
name | plathome | company | price | release_date
------------------------------+----------+---------+-------+--------------
ドンキーコング | FC | 任天堂 | 4500 | 1983-07-15
ドンキーコングJR. | FC | 任天堂 | 4500 | 1983-07-15
ポパイ | FC | 任天堂 | 4500 | 1983-07-15
五目ならべ [連珠] | FC | 任天堂 | 4500 | 1983-08-27
麻雀 | FC | 任天堂 | 4500 | 1983-08-27
マリオブラザーズ | FC | 任天堂 | 4500 | 1983-09-09
ポパイの英語遊び | FC | 任天堂 | 4500 | 1983-11-22
ベースボール | FC | 任天堂 | 4500 | 1983-12-07
ドンキーコングJR. の算数遊び | FC | 任天堂 | 4500 | 1983-12-12
テニス | FC | 任天堂 | 4500 | 1984-01-14
(10 行)
games=>
1983年はファミコンが発売されてから爆発的にヒットする直前です
psqlは PAGER環境変数に設定されたプログラムで selectの結果を表示します
デフォルトの less が一番使い勝手がよいですが ページ送りが不要な場合など cat を指定します
次に 1995年4月1日〜5月1日 の間に発売されたソフトの一覧を表示します between構文を使います
games=> select * from tvgames where release_date between '1995-4-1' and '1995-5-1';
name | plathome | company | price | release_date
-------------------------------------------------------------+--------------------+------------------------------------------+-------+--------------
EMIT Vol.2〜命がけの旅〜 | SS | 光栄 | 8800 | 1995-04-01
EMIT Vol.3〜私にさよならを〜 | SS | 光栄 | 8800 | 1995-04-01
デイトナUSA | SS | セガ | 6800 | 1995-04-01
レディーストーカー〜過去からの挑戦〜 | SFC | タイトー | 9980 | 1995-04-01
Dの食卓 | 3DO | 三栄書房 | 8800 | 1995-04-01
蒼き伝説シュート! | GB | バンプレスト | 3980 | 1995-04-07
THE クイズ ギアファイト! | GG | セガ | 3800 | 1995-04-07
クイズ キング・オブ・ファイターズ | NG(CD) | ザウルス | 5800 | 1995-04-07
得点王3 | NG | SNK | 29800 | 1995-04-07
フォーメーションサッカー95 della セリエA | PCE(SCDR2)(AC対応) | ヒューマン | 9800 | 1995-04-07
全日本プロレス2 3・4武闘館 | SFC | 日本コンピュータシステム | 10800 | 1995-04-07
ドラえもん 友情伝説 | 3DO | 小学館 | 7800 | 1995-04-07
SD飛龍の拳外伝 | GB | カルチャーブレーン | 4700 | 1995-04-14
勝馬予想 競馬貴族EX'95 | GB | キングレコード | 6900 | 1995-04-14
ワールドヒーローズ2 | NG(CD) | ADK | 5800 | 1995-04-14
パチ夫くん パチンコランド大冒険 | PS | ココナッツジャパン | 6800 | 1995-04-14
柿木将棋 | SS | アスキー | 7800 | 1995-04-14
ぱずるんでス! | SFC | 日本物産 | 8980 | 1995-04-14
RES ARCANA | SFC | ココナッツジャパン | 9500 | 1995-04-14
EMIT Vol.1 時の迷子 | 3DO | 光栄 | 8800 | 1995-04-14
デビルズコース | 3DO | 松下電器 | 8800 | 1995-04-14
パドックノート’95 | 3DO | フジテレビジョン | 8800 | 1995-04-14
MYST | 3DO | マイクロキャビン | 7800 | 1995-04-14
Jリーグ ライブ'95 | GB | エレクトロニック・アーツ・ビクター | 5980 | 1995-04-21
カオティクス | 32X | SEGA | 7800 | 1995-04-21
餓狼伝説3 ROAD TO THE FINALVICTORY | NG | SNK | 32000 | 1995-04-21
ギャラクシーファイト UNIVERSAL WARRIORS | NG(CD) | サンソフト | 7800 | 1995-04-21
サイバーリップ | NG(CD) | SNK | 5800 | 1995-04-21
ファイヤースープレックス | NG(CD) | SNK | 5800 | 1995-04-21
ベースボールスターズプロフェッショナル | NG(CD) | SNK | 4800 | 1995-04-21
ロボアーミー | NG(CD) | SNK | 5800 | 1995-04-21
金沢将棋'95 | PS | セタ | 7900 | 1995-04-21
ママレード・ボーイ | SFC | バンダイ | 9800 | 1995-04-21
魔法陣グルグル | SFC | エニックス | 10800 | 1995-04-21
タクティカルサッカー | SFC | エレクトロニックアーツビクター | 9800 | 1995-04-21
なつきクライシスバトル | SFC | エンジェル | 10800 | 1995-04-21
真・聖刻 | SFC | ユタカ | 9800 | 1995-04-21
真SD戦国伝 大将軍列伝 | SFC | ベック | 9800 | 1995-04-21
スーパーリアル麻雀P5 パラダイス オールスター4人打ち | SFC | セタ | 9800 | 1995-04-21
リジョイス〜アレサ王国の彼方〜 | SFC | やのまん | 9900 | 1995-04-21
宮路社長のパチンコファン勝利宣言2 | SFC | POW | 9800 | 1995-04-21
スーパートランプコレクション | SFC | ボトムアップ | 8900 | 1995-04-21
紺碧の艦隊 | 3DO | 徳間書店 | 8800 | 1995-04-21
ぼのぐらし | 3DO | アミューズ/バンダイビジュアル | 8800 | 1995-04-21
ポリスノーツ パイロットディスク | 3DO | コナミ | 2980 | 1995-04-21
パズルボブル | NG(CD) | タイトー | 6800 | 1995-04-27
赤ずきんチャチャ | GB | トミー | 3900 | 1995-04-28
空想科学少年ガリバーボーイ 空想科学パズル プリッとポン | GB | バンダイ | 3980 | 1995-04-28
チキチキ天国 | GB | J・ウイング | 3900 | 1995-04-28
パチ夫くん3 | GB | ココナッツジャパン | 4800 | 1995-04-28
魔法陣グルグル 勇者とククリの大冒険 | GB | タカラ | 3980 | 1995-04-28
TEMPO Jr. | GG | セガ | 3800 | 1995-04-28
テイルスのスカイパトロール | GG | セガ | 3800 | 1995-04-28
テレビアニメスラムダンク 強豪真っ向対決! | MD | バンダイ | 8800 | 1995-04-28
トゥルーライズ | MD | アクレイムジャパン | 7800 | 1995-04-28
餓狼伝説3 ROAD TO THE FINALVICTORY | NG(CD) | SNK | 8800 | 1995-04-28
スロット勝負師 | PCE(SCDR2) | 日本物産 | 8500 | 1995-04-28
ガンナーズ ヘブン | PS | ソニー・コンピュータエンタテインメント | 5800 | 1995-04-28
ぐっすんおよよ | PS | エクシング | 6800 | 1995-04-28
ジャンピングフラッシュ!アロハ男爵ファンキー大作戦の巻 | PS | ソニー・コンピュータエンタテインメント | 5800 | 1995-04-28
ミスランド まちがい探しゲーム | PS | アルトロン | 5800 | 1995-04-28
ヴァーチャル ハイドライド | SS | セガ | 5800 | 1995-04-28
アイルトン・セナ パーソナルトーク〜Message for the future〜 | SS | セガ | 8800 | 1995-04-28
輝水晶伝説アスタル | SS | セガ | 5800 | 1995-04-28
三國志4 | SS | 光栄 | 14800 | 1995-04-28
スーパーボンバーマン3 | SFC | ハドソン | 8900 | 1995-04-28
スーパーパチンコ大戦 | SFC | バンプレスト | 6900 | 1995-04-28
牌勢麻雀 凌駕 | SFC | アスキー | 12800 | 1995-04-28
プラネットチャンプ TG3000 | SFC | ケムコ | 9500 | 1995-04-28
Jリーグエキサイトステージ'95 | SFC | エポック社 | 9800 | 1995-04-28
川のぬし釣り2 | SFC | パックインビデオ | 10800 | 1995-04-28
シミュレーションプロ野球 | SFC | ヘクト | 12800 | 1995-04-28
トゥルーライズ | SFC | アクレイムジャパン | 10900 | 1995-04-28
3次元格闘ボールズ | SFC | メディアリング | 9800 | 1995-04-28
タロットミステリー | SFC | ヴィジット | 9800 | 1995-04-28
初段位認定 初段プロ麻雀 | SFC | ギャップス | 9800 | 1995-04-28
バーチャルカメラマンPart3 | 3DO | ナグザット | 8800 | 1995-04-28
ワールドカップ スーパースタジアム | 3DO | テレビ東京/ギャガ・コミュニケーションズ | 6800 | 1995-04-28
(78 行)
games=>
NeoGeoのロムの値段の高さにびっくりしますが スーパーファミコンも1万円越えなど結構な値段です
次に group by 構文を使った機種別ソフト本数の集計です
games=> select plathome, count( name ) from tvgames group by plathome;
plathome | count
-----------------------+-------
GG | 196
SFC | 1391
PCE(SG) | 4
MCD | 110
PCE(SCDR2) | 235
NG(CD) | 99
FCD | 195
NG | 117
PCE(CDR2) | 92
32X | 18
GBC | 142
PS | 4439
SFC(NP) | 33
ARCADE CARD専用 | 12
N64 | 200
FC周辺ソフト | 9
SS | 1212
VB | 19
GB&GBC | 201
GB | 767
64DD | 7
※バーコードボーイ同梱 | 1
3DO | 215
FC | 1042
PCE(SCDR2)(AC対応) | 16
PCE | 229
MD | 416
PCE(CDR2)(S対応) | 12
(28 行)
games=>
最後に 複雑なクエリを実行して PostgreSQLのパフォーマンスを確認します
名称の先頭部分が一致することを条件にして 5作以上シリーズ化されているゲームを抜き出そうとしてます
例えば「ドラゴンクエスト」をベース名として「ドラゴンクエスト2」「ドラゴンクエスト3」…
を抜き出そうとしています
games=> select gbase.name, gelement.name, gelement.release_date, gelement.plathome, gelement.price from ( select distinct name from tvgames ) as gbase, tvgames gelement where octet_length( gbase.name ) > 3 and left( gelement.name, char_length( gbase.name ) ) = gbase.name and ( select count( name ) from tvgames gsub where gbase.name != gsub.name and left( gsub.name, char_length( gbase.name ) ) = gbase.name ) >= 4 order by gbase.name, gelement.release_date;
〜
悠久幻想曲 | 悠久幻想曲 Ensemble Vol.1 | 1998-12-10 | PS | 3800
悠久幻想曲 | 悠久幻想曲Ensemble Vol.2 | 1999-02-18 | PS | 3800
悠久幻想曲 | 悠久幻想曲 ensemble vol.2 | 1999-03-04 | SS | 3800
悠久幻想曲 | 悠久幻想曲 保存版 PerpetualCollection | 1999-10-14 | PS | 8800
悠久幻想曲 | 悠久幻想曲3 パーペチュアルブルー | 1999-12-22 | PS | 5800
遊戯王デュエルモンスターズ | 遊戯王デュエルモンスターズ | 1998-12-17 | GB | 4300
遊戯王デュエルモンスターズ | 遊戯王デュエルモンスターズ2 闇界決闘記 | 1999-07-08 | GB&GBC | 4500
遊戯王デュエルモンスターズ | 遊戯王デュエルモンスターズ3 三聖戦神降臨 | 2000-07-13 | GBC | 4500
遊戯王デュエルモンスターズ | 遊戯王デュエルモンスターズ4 最強決闘者戦記 海馬デッキ | 2000-12-07 | GBC | 4800
遊戯王デュエルモンスターズ | 遊戯王デュエルモンスターズ4 最強決闘者戦記 城之内デッキ | 2000-12-07 | GBC | 4800
遊戯王デュエルモンスターズ | 遊戯王デュエルモンスターズ4 最強決闘者戦記 遊戯デッキ | 2000-12-07 | GBC | 4800
(1749 行)
games=> \\q
$
1万レコードのテーブルを 2つ組み合わせて検索する高負荷な処理ですが
検証環境では実行時間は 61秒でした
驚くことに MySQLで同様の検索をしたときは 2分20秒だったのに比べ半分以下の時間となってます
PostgreSQLの最適化能力の高さが感じとれます
紹介は以上です PostgreSQLは機能としても高機能で
商用データベースである Oracleに決して見劣りしていないのではないでしょうか
IPv6サーバツールへ戻る
Postfixのインストール
Postfix 構築ログ
Postfix が 64bit + IPv6 環境で動作するかの検証です
検証環境
CPU
PhenomII X4 905e (2.5GHz 4コア)
マザーボード
GA-880GM-USB3
メモリ
16GB (DDR3-1066)
イーサネット
Realtek8111D (R8168 GbE)
Linuxカーネルバージョン
3.0 (x86_64)
GCC
4.5.2
glibc
2.13.1
BerkeleyDB
db-5.1.25.NC
LDAP
OpenLDAP-2.4.23
Postfix
2.9.2
SASL
Cyrus-SASL-2.1.25
インストール
まず前準備として 必要なアカウントを作成します
通常は postfix:postfix アカウント と postdrop グループを作成しますが
検証環境は Gentoo Stage3 ベースのシステムで既に mailアカウントが存在するのでこれを流用し
mail:mail アカウントは流用 maildrop グループを新設します
$ su
# groupadd -g 13 maildrop
# exit
$
13は GID(グループID)ですシステムで未割り当ての値を選定してください
グループの一覧は /etc/group で管理されています
では Postfix本体のインストールに入ります
ここから最新安定版のソースを取得して下記のようにインストールします
$ tar -xzf postfix-2.9.2.tar.gz
$ cd postfix-2.9.2
$ make makefiles AUXLIBS='-lnsl'
make -f Makefile.in MAKELEVEL= Makefiles
(echo "# Do not edit -- this file documents how Postfix was built for your machine."; /bin/sh makedefs) >makedefs.tmp
〜
[src/tlsproxy]
cat ../../conf/makedefs.out Makefile.in >Makefile
rm -f Makefile; (cat conf/makedefs.out Makefile.in) >Makefile
$
検証環境では AUXLIBSに -lnsl と -lresolv の記載が必要でした
make時に必要なライブラリがリンクされず 未解決シンボルエラーが出たためです
gcc -Wmissing-prototypes -Wformat -DHAS_PCRE -g -O -I. -I../../include -DLINUX3 -o sendmail sendmail.o ../../lib/libglobal.a ../../lib/libutil.a -L/usr/lib64 -lpcre -ldb
../../lib/libutil.a(dict_nis.o): In function `dict_nis_lookup':
/home/admin/postfix-2.9.2/src/util/dict_nis.c:173: undefined reference to `yp_match'
/home/admin/postfix-2.9.2/src/util/dict_nis.c:187: undefined reference to `yp_match'
../../lib/libutil.a(dict_nis.o): In function `dict_nis_init':
/home/admin/postfix-2.9.2/src/util/dict_nis.c:81: undefined reference to `yp_get_default_domain'
collect2: ld はステータス 1 で終了しました
make: *** [sendmail] エラー 1
make: *** [update] エラー 1
環境によっては さらに -lresolv も必要かもしれません
コンパイルエラーが出た場合試してみてください
ビルドを続けます
$ make
set -e; for i in src/util src/global src/dns src/tls src/xsasl src/milter src/master src/postfix src/fsstone src/smtpstone src/sendmail src/error src/pickup src/cleanup src/smtpd src/local src/trivial-rewrite src/qmgr src/oqmgr src/smtp src/bounce src/pipe src/showq src/postalias src/postcat src/postconf src/postdrop src/postkick src/postlock src/postlog src/postmap src/postqueue src/postsuper src/qmqpd src/spawn src/flush src/verify src/virtual src/proxymap src/anvil src/scache src/discard src/tlsmgr src/postmulti src/postscreen src/dnsblog src/tlsproxy; do
〜
gcc -Wmissing-prototypes -Wformat -DHAS_PCRE -g -O -I. -I../../include -DLINUX3 -o tlsproxy tlsproxy.o tlsproxy_state.o ../../lib/libtls.a ../../lib/libmaster.a ../../lib/libglobal.a ../../lib/libutil.a -L/usr/lib64 -lpcre -ldb -lnsl -lresolv
cp tlsproxy ../../libexec
$
ビルドは完了です 各種インストール条件は make install 時に対話式で設定できます
main.cf などの設定を上書きしない(バージョンアップのみの)場合は make upgrade と打ちます
$ su
# make install
〜
Warning: if you use this script to install Postfix locally,
this script will replace existing sendmail or Postfix programs.
Make backups if you want to be able to recover.
Before installing files, this script prompts you for some definitions.
Most definitions will be remembered, so you have to specify them
only once. All definitions should have a reasonable default value.
Please specify the prefix for installed file names. Specify this ONLY
if you are building ready-to-install packages for distribution to OTHER
machines. See PACKAGE_README for instructions.
install_root: [/] (何も入力せずEnter)
Please specify a directory for scratch files while installing Postfix. You
must have write permission in this directory.
tempdir: [/home/admin/postfix-2.9.2] (何も入力せずEnter)
Please specify the final destination directory for installed Postfix
configuration files.
config_directory: [/etc/postfix] (何も入力せずEnter)
Please specify the final destination directory for installed Postfix
administrative commands. This directory should be in the command search
path of adminstrative users.
command_directory: [/usr/sbin] (何も入力せずEnter)
Please specify the final destination directory for installed Postfix
daemon programs. This directory should not be in the command search path
of any users.
daemon_directory: [/usr/libexec/postfix] (何も入力せずEnter)
Please specify the final destination directory for Postfix-writable
data files such as caches or random numbers. This directory should not
be shared with non-Postfix software.
data_directory: [/var/lib/postfix] /var/db/postfix
Please specify the destination directory for the Postfix HTML
files. Specify "no" if you do not want to install these files.
html_directory: [no] (何も入力せずEnter)
Please specify the owner of the Postfix queue. Specify an account with
numerical user ID and group ID values that are not used by any other
accounts on the system.
mail_owner: [postfix] mail
Please specify the final destination pathname for the installed Postfix
mailq command. This is the Sendmail-compatible mail queue listing command.
mailq_path: [/usr/bin/mailq] (何も入力せずEnter)
Please specify the destination directory for the Postfix on-line manual
pages. You can no longer specify "no" here.
manpage_directory: [/usr/local/man] /usr/share/man
Please specify the final destination pathname for the installed Postfix
newaliases command. This is the Sendmail-compatible command to build
alias databases for the Postfix local delivery agent.
newaliases_path: [/usr/bin/newaliases] (何も入力せずEnter)
Please specify the final destination directory for Postfix queues.
queue_directory: [/var/spool/postfix] (何も入力せずEnter)
Please specify the destination directory for the Postfix README
files. Specify "no" if you do not want to install these files.
readme_directory: [no] (何も入力せずEnter)
Please specify the final destination pathname for the installed Postfix
sendmail command. This is the Sendmail-compatible mail posting interface.
sendmail_path: [/usr/sbin/sendmail] (何も入力せずEnter)
Please specify the group for mail submission and for queue management
commands. Specify a group name with a numerical group ID that is
not shared with other accounts, not even with the Postfix mail_owner
account. You can no longer specify "no" here.
setgid_group: [postdrop] maildrop
Updating /ram/libexec/postfix/anvil...
Updating /ram/libexec/postfix/bounce...
Updating /ram/libexec/postfix/cleanup...
Updating /ram/libexec/postfix/discard...
Updating /ram/libexec/postfix/dnsblog...
〜
Updating /ram/share/man/man8/trace.8...
Updating /ram/share/man/man8/trivial-rewrite.8...
Updating /ram/share/man/man8/verify.8...
Updating /ram/share/man/man8/virtual.8...
Warning: you still need to edit myorigin/mydestination/mynetworks
parameter settings in /etc/postfix/main.cf.
See also http://www.postfix.org/STANDARD_CONFIGURATION_README.html
for information about dialup sites or about sites inside a firewalled
network.
BTW: Check your /etc/aliases file and be sure to set up aliases
that send mail for root and postmaster to a real person, then run
/usr/bin/newaliases.
#
各質問に対して ターゲットシステムの環境に応じて パラメータを設定していきます
何も入力せずに Enter を押すと大括弧で括られたデフォルト値が選択されます
質問が終わったらファイルがコピーされて 更新ファイルも画面上で分かるようになっています
syslogへの設定も行います 検証環境では syslog-ngを利用しているので
syslog-ng.conf に下記の設定を追加します
destination mail { file("/var/log/mail.log"); };
destination mailinfo { file("/var/log/mail.info"); };
destination mailwarn { file("/var/log/mail.warn"); };
destination mailerr { file("/var/log/mail.err"); };
filter f_mail { facility(mail); };
log { source(src); filter(f_mail); destination(mail); };
log { source(src); filter(f_mail); filter(f_info); destination(mailinfo); };
log { source(src); filter(f_mail); filter(f_warn); destination(mailwarn); };
log { source(src); filter(f_mail); filter(f_err); destination(mailerr); };
最後に Linuxシステムで Postfixを制御するための start/stopスクリプトを手動で作成します
(通常 Linuxディストリビューションのパッケージインストールすれば 自動作成されているはず)
検証環境は Gentooベースのシステムのため /etc/init.d/postfix を以下の内容で作成しました
(スクリプトへの実行権限の付与を忘れずに)
#!/sbin/runscript
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header$
depend() {
need net.eth0
}
start() {
ebegin "Starting Postfix"
/usr/sbin/postfix start
eend $?
}
stop() {
ebegin "Stopping Postfix"
/usr/sbin/postfix stop
eend $?
}
以上のインストール過程は IPv4 IPv6 32bit 64bit いずれの環境でも同じ手順でした
ただし 後半になりますが SMTP AUTH化 TLS化 するためにオプションを追加再ビルドします
設定
Postfixサーバの動作設定を行います 主に /etc/postfix/main.cf が設定対象です
ここで IPv6に関する設定も行います 下記は修正箇所とその説明です
inet_protocols = ipv6
inet_interfaces = loopback-only
ネットワーク設定です 検証環境のため IPv6のみを扱うという強気な設定です
通常は inet_protocols = all と IPv4 IPv6 両方喋るようにします
inet_interfacesは メール配送要求を受け付けるインターフェースを指定します
まずはローカルからのみ配送を受けるため loopback-only を指定しています
(loopback-only は IPv6へも対応しています)
myhostname = phenom.mydomain
mydomain = mydomain
myorigin = $mydomain
append_at_myorigin = yes
append_dot_mydomain = no
メールサーバの名称と ローカルドメインの設定です
検証環境では mydomain というローカルなドメイン名を設定しています
たとえ自分が 独自ドメインを取得していようともとりあえずローカルなドメイン名を設定します
(独自ドメインは masquerade_domains で設定できるため)
myoriginは ローカル配送するメールについて送信元のドメイン部分に付与される名称です
今回 $mydomain としているためここでの例では アカウント@mydomain というアドレスになります
デフォルトの $myhostname を指定すると アカウント@phenom.mydomain アドレスになります
append_at_myorigin と append_dot_mydomain はメールアドレス操作(修正)機能です
append_at_myorigin は ドメイン部分のない宛先に $myorigin を追加します
(例えば admin 宛のメールは admin@mydomain 宛のメールに宛先修正されます 通常これは必須)
append_dot_mydomain は ドメイン部分がホスト名のみの場合 $mydomain を追加します
(例えば admin@phenom 宛のメールは admin@phenom.mydomain 宛のメールに宛先修正されます)
mydestination = $myhostname, localhost.$mydomain, localhost
ローカル配送対象となる 宛先ドメインの設定です
宛先ドメインが 指定ドメインのいずれかであればローカル配送が行われます
Postfixでは $myhostnameは必須で あとは localhost(::1)を追加しています
relayhost =
relay_domains =
リレー(メール転送)の設定ですが
ローカル配送のみとし転送自体を禁止するため relay_domains を空としています
外部へのメールやりとりが必要になったら設定します
home_mailbox = Maildir/
#mail_spool_directory = /var/spool/mail
ローカル配送時のメールボックスのフォーマット指定です
上記のように / を最後に使うと Maildir方式(1メール1ファイル)となります
この場合 ~/Maildir/ 配下に保存されることになります
mail_spool_directory は指定しません
これを指定すると メールスプール方式という最古の方式となり
/var/spool/mail/ にアカウント毎のメールファイル(1ファイル中に複数メールが含まれる)が作られます
メールのローカル配送方式が 3種類あるので紹介しておきます
メールローカル配送方式
メールスプール方式
インターネット黎明期のメール配送方式
/var/mail/ユーザ名/ に単一のメールスプールファイルを置いて
配送されてきたメールはそのファイルに追記
mbox形式
ホームディレクトリ ~/ にメールスプールファイルを置く
Sendmailで主に使われていた
Maildir形式
ホームディレクトリに Maildir/ などの専用ディレクトリを置いて
1メール=1ファイル で格納する最近の方式
スプールほどファイルを占有する必要がなく複数の MTA MUA(IMAPなど) と共用させやすい
専用のメールサーバを立てる場合 iノードの枯渇に注意する必要がある
alias_maps = hash:/etc/postfix/aliases
alias_database = $alias_maps
最後にエイリアスの設定です
エイリアスとはメール転送機能で 特定の宛先のローカル配送に対して 別の宛先に転送します
ここもカスタマイズしています
通常は /etc/aliases を設定するケースが多いのですが postfixディレクトリを指定しています
これにより newaliasesコマンドにより /etc/postfix/aliases.db が作成されます
aliases の作成については後述します
ひとまず main.cf の修正を終えたので内容をチェックします
# postconf -n
alias_database = $alias_maps
alias_maps = hash:/etc/postfix/aliases
append_at_myorigin = yes
append_dot_mydomain = no
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/db/postfix
debug_peer_level = 2
home_mailbox = Maildir/
html_directory = no
inet_interfaces = loopback-only
inet_protocols = ipv6
mail_owner = mail
mailq_path = /usr/bin/mailq
manpage_directory = /usr/share/man
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mydomain = mydomain
myhostname = phenom.mydomain
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases
queue_directory = /var/spool/postfix
readme_directory = no
relay_domains =
relayhost =
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
setgid_group = maildrop
unknown_local_recipient_reject_code = 550
# postfix check
#
設定ファイルの誤りがあれば postfix check 時にメッセージが表示されます
設定に問題がなければ Postfixを起動します
# /etc/init.d/postfix start
* Caching service dependencies ... [ ok ]
* Starting Postfix ...
postfix/postfix-script: starting the Postfix mail system [ ok ]
#
起動していれば netstat -a コマンドで TCP/SMTPのポートが開いていることが確認できます
$ netstat -a | grep smtp
tcp6 0 0 localhost:smtp [::]:* LISTEN
unix 2 [ ACC ] STREAM LISTENING 494568 private/smtp
$
/etc/postfix/alaises への転送設定も追加しておきましょう
root: admin
root宛へのメールを (普段ログインする)admin宛へ転送するための設定を追加しました
下記コマンドで aliases.db へ反映します
$ su
# newaliases
# ls -l /etc/postfix/aliases*
-rw-r--r-- 1 root root 8841 8月 28 17:38 /etc/postfix/aliases
-rw-r--r-- 1 root root 12288 9月 4 09:22 /etc/postfix/aliases.db
#
では ローカル配送の試験を行ってみます telnet コマンドで SMTPプロトコルを直接流し込みます
$ telnet -6 localhost 25
Trying ::1...
Connected to localhost.
Escape character is '^]'.
220 phenom.mydomain ESMTP Postfix
EHLO mydomain
250-phenom.mydomain
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM: root@mydomain
250 2.1.0 Ok
RCPT TO: admin@mydomain
250 2.1.5 Ok
DATA
354 End data with .
test mail
.
250 2.0.0 Ok: queued as 0250E24060
QUIT
221 2.0.0 Bye
Connection closed by foreign host.
$ su
# tail -f /var/log/mail.log
〜
Apr 28 13:45:33 phenom postfix/smtpd[3986]: connect from localhost[::1]
Apr 28 13:49:25 phenom postfix/smtpd[3986]: 0250E24060: client=localhost[::1]
Apr 28 13:49:45 phenom postfix/cleanup[4023]: 0250E24060: message-id=<20120428134925.0250E24060@phenom.mydomain>
Apr 28 13:49:45 phenom postfix/qmgr[3924]: 0250E24060: from=, size=286, nrcpt=1 (queue active)
Apr 28 13:49:45 phenom postfix/local[4025]: 0250E24060: to=, relay=local, delay=38, delays=38/0/0/0.01, dsn=2.0.0, status=sent (delivered to maildir)
Apr 28 13:49:45 phenom postfix/qmgr[3924]: 0250E24060: removed
Apr 28 13:50:45 phenom postfix/smtpd[3986]: disconnect from localhost[::1]
#
SMTPは TCP/25ポートを使います
MAIL FROM: や RCPT TO: で送信元や宛先を指定し
DATA で本文を記載します 本文の終了として . ピリオドのみの行を入力します
telnet後は mail.logでも 正常にローカル配送されたことが記録されています
メールも確かに adminアカウント宛に配送されていました
Return-Path:
X-Original-To: admin@mydomain
Delivered-To: admin@mydomain
Received: from mydomain (localhost [IPv6:::1])
by phenom.mydomain (Postfix) with ESMTP id 0250E24060
for ; Sat, 28 Apr 2012 13:49:07 +0000 (UTC)
Message-Id: <20120428134925.0250E24060@phenom.mydomain>
Date: Sat, 28 Apr 2012 13:49:07 +0000 (UTC)
From: root@mydomain
test mail
(書きかけ)
LAN内からの SMTP送信を受け付ける
IPv6による SMTP接続が動作することまで確認しました
次は localhost以外の 自宅LANからの接続を許可するように設定します
main.cf の設定変更箇所は下記の通りです
inet_interfaces = all
loopback-only から all に変更するだけです
Postfixを再起動してテストします Sylpheedメーラを別ホストから試します
# /etc/init.d/postfix restart
* Stopping Postfix ...
postfix/postfix-script: stopping the Postfix mail system [ ok ]
* Starting Postfix ...
postfix/postfix-script: starting the Postfix mail system [ ok ]
# netstat -a | grep smtp
tcp6 0 0 [::]:smtp [::]:* LISTEN
unix 2 [ ACC ] STREAM LISTENING 498865 private/smtp
#
Sylpheedの設定画面を開いたところです
SMTPはデフォルトの 25番のままです SSLも設定しません
普通にメールを記述して 送信すると
Return-Path:
X-Original-To: admin@mydomain
Delivered-To: admin@mydomain
Received: from turion.mydomain (turion.mydomain [IPv6:fe80::2***:****:***2])
by phenom.mydomain (Postfix) with ESMTP id 90A7824061
for ; Sat, 28 Apr 2012 14:23:17 +0000 (UTC)
Date: Sun, 22 Apr 2012 01:42:58 +0900
From: テスト
To: admin@mydomain
Subject: テストメール
Message-Id: <20120422014258.c87c82dd.admin@******.com>
X-Mailer: Sylpheed 3.1.3 (GTK+ 2.19.0; i686-pc-linux-gnu)
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-2022-JP
Content-Transfer-Encoding: 7bit
テストです
正常に送信できています
SMTP AUTHに対応する
次の段階として SMTP AUTH を導入します
SMTP AUTHにより SMTP接続時に アカウント/パスワードでの認証が必須となり
未認証の SMTP接続はメールが送信できません
これにより メールサーバが不正中継の土台となってしまう事態を防ぎます
将来メールサーバをインターネットに接続する際に必須といえる仕組みです
認証基盤(アカウント パスワードの管理)として
SASL(Simple Authentication Security Layer) が使えます
ここでは Cyrus-SASL のインストール手順にあわせて BerkeleyDB5対応も行います
$ tar -xzf cyrus-sasl-2.1.25.tar.gz
$ cd cyrus-sasl-2.1.25
$
configureを始める前に BerkeleyDB5対応のための変更を行います
configureスクリプトの内容を書き換えて libdb-5.1.so をリンクするようにします
7233
7234 saved_LIBS=$LIBS
7235 for dbname in ${with_bdb} db-5.1 db-4.7 db4.7 db47 db-4.6 db4.6 db46 db-4.5 db4.5 db45 db-4.4 db4.4 db44 db-4.3 db4.3 db43 db-4.2 db4.2 db42 db-4.1 db4.1 db41 db-4.0 db4.0 db-4 db40 db4 db-3.3 db3.3 db33 db-3.2 db3.2 db32 db-3.1 db3.1 db31 db-3 db30 db3 db
7236 do
7237 LIBS="$saved_LIBS -l$dbname"
7238 cat >conftest.$ac_ext <<_ACEOF
7235行目で dbのバージョン候補を指定して検索しているので
候補の最初に db-5.1 を追加します これで libdb-5.1.so を掴んでくれます
BerkeleyDBの関数に正しい引数を渡す必要があります
sasldb/db_berkeley.c も編集が必要です 変更箇所は 104行目です
104 #if DB_VERSION_MAJOR >= 5 || DB_VERSION_MINOR >= 1
105 ret = (*mbdb)->open(*mbdb, NULL, path, NULL, DB_HASH, flags, 0660);
106 #else
107 ret = (*mbdb)->open(*mbdb, path, NULL, DB_HASH, flags, 0660);
108 #endif
utils/dbconverter-2.c も編集します 217行目を同様に変更します
217 #if DB_VERSION_MAJOR >= 5 || DB_VERSION_MINOR >= 1
218 ret = (*mbdb)->open(*mbdb, NULL, path, NULL, DB_HASH, DB_CREATE, 0664 );
219 #else
220 ret = (*mbdb)->open(*mbdb, path, NULL, DB_HASH, DB_CREATE, 0664);
221 #endif
$ ./configure --prefix=/usr --enable-static=yes --enable-java --enable-ntlm --enable-login --enable-ldapdb --with-ldap=/usr --enable-sql
configure: creating cache ./config.cache
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
〜
config.status: creating saslauthd.h
config.status: executing depfiles commands
Configuration Complete. Type 'make' to build.
$ make
make all-recursive
make[1]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25' に入ります
Making all in include
〜
make[2]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25' に入ります
make[2]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25' から出ます
make[1]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25' から出ます
$ su
# make install
Making install in include
make[1]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25/include' に入ります
make[2]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25/include' に入ります
〜
make[2]: `install-data-am' に対して行うべき事はありません.
make[2]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25' から出ます
make[1]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25' から出ます
#
saslauthd sasldblistusers2 saslpasswd2 といったコマンドが使えるようになります
Cyrus-SASLが入ったら Postfixの方も対応するために再ビルドが必要です
再度ビルドディレクトリで 下記のように実施してください
$ make clean
〜
$ make makefiles CCARGS='-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -DUSE_TLS -I/usr/include/sasl' AUXLIBS='-lsasl2 -lssl -lnsl'
〜
$ make
〜
$ su
# make upgrade
〜
#
Cyrus-SASLを利用するためのオプションと TLSを利用するためのオプションも追加しています
Cyrus-SASLの設定に話を戻します
ここでは sasldb形式の認証データベースと LDAP形式の認証データベースを両方試します
まず sasldb形式から 下記コマンドでデータベースを作れます
# saslpasswd2 -c -u testtest.com mailtest
Password: パスワードを入力
Again (for verification): 同じパスワード
# chown mail /etc/sasldb2
# ls -l /etc/sasldb2
-rw-r----- 1 mail root 12288 4月 29 01:12 /etc/sasldb2
#
/etc/sasldb2 ができます これは BerkeleyDB形式のデータベースです
また Postfix smtpd から読み書きできるよう mailオーナーに変更しています
-u オプションでドメインを指定しています
# sasldblistusers2
mailtest@testtest.com: cmusaslsecretOTP
mailtest@testtest.com: userPassword
#
sasldblistusers2 で登録済アカウントを確認できます
sasldb形式を Postfixで扱えるよう /usr/lib/sasl2/smtpd.conf を作成します
pwcheck_method: auxprop
auxprop_method: sasldb
mech_list: cram-md5 digest-md5 plain login
Postfix側 main.cf には下記のように設定を追加します
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = testtest.com
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_local_domain には saslpasswd2の時と同じドメインを指定します
設定後 Postfixをリスタートしましょう
Sylpheed側は メール送信の設定を変更する必要があります
SMTP AUTHを有効にして sasldbに登録したアカウントパスワードを設定します
これで SMTP AUTH化は完了です
SMTP AUTHのチェックを外すと メール送信ができないことも確認しましょう
検証環境では OpenLDAPを使っているので
認証基盤を sasldbから 本命の LDAPに切り替えます
OpenLDAPは設定済でメール用アカウントパスワードが下記のように登録済とします
dn: uid=mailtest,ou=People,dc=local
objectClass: top
objectClass: posixAccount
objectClass: account
objectClass: postLdapAdmin
uid: mailtest
cn: MyName
uidNumber: 500
gidNumber: 100
homeDirectory: /home/admin
loginShell: /usr/bin/bash
userPassword:: **************==
gecos: MyName
mail: admin@testtest.com
mailDirectory: /home/admin/Maildir
Cyrus-SASLで sasldb以外のデーターベースを使うには saslauthdが必要です
まず /usr/etc/saslauthd.conf を下記のように設定します
ldap_servers: ldap://localhost
ldap_bind_dn: cn=Manager, dc=mydomain
ldap_password: ********
ldap_search_base: ou=People,dc=testest,dc=com
ldap_filter: (&(uid=%u)(objectClass=posixAccount))
ldap_bind_dn には データベースにアクセスするための LDAPユーザを指定します
(本当は Managerアカウントでなく 読み出し用アカウントを作るべきです)
設定完了したら saslauthdを起動しましょう
# saslauthd -a ldap
#
/usr/lib/sasl2/smtpd.conf を saslauthd に向くように設定変更します
pwcheck_method: saslauthd
mech_list: digest-md5 plain login
cram-md5 を入れると認証に失敗するようなので削除しています
Sylpheed側には LDAPに登録したアカウントパスワードを設定すれば
sasldbと同じようにメールが送れるはずです
LDAPデータベースが使えたら /etc/sasldb2 は不要になります
saslauthd はシステム起動時に自動起動するようにしておきましょう
TLS化する
SMTP AUTHを導入しましたが
インターネットにサーバ公開することを考えたら まだセキュリティに不安です
通信経路を暗号化するSSLを導入しましょう
OpenSSLがあれば 秘密鍵 と サイト証明書 が作れます
# openssl genrsa -des3 -out ./postfix.pem 2048
Generating RSA private key, 2048 bit long modulus
.........................+++
...+++
e is 65537 (0x10001)
Enter pass phrase for ./postfix.pem:適当なパスワード
Verifying - Enter pass phrase for ./postfix.pem:同じパスワード
# openssl rsa -in ./postfix.pem -out /usr/etc/ssl/private/postfix.pem
Enter pass phrase for /ram/postfix.pem:同じパスワード
writing RSA key
# rm ./postfix.pem
#
1回目のコマンドは秘密鍵(パスワード付)の作成
2回目のコマンドで鍵のパスワードを解除し 本命のディレクトリに出力
次のコマンドで 自己証明書を作成します
# openssl req -new -x509 -key /usr/etc/ssl/private/postfix.pem -out /usr/etc/ssl/certs/postfix.pem
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [AU]:JP
State or Province Name (full name) [Some-State]:Tokyo
Locality Name (eg, city) []:Ekoda-ku
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyDomain
Organizational Unit Name (eg, section) []:Home
Common Name (eg, YOUR name) []:MyName
Email Address []:admin@mydomain
#
署名情報は適当でかまいません (公的認証局に登録するようなものでないので)
ファイル名や拡張子も 各システムのポリシーに従って変えてもかまいません
鍵ができたので Postfixの設定を行います main.cf に下記行を追加します
# TLS
smtpd_use_tls = yes
smtpd_tls_key_file = /usr/etc/ssl/private/postfix.pem
smtpd_tls_cert_file = /usr/etc/ssl/certs/postfix.pem
smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_tls_scache
smtpd_tls_loglevel = 1
smtpd_tls_loglevel は必要な詳細度に応じて 0〜4 の値に調整してください
また TCPポート番号が変わるため master.cf への修正も必要です
#smtp inet n - n - - smtpd
smtps inet n - n - - smtpd
-o smtpd_tls_wrappermode=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
smtp(TCP/25)の行をコメントアウトして smtps(TCP/465) の行を有効にするだけです
Postfixを再起動したら ポート番号465が開いているのが確認できるはずです
# netstat -a | grep urd
tcp6 0 0 [::]:urd [::]:* LISTEN
#
Sylpheed等メールクライアントの設定を変えます
「SSLを使用」にチェックを入れるだけです
高度な設定タブでは 送信ポート番号が 465番に変わっていることがわかります
初回メール送信で証明書の確認が求められますが 暗号化が完了したことが確認できます
インターネットへの接続
Postfixの IPv6動作は前半で完了し 認証や通信暗号化も行いました
最後の仕上げにインターネットへの接続も行います
外部ドメイン宛のメールをインターネットに飛ばす設定
Postfixの main.cf に下記更新を行います
inet_protocols = all
mydomain = testtest.com
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, mydomain
relayhost = [smtp.*****.ocn.ne.jp]:25
smtp_bind_address = 192.168.0.254
inet_protocols = all で IPv4も許可する設定としました
外出中メールを送信したいとき 自宅の PostfixにIPv4でつなげるためです
(早く IPv6が普及してほしい)
残りの設定は 外部ドメイン宛のメールをインターネットに飛ばす設定です
mydestination に該当しない宛先は relayhostにメールを配送する設定を行います
mydomain に独自ドメインがあればそれを設定します
relayhost は外部への飛ばし先ですが プロバイダが用意しているサーバを利用します
(MX検索を抑止するため 大括弧[]で括る必要があります)
smtp_bind_address は自サーバのインターフェースアドレスを指定します
ブロードバンドルータには上記の設定を入れました
IMAP接続用に ポート10993番を開けて IMAPサーバの993番に転送します
SMTP接続用に ポート10465番を開けて SMTPサーバの465番に転送します
これでメール受信送信が 外出中から可能になります
便利になる反面 セキュリティの確保にも十分注意する必要があります
IPv6サーバツールへ戻る
UQ WiMAX 導入
WiMAXとは
無線通信の規格です 最大40Mbps(上り方向は10Mbps)まで出ます
Wi-Fiとは別の規格のため 専用通信装置が必要ですが
上記の通り ルータが提供されていたり WiMAX内蔵のノートPCもあります
無線サービス比較
プラン
長所
短所
月額(およそ)
公衆無線LAN
安い
ファーストフード店や空港や鉄道の単位でアクセスポイントが敷かれている
カバーエリアが狭い(事業者同士でアクセスポイントを共有する工夫も見られるが)
0円〜1800円
FONという無線LANを相互提供する仕組みもあります
3G(携帯)
カバーエリアが広い(携帯通信なので)
値段が高い
携帯端末以外をインターネットにつなげられない(最近 テザリングサービスも出てきているので改善傾向かも)
4500円(定額の場合)
イーモバイル
カバーエリアが広い
テザリングに対応している
4580円(2年縛りプラン)
WiMAX
速度が速い
カバーエリアが広い
テザリングに対応している
1契約で 3台まで端末が持てる
電話サービスがない
3880円(1年縛り)
LTE(NTTドコモ Xi)
速度が速い(最大 75Mbps)
低遅延
サービス始まったばかりでエリアが狭い
4935円(2年縛りプラン)
TD-LTE(WCP XGP)
未調査
未調査
サービスが始まっていない
LTE(KDDI)
未調査
未調査
サービスが始まっていない
安さの面では 公衆無線LANが圧倒的だが
利用シーンは 喫茶店で寛いでるときや電車/飛行機で移動中などに限られる
それ以外の選択肢は イーモバイル か WiMAX もしくはいっそのこと スマートフォンですが
まず PCでのネット利用をあきらめるなら 最近のスマートフォンの使い心地の良さがお勧めです
さらに候補にあがってくるのは 電話もネットもPC利用もできる優等生 イーモバイル
そして 電話サービスがないが高品質なデータ通信に特化している WiMAX です
LTEは次世代携帯サービスとして期待されています まだ普及していません
電話は WILLCOM03 を現役で使っていて テザリングができる技もあるみたいですが
WILLCOMから新しいスマートフォンもなかなか出てこず 経営もソフトバンクに買収されたみたいです
選択肢には載せてません
結局 電話は WILLCOMを使いつづけるという前提で WiMAXを選択しました
イーモバイルより安い上に高品質 (滅多に使わない人には 380円/月〜の従量制プランもある)
さらに 「1契約で3台まで端末を登録できる」というのが決定打でした
下記の使い方ができるため 費用を抑えられるというのが理由です
1台目の WiMAXルータは自分が持ちつづけて 通常は電源OFF
2台目の WiMAXルータは実家に送って通常電源ONで使ってもらう
(ただし 自分持ちのルータの電源を入れた間は 実家のルータからネットが使えなくなる)
つまり 複数人で契約を共用できるのです (同時利用は不可能)
UQ WiMAX導入
UQ WiMAXを契約したら 大体 1週間位で必要な機器が届きます
光ファイバと違って事前工事や開通作業も不要
箱の中身は 契約書と WiMAX対応ルータだけでした
ハードウェアとしては上記のとおり USBケーブル 充電用アダプタ ルータ本体(Aterm WM3500R)
USBケーブルだけで 充電と通信が同時にできるので 充電用アダプタは使ってません
インターフェースは 電源ボタン SETボタン(確認用) USBポート 充電アダプタ用ポート の構成です
ちなみに 実家用とは別に自分用のルータを個人購入したので初期投資が財布に響きます
ルータに USBケーブルを挿して電源を入れた状態です
(同じ Aterm WM3500R 赤 20000円)
電源入れてから 実際にインターネットにつながるまでに 2分ほど待たされます
頻繁に電源を ON/OFF する自分の身とてしては結構気にかかる部分でした
Windows Vista以上ならパソコンに USB挿すだけで自動認識されます
Windows XPに USB接続するなら別途システムファイルインストールが必要です
USB接続でなく 無線LANで接続するなら無線LANの設定のみでつながります
普通のネットワーク機器として認識されています
IPアドレス等も自動て設定されるため つなげるだけで使えるようになるイメージです
ルータの DHCP機能によって IPアドレスが割出されています
ルータへのアクセスは ブラウザを開いて http://192.168.0.1/ を叩くだけです
以降がその設定です
初回接続でパスワードの設定が求められます
プロバイダ契約の説明画面です
その後エラーが出てしまいました
UTPケーブルを挿していたためプロバイダに正常に接続できなかったのです
有線LAN その他 無線LAN は一旦切断する必要があります
ルータは UQ WiMAX専用なので 自動的に UQ WiMAXと契約にいきます
別途 新規にルータを購入すればどのプロバイダと契約するか選択する画面が現れます
この画面は1回しか見ることができないので 記念的な意味で掲載しました
契約が済んでいれば 通常上記のような設定インターフェース画面となります
画面は ルータが無線LAN親機として振る舞うための設定画面です
通信内容の傍受を避けるために プロトコルを WPA/WPA2 としています
ちなみに 1台目を利用中に 別の2台目の電源を入れても
ネットが使えず上記のような HTMLが返ってきます
1台目の電源をOFFにした後 2台目の SETボタンを押せば再び使えるようになります
フレッツ光ネクスト + OCN 導入
NTTの フレッツ光ネクスト でトリプルプレイを導入した
2010-11-27 に申し込んで 2010-12-14 に開通したので
大体 3週間くらいかかったことになり このあたりは auひかりと同じでした
もともと auひかりのエリア範囲だったので ギガ得プランの継続と工事を申し込んでいたのですが
2週間ほどまたされた挙句 「光ファイバが通らない区間があるので開通できない」と断られたのです
同じ関東圏のサービスエリアであっても条件によって光ファイバが開通できないこともあり
NTTフレッツの方が若干サービスエリアが広いようです
フレッツ光での宅内構成は下記の通りです
ほぼ auひかりと同じですが 光集線ボックスとホームゲートウェイの間にあった ONUがなくなって
ホームゲートウェイにONU機能が含まれています 従ってホームゲートウェイまでが光ファイバです
ひかりTV用の STBです
手のひらよりひとまわり大きめのサイズです
左から電源入力 UTP入力 D端子出力 RCA出力 HDMI出力 光デジタル音声出力
HD画質が楽しむために HDMIを使える環境が欲しいところです
リモコンはこんな感じになっています
次にメインとなる ホームゲートウェイですが PR-S300SE というフレッツ光ネクスト専用ルータです
STBと同じくらいの大きさです
IPv6対応 ONU内蔵 ファイアウォール機能,NAT機能,DHCP機能 を備える高機能ルータで
Webによる設定も可能です
さらに面白い機能としては VoIP内線子機を持てる点ですがこれは後述します
上から UTPポート(SW-HUB) 電話コード(契約により 2回線持てる?) 電源と 光ファイバです
使用済のポートの中をのぞいてみると UTPケーブルが配線されています
実はこのルータ 中身は ルータ装置とONU装置をくっつけた構成のようです
製造シールも 2枚貼られているし ニコイチですかねやっぱり
工事は エアコンのダクトを流用して外の光ファイバを引き込む方式をとってもらいました
他の引き込み方法としては 電話回線の引き込み口を流用する方法も多いそうです
光終端部分の拡大図
外向けの光ファイバと内向けの光ファイバを接続している部分で 内外の責任分界点です
内向け光ファイバの配線状況です
線のフレキシブル具合に注目です 最近の宅内ファイバはこんなに曲げても使えるのですね
ルータ周りの配線後の状況です
左下にある小さいのは 100Mbps SW-HUBです ゲーム機等に分配しています
ルータの Gbpsポートは合計4ポートあります
1ポートをSTBとの接続に 1ポートをSW-HUBと接続したため 残り2ポートはパソコンに接続しました
ルータの設定
ルータへの各種設定は Web画面を通じて行います
パソコンを繋いだら ルータから IPアドレスが割り当てられているはずです
ブラウザを開いて http://192.168.1.1/ を開いてみます
アカウントパスワードが求められますが認証をパスすると下記画面となります
Webを使った GUIな操作で各種設定ができます
接続先設定の部分は PPPoEによる NTTとの接続設定となります
開通業者が初期設定してくれるので特にいじる必要はありません
電話設定の項目です
画面では IP phone とありますが 実は 手持ちのVoIP端末を内線子機として利用できるのです
使いかたによっては 位置固定の原則を打ち破れるような使いかたも可能
ここ が参考になります
無線カードがあれば 設定できます
DHCPに関する設定です
特定のMACアドレスに 特定のIPアドレスを割り当てる設定ができないのが使いづらい部分です
パケットフィルタに関する設定です
外部からの侵入を防ぐための基本的な設定がデフォルトで入っています
IPアドレス ポート番号 変換によるポート開放もできます
IPアドレス変換による サービス公開用の設定ができます
その他設定項目です
メンテナンスでは 機器の再起動や pingによる疎通チェックができます
UNIX系のOSが組み込まれているのでしょうか
情報欄では 機器の動作ログが確認できます
auひかりのルータと比較すると 使い勝手はほぼ一緒ですが
USBポートがない分 VoIP機能が使えたりと 独自機能で個性が出ていて面白いと思います
ひかりTV
次は STBメインの話になります
リモコンでコントロールします
初回起動の画面です 初期設定が必要となります
お客様ID を登録します
ネットワーク上で認証後 初回設定は終了です
地デジのチャンネル設定はすぐ後で行います
メインメニューです
HD画質対応のため フォントは見やすいです
配信終了間近 と書いてあるのは オンデマンド配信ビデオのことです
auひかりでもそうでしたが コンテンツをどんどん配信終了にされるとライブラリが充実しないのでは
ないかと思います ( コンテンツを持ちつづけることにライセンス料が発生するのでしょうか? )
プレミアム ではオプション有料チャンネル オンデマンドビデオ カラオケ などが選択できます
番組表は HDの高解像度を利用した見やすい表示となっています
地デジのチャンネル設定を行わないと 上記メッセージが出ます
早速チャンネル設定を済ませます
設定メニューから
チャンネルスキャンすれば 地デジの番組一覧が自動認識されます
STBへは IP配信のはずなのにチャンネルスキャンの作業は必要なのでしょうか??
システム情報表示です ほとんど伏字ですが
IPv6対応しているのは 大手キャリアならではといったところでしょうか
USB-HDDがあれば 録画も可能です
ひかりTVでは 1300円/月 で 500GBHDD内蔵STBのレンタルも可能ですが
自前でHDDを用意すれば 特にレンタルするまでもないかなと思います
(10ヵ月も待たずに元が取れる計算です)
なんと 外出先から iPhone Android端末を使って番組予約も可能
詳しくは ここを参照ください
リモート予約できる 端末を追加するためにはパスワードによる登録作業が必要です
お知らせから各種情報が入手できます
NHKオンデマンドも利用可能
昔見たアニメでもう1回見たいのがあったのですが ライブラリになかった
いまいち使い勝手がよろしくありません
オンデマンド購入したビデオは 一定期間ここから選択して見れる(はず)
オンラインショッピングもできます
品揃えとしては ひかりTV向け機器や ギフトセットなどのみでした
インターネット普通にできるのだから Amazon使ったほうがはるかに便利
将来的に期待したいのは 番組で放映された各種アイテムや関連商品が
リアルタイムで商品一覧に表示されて ボタン1つで買い物カゴに入るところ
ここまで出来たら神です Amazon越えられます
Google TV がそんなの目指してるのかも
カラオケも可能です 18000曲以上毎月更新されています
1日歌いたい放題で 500円プランあるので 自宅カラオケ大会やる分には安いでしょう
でもアパートでは無理 使ってません
オンデマンドビデオ試聴も リモコンで選択できます
図のとおり 100円ビデオとかキャンペーンもやってます
配信終了の概念がなければ もっといいのですが
その他
その他付加サービスとしては 「フレッツウィルスクリアv6」というのがあります
ウィルスバスター相当の ウィルス対策ソフトが 3ライセンス 400円/月 で提供されます
ネットを経由して インストーラをダウンロードする形式です
月額420円(税込)だったら 年間5000円の計算なので市販のウィルスソフトとほぼ同じの価格です
しかも 3ライセンス分使えることを考えると 値段的には市販ウィルスソフトと比較すると安いです
当初は すぐに解約してやろうかと思ってましたが ずるずる利用中…
ただ本当に「ウィルスバスター」相当なら ウィルスバスターは他の市販ウィルスソフトと比較して
ウィルスの検出能力に弱いとのことなので ここは注意が必要です
最後に
ネット 電話 TV と光ファイバでまかなえるようになって かなり便利になったと思います
今は解約したけど 2008年に導入した auひかりの記事はこちら
CPU | AMD PhenomII X4 905e (2.5GHz 4コア) |
---|---|
メモリ | 16GB |
OS | Gentoo-1.12.14ベース Linux-3.0 UTF-8 |
コンパイラ | gcc-4.5.2 |
Cライブラリ | glibc-2.13 |
Perl | 5.12.2 |
PHP | |
SQLite | autoconf-3070800 |
BerkeleyDB | 5.1.25.NC |
PostgreSQL | 9.1 |
MySQL | 5.5.15 |
Oracle | 11g Express Edition Release2 |
LDAP | OpenLDAP-2.4.23 |
Apache httpd | 2.2.21 |
Apache apr | 1.4.5 |
Apache apr-iconv | 1.2.1 |
Apache apr-util | 1.3.12 |
インストール
Apache(本家) から Stable Releaseをダウンロードします
ダウンロードしたソースを一時ディレクトリに展開します
$ tar -xjf httpd-2.2.21.tar.bz2
$ cd httpd-2.2.21
$ ls -F srclib/
Makefile.in apr/ apr-util/ pcre/
$
$ tar -xjf httpd-2.2.21.tar.bz2 $ cd httpd-2.2.21 $ ls -F srclib/ Makefile.in apr/ apr-util/ pcre/ $
srclib/ に含まれている apr apr-util のパッケージを先にインストールする必要があります
これらプログラムは APR(Aapche Portable Runtime)と呼ばれ
OS間の差異を吸収する 共通ライブラリとして機能します
(具体的には メモリ確保 I/O ライブラリリンク スレッド 時刻 ユーザID など)
srclib/ に含まれていない apr-iconv も導入しておきたいので
apr apr-iconv apr-util をまとめて Portable Runtime Project
からダウンロードしておきましょう
aprのインストールは下記のように行いました
$ ./configure --prefix=/usr/apache --enable-threads checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking target system type... x86_64-unknown-linux-gnu Configuring APR library 〜 config.status: creating apr-1-config config.status: creating apr.pc config.status: creating test/Makefile config.status: creating test/internal/Makefile config.status: creating include/arch/unix/apr_private.h config.status: executing default commands $ make make[1]: ディレクトリ `/home/admin/apr-1.4.5' に入ります 〜 make[1]: ディレクトリ `/home/admin/apr-1.4.5' から出ます $ su # make install make[1]: ディレクトリ `/home/admin/apr-1.4.5' に入ります make[1]: `local-all' に対して行うべき事はありません. make[1]: ディレクトリ `/home/admin/apr-1.4.5' から出ます 〜 /usr/bin/install -c -m 644 build/apr_rules.out /usr/apache/build-1/apr_rules.mk /usr/bin/install -c -m 755 apr-config.out /usr/apache/bin/apr-1-config #
ビルドを補助するためのコマンドで apr-1-config が使えるようになります
apr-iconvのインストールは apr-utilのインストールと同時に行います
そのためここでは アーカイブの展開だけしておきます
$ tar -xzf apr-iconv-1.2.1.tar.gz $
続いて apr-utilのインストールを下記のように行いました
$ tar -xzf apr-util-1.3.12.tar.gz $ cd apr-util-1.3.12 $ ./configure --prefix=/usr/apache --with-apr=/usr/apache --with-apr-iconv=../apr-iconv-1.2.1 --with-sqlite3=/usr --with-dbm=db51 --with-pgsql=/usr --with-mysql=/usr/mysql --with-oracle=$ORACLE_HOME --with-odbc=/usr --with-ldap=/usr checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking target system type... x86_64-unknown-linux-gnu checking for a BSD-compatible install... /usr/bin/install -c checking for working mkdir -p... yes 〜 config.status: creating include/apu_want.h config.status: creating test/Makefile config.status: creating include/private/apu_config.h config.status: executing default commands $ make Making all in ../apr-iconv-1.2.1 make[1]: ディレクトリ `/home/admin/apr-iconv-1.2.1' に入ります (cd lib; make CPPFLAGS=" ") 〜 dbd/apr_dbd_odbc.c: In function ‘odbc_start_transaction': dbd/apr_dbd_odbc.c:1178:32: 警告: 異なるサイズの整数からポインタにキャストされました /bin/sh /usr/apache/build-1/libtool --silent --mode=link gcc -g -O2 -pthread -release 1 -module -rpath /home/admin/lib/apr-util-1 -o dbd/apr_dbd_odbc.la dbd/apr_dbd_odbc.lo -L/usr/lib -lodbc make[1]: ディレクトリ `/home/admin/apr-util-1.3.12' から出ます $ su # make install /usr/apache/build-1/mkdir.sh /home/admin/lib/apr-util-1 Making all in ../apr-iconv-1.2.1 〜 /usr/bin/install -c -m 644 aprutil.exp /usr/apache/lib /usr/bin/install -c -m 755 apu-config.out /usr/apache/bin/apu-1-config #
apr-iconv関連では apriconv のコマンドが利用できるようになります
あと /usr/apache/lib/iconv/ 配下にやたらと各国語用のモジュールが追加されます
apr-util関連では apu-1-config がビルド補助用に使えるようになり
/usr/apache/lib/apr-util-1/ に各データベース接続用のモジュールが追加されます
–with-apr-iconv の指定により apr-iconvも同時にビルドされますが
インストールされた apu-1-config に修正が必要でした
(apu-1-config –libs とコマンドを叩くと apr-iconv関連のパス修正が必要と分かるでしょう)
29 30 LIBS="/home/admin/apr-util-1.3.12/../apr-iconv-1.2.1/lib/libapriconv.la -lexpat" 31 INCLUDES="/home/admin/apr-util-1.3.12/../apr-iconv-1.2.1/include " 32 LDFLAGS=""
LIBSの部分と INCLUDESの部分に ソースディレクトリが指定されてしまっているので修正します
下記のように修正しました
29 30 LIBS="/usr/apache/lib/libapriconv-1.la -lexpat" 31 INCLUDES="" 32 LDFLAGS=""
また検証環境では Oracleが認識されず configure前に下記作業が必要でした
# cd $ORACLE_HOME/lib # ln -s libclntsh.so.11.1 libclntsh.s
つまり -lclntsh 付きの gcc がコンパイルできる必要があるのです
Oracleを使っているのに lib/apr-util-1/に apr_dbd_oracle〜 が見付からない場合は
上記の対応後 apr-utilsの再ビルドが必要です
以上でようやく apache本体のビルドが可能となります
$ tar -xjf httpd-2.2.21.tar.bz2 $ cd httpd-2.2.21/ $ ./configure --prefix=/usr/apache --localstatedir=/var --enable-suexec --with-suexec-caller=www --enable-so --enable-modules="most" --enable-mods-shared="most" checking for chosen layout... Apache checking for working mkdir -p... yes checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking target system type... x86_64-unknown-linux-gnu Configuring Apache Portable Runtime library ... 〜 config.status: creating build/rules.mk config.status: creating build/pkg/pkginfo config.status: creating build/config_vars.sh config.status: creating include/ap_config_auto.h config.status: executing default commands $ make Making all in srclib make[1]: ディレクトリ `/home/admin/httpd-2.2.21/srclib' に入ります Making all in pcre 〜 /usr/apache/build-1/libtool --silent --mode=link gcc -g -O2 -pthread -o suexec suexec.lo make[2]: ディレクトリ `/home/admin/httpd-2.2.21/support' から出ます make[1]: ディレクトリ `/home/admin/httpd-2.2.21' から出ます $ su # make install Making install in srclib make[1]: ディレクトリ `/home/admin/httpd-2.2.21/srclib" に入ります 〜 mkdir /usr/apache/man/man1 mkdir /usr/apache/man/man8 mkdir /usr/apache/manual make[1]: ディレクトリ `/home/deer/admin/httpd-2.2.21" から出ます #
configureオプションですが –enable-so は動的モジュール化するのに必須です
–enable-modules="most" –enable-mods-shared="most"
で Apacheのオプション機能をほとんど有効化しモジュール化しています
$ ls /usr/apache/modules/ httpd.exp mod_authz_user.so mod_include.so mod_actions.so mod_autoindex.so mod_info.so mod_alias.so mod_cgi.so mod_log_config.so mod_asis.so mod_dav.so mod_logio.so mod_auth_basic.so mod_dav_fs.so mod_mime.so mod_auth_digest.so mod_dbd.so mod_negotiation.so mod_authn_anon.so mod_deflate.so mod_reqtimeout.so mod_authn_dbd.so mod_dir.so mod_rewrite.so mod_authn_dbm.so mod_dumpio.so mod_setenvif.so mod_authn_default.so mod_env.so mod_speling.so mod_authn_file.so mod_expires.so mod_status.so mod_authz_dbm.so mod_ext_filter.so mod_substitute.so mod_authz_default.so mod_filter.so mod_suexec.so mod_authz_groupfile.so mod_headers.so mod_userdir.so mod_authz_host.so mod_ident.so mod_version.so mod_authz_owner.so mod_imagemap.so mod_vhost_alias.so $
特に小容量の Apacheを作りたいなどカスタマイズの必要があれば
–enable-modules="alias cgi" のように個別に指定することも可能です
続いて Apache用の start/stopスクリプトを用意しましょう
下記で紹介するのは Gentoo形式に従ったスクリプトですが
Apacheには apachectlという管理コマンドが付属しているのでシンプルな記載になります
#!/sbin/runscript # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header$ depend() { need net.eth0 } start() { ebegin "Starting apache" /usr/apache/bin/apachectl start eend $? } stop() { ebegin "Stopping apache" /usr/apache/bin/apachectl stop eend $? }
次に Apacheの設定ファイルをカスタマイズします
conf/httpd.conf が設定ファイルです
最近の Apacheはモジュールに関する設定を conf/extra/ に分けてインポートする記述のため
httpd.conf本体は だいぶ軽量化しています
httpd.confの修正点は下記の通りです
User www Group daemon
httpd実行アカウントを指定します www のアカウントが既に存在していたので利用しました
ServerAdmin www@mydomain ServerName www.mydomain:80
ServerAdminには管理者メールアドレスを指定します
ServerNameは 公開するHPのFQDNとポート番号を指定します ここは httpdの動作に必須の項目です
(mydomainの DNSに wwwホスト設定の追加もしておきます)
とりあえず最小限の設定は以上です まずは Apacheが動作するかを確認しましょう
# /etc/init.d/apache start * Caching service dependencies ... [ ok ] * Starting apache ... [ ok ] #
IPv6クライアントの検証ページでApacheの正常動作を確認しました
(書きかけですが とりあえずここまで)
IPv6サーバツールへ戻る
PostgreSQLを試してみる
PostgreSQLは 高機能なオープンソースRDBMS(データベース)です
PostgreSQLは MySQLと 肩を並べるほどの高機能なオープンソースRDBMSです
日本語環境も充実しているので 日本での普及も進んでいるようです
今回 64bit環境 IPv6環境での動作検証を行います
検証環境
CPU
AMD PhenomII X4 905e (2.5GHz 4コア)
メモリ
16GB
OS
Gentoo-1.12.14ベース Linux-3.0 UTF-8
コンパイラ
gcc-4.5.2
Cライブラリ
glibc-2.13
Perl
5.12.2
TCL
8.5.9
libxml
libxml2-sources-2.7.8
libxslt
libxslt-1.1.26
PAM
Linux-PAM-1.1.3
SSL
openssl-1.0.0d
OpenLDAP
2.4.23
PostgreSQL
9.1
CPU | AMD PhenomII X4 905e (2.5GHz 4コア) |
---|---|
メモリ | 16GB |
OS | Gentoo-1.12.14ベース Linux-3.0 UTF-8 |
コンパイラ | gcc-4.5.2 |
Cライブラリ | glibc-2.13 |
Perl | 5.12.2 |
TCL | 8.5.9 |
libxml | libxml2-sources-2.7.8 |
libxslt | libxslt-1.1.26 |
PAM | Linux-PAM-1.1.3 |
SSL | openssl-1.0.0d |
OpenLDAP | 2.4.23 |
PostgreSQL | 9.1 |
インストール
ここでのインストール作業は 主に以下の流れを解説しています
- PostgreSQLソースパッケージのダウンロード
- ソースコードからのビルドと PostgreSQLバイナリファイル郡のインストール
- postgresql.conf環境設定 start/stop起動スクリプトの設定
- データベース領域の新規作成
- postmasterの起動
早速 PostgreSQLのダウンロードサイトからソースコードをダウンロードします
ここではソースコードからビルドしますが
パッケージ管理機構を持つシステム用にパッケージ提供もされています
$ tar -xjf postgresql-9.1.0.tar.bz2 $ cd postgresql-9.1.0 $ ls COPYRIGHT HISTORY Makefile aclocal.m4 configure contrib src GNUmakefile.in INSTALL README config configure.in doc $ ./configure --prefix=/usr --datadir=/usr/share/pgsql --enable-nls --with-pam --with-libxml --with-libxslt --with-perl --with-tcl --with-ldap --with-openssl checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu checking which template to use... linux checking whether to build with 64-bit integer date/time support... yes checking whether NLS is wanted... yes checking for default port number... 5432 checking for block size... 8kB checking for segment size... 1GB checking for WAL block size... 8kB checking for WAL segment size... 16MB checking for gcc... gcc 〜 config.status: linking src/backend/port/unix_latch.c to src/backend/port/pg_latch.c config.status: linking src/backend/port/dynloader/linux.h to src/include/dynloader.h config.status: linking src/include/port/linux.h to src/include/pg_config_os.h config.status: linking src/makefiles/Makefile.linux to src/Makefile.port $ make make -C src all make[1]: ディレクトリ `/home/admin/postgresql-9.1.0/src' に入ります make -C port all make[2]: ディレクトリ `/home/admin/postgresql-9.1.0/src/port' に入ります gcc -O2 -Wall -Wmissing-prototypes -Wpointer-arith -Wdeclaration-after-statement -Wendif-labels -Wformat-security -fno-strict-aliasing -fwrapv -I../../src/port -DFRONTEND -I../../src/include -D_GNU_SOURCE -I/usr/include/libxml2 -c -o strlcat.o strlcat.c 〜 $ su # make install 〜 # make install-docs 〜 #
–datadir は設定ファイルの置き場所となります (データベース設置場所ではありません)
また事前に libxml2 libxsltなど関連ライブラリがインストールされている必要があります
さらに検証した PostgreSQL-9.1 ではドキュメント類のインストールに
make install-docs が必要でした
次に システム管理者権限の環境変数設定を行っておきます PGLIB PGDATA の2つです
下記の設定を /etc/profile 等に追記してシステムログイン時に反映されるようにします
PGLIB=/usr/lib PGDATA=/var/db/pgsql
PGDATAにデータベース領域をディレクトリで指定します
今後 /var/db/pgsql/ にデータベースを作成しメインで使っていくため指定しています
最後に PostgreSQLを起動/停止するための start/stopスクリプトを作成します
スクリプトの書き方は ディストリビューションによるので下記の例は参考程度のものです
下記は Gentoo用 /etc/init.d/pgsql (root 0755)
#!/sbin/runscript # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header$ depend() { need net.eth0 after apache provide pgsql } start() { ebegin "Starting PostgreSQL" su adm -s /usr/bin/bash -c "/usr/bin/pg_ctl start -w -D /var/db/pgsql -s" eend $? } stop() { ebegin "Stopping MySQL" su adm -s /usr/bin/bash -c "/usr/bin/pg_ctl stop -D /var/db/pgsql -s -m fast" eend $? } restart() { ebegin "Restarting MySQL" su adm -s /usr/bin/bash -c "/usr/bin/pg_ctl restart -w -D /var/db/pgsql -s -m fast" eend $? } status() { su adm -s /usr/bin/bash -c "/usr/bin/pg_ctl status -D /var/db/pgsql" exit $? }
基本的に -D データベース領域 を指定して pg_ctl にコマンドを渡す形です
複数のデータベースディレクトリを運営する場合は その分 pg_ctlの行が増えるイメージです
(検証環境では /var/db/pgsql のみの運営とします)
stop や restart で指定している -m fast はシャットダウンモードの指定です
smart(クライアント利用終了待ち) fast(クライアント強制切断) immediate(強制終了)など
3通りモードがあります (詳しくは pg_ctl –helpで)
admアカウントをデータベース管理アカウントとして pg_ctlの各種処理を行っています
(MySQLも admアカウントで運営しているので今回流用しました
通常なら postgresアカウントを作って使うのが一般的です)
以上がインストールまでの一通りの作業です
データベースの運営
ここでは データベースの初期化 設定 IPv6接続確認 まで紹介します
まずは データベースの管理についてですが
PostgreSQLは postmaster 1プロセス毎に 1データベース領域(=ディレクトリ)を管理します
ディレクトリの中に データベース(複数) 各種ログ 設定ファイル が含まれます
ここでは先ほどの start/stopスクリプトで定義したとおり
admアカウントを管理アカウントとする /var/db/pgsql/ を初期化します
# mkdir /var/db/pgsql
# chown adm /var/db/pgsql
# su adm -s /usr/bin/bash -c "initdb $PGDATA"
データベースシステム内のファイルの所有者は"adm"ユーザでした。
このユーザがサーバプロセスを所有しなければなりません。
データベースクラスタはロケールja_JP.utf8で初期化されます。
デフォルトのデータベース符号化方式はUTF8に設定されました。
initdb: ロケール"ja_JP.utf8"用の適切なテキスト検索設定が見つかりません
デフォルトのテキスト検索設定はsimpleに設定されました。
ディレクトリ/var/db/pgsqlの権限を設定しています ... ok
サブディレクトリを作成しています ... ok
デフォルトのmax_connectionsを選択しています ... 100
デフォルトの shared_buffers を選択しています ... 24MB
設定ファイルを作成しています ... ok
〜
警告: ローカル接続向けに"trust"認証が有効です。
pg_hba.confを編集する、もしくは、次回initdbを実行する時に-Aオプショ
ンを使用することで変更することができます。
成功しました。以下を使用してデータベースサーバを起動することができます。
postmaster -D /var/db/pgsql
または
pg_ctl -D /var/db/pgsql -l logfile start
#
# mkdir /var/db/pgsql # chown adm /var/db/pgsql # su adm -s /usr/bin/bash -c "initdb $PGDATA" データベースシステム内のファイルの所有者は"adm"ユーザでした。 このユーザがサーバプロセスを所有しなければなりません。 データベースクラスタはロケールja_JP.utf8で初期化されます。 デフォルトのデータベース符号化方式はUTF8に設定されました。 initdb: ロケール"ja_JP.utf8"用の適切なテキスト検索設定が見つかりません デフォルトのテキスト検索設定はsimpleに設定されました。 ディレクトリ/var/db/pgsqlの権限を設定しています ... ok サブディレクトリを作成しています ... ok デフォルトのmax_connectionsを選択しています ... 100 デフォルトの shared_buffers を選択しています ... 24MB 設定ファイルを作成しています ... ok 〜 警告: ローカル接続向けに"trust"認証が有効です。 pg_hba.confを編集する、もしくは、次回initdbを実行する時に-Aオプショ ンを使用することで変更することができます。 成功しました。以下を使用してデータベースサーバを起動することができます。 postmaster -D /var/db/pgsql または pg_ctl -D /var/db/pgsql -l logfile start #
ここでは initdbコマンドを直接叩きましたが
pg_ctlからでも同様のことができるので pg_ctlに統一したほうが覚えやすいかもしれません
/var/db/pgsql/ 内が初期化されデータベース領域を利用する準備が整いました
# ls /var/db/pgsql/ PG_VERSION pg_hba.conf pg_serial pg_twophase postmaster.pid base pg_ident.conf pg_stat_tmp pg_xlog global pg_multixact pg_subtrans postgresql.conf pg_clog pg_notify pg_tblspc postmaster.opts #
ユーザ管理についてですが この時点では
データベース管理ユーザとして initdbを行ったアカウント adm が設定されています
次に設定ファイル postgresql.conf pg_hba.conf pg_ident.conf をカスタマイズします
まず postgresql.conf から設定します
以下は追記/編集した行のみの情報です
data_directory = '/var/db/pgsql' hba_file = '/var/db/pgsql/pg_hba.conf' ident_file = '/var/db/pgsql/pg_ident.conf' listen_addresses = 'localhost,fe80::1***:****:****:***a%eth0'
data_directory はデータベース領域そのものを表します
hba_file は pg_hba.conf の置き場所を指定します
ident_file は pg_ident.conf の置き場所を指定しますが
ident認証方式を選択したときに利用されるだけで 今回の検証では ident認証方式は使いません
listen_address は 接続を行うインターフェースを指定するものです
デフォルトは 'localhost' となり外部ホストから接続を受け付けません
IPアドレスを指定することでそのIPで listen()するようになります
(ちなみに PostgreSQL7系まで使われていた tcpip_socket は廃止となっています)
今回 localhost も /etc/hosts では ::1 になっているので完全な IPv6仕様です
続いて認証に関する設定は pg_hba.conf 内で設定します
local all all trust host all all 127.0.0.1/32 trust host all all ::1/128 trust host all gamer fe80::1***:****:****:***a/64 md5
上3行はローカルホストからの接続設定で 全データベースユーザを無条件に利用可能(trust)
最後1行が追加行で IPv6アドレスのみ許可 パスワード認証(md5)も実施する設定です
(IPv6のアドレスの箇所は伏字で標記しています)
IPv6部分はリンクローカルアドレスを使うことでグローバルからのパケットは届かない仕組みです
gamerというアカウントに制限しているので 後ほど gamerアカウントを作成することにします
pg_ident.conf は今回使いません
以上で データベース領域の初期化と設定が完了です 早速 postmaster を起動しましょう
# /etc/init.d/pgsql start * Starting PostgreSQL ... /usr/bin/postgres: /lib64/libz.so.1: no version information available (required by /usr/lib64/libxml2.so.2) /usr/bin/postgres: /lib64/libz.so.1: no version information available (required by /usr/lib64/libxml2.so.2) LOG: データベースシステムは 2011-09-19 22:52:24 UTC にシャットダウンしました LOG: データベースシステムの接続受付準備が整いました。 LOG: 自動バキュームランチャプロセス [ ok ] # netstat -an | grep 5432 tcp6 0 0 fe80::1***:***:**:5432 :::* LISTEN tcp6 0 0 ::1:5432 :::* LISTEN unix 2 [ ACC ] STREAM LISTENING 43186 /tmp/.s.PGSQL.5432 #
IPv6で接続が可能な状態となっています ローカルホストから UNIXドメインソケット接続も可能です
ポート番号も 5432 でデフォルトのままです
(複数の postmasterを運用する場合カスタマイズする必要あります)
データベース領域に データベースを1つ追加します games という名前で作成します
$ createdb -h localhost -U adm games $
-h localhost は接続先データベースホストを指定します localhostならば省略可能です
-U adm は指定必要です データベース管理権限ユーザを指定します
追加ユーザも作っておきましょう
pg_hba.conf では gamer を外部接続用に定義しているので gamerユーザを作成します
$ createuser -U adm gamer 新しいロールをスーパーユーザにしますか? (y/n)n 新しいロールに対してデータベースを作成する権限を与えますか? (y/n)n 新しいロールに対して別のロールを作成する権限を与えますか? (y/n)n $
-P オプションでパスワードを同時に設定することもできますが 次のように DDLで設定します
$ psql -U adm games psql (9.1.0) "help" でヘルプを表示します. games=# alter user gamer encrypted password 'gamer'; ALTER ROLE games=# \\q $
データベースに接続するために psql コマンドを使いました
データベース接続後 サブシェルが開いて各種コマンドが発行できます
とりあえずローカルホスト上でデータベースに接続できることを確認し
gamerのパスワードを設定しました
では IPv6接続の検証を行います 別ホストの端末から psqlで接続します
$ psql -U gamer -h fe80::1***:****:****:***a%eth0 games Password for user gamer: Welcome to psql 8.3.0 (server 9.1.0), the PostgreSQL interactive terminal. Type: \copyright for distribution terms \h for help with SQL commands \? for help with psql commands \g or terminate with semicolon to execute query \q to quit WARNING: You are connected to a server with major version 9.1, but your psql client is major version 8.3. Some backslash commands, such as \d, might not work properly. games=> \\q $
psql に -h オプションで外部ホストを明示します Linuxでは %eth0 も必要でした
別ホスト側が PostgreSQL-8.3.0 を使っていたので警告が表示されていますが
IPv6での接続性は OKです
ただし 以降のデータベース操作検証は PostgreSQL-9.1.0側のサーバに戻って実施します
理由は別ホスト側の文字コードが EUC-JP サーバ側の UTF-8 と食い違っているため
文字化けするのです
テーブルの作成と動作検証
gamesデータベースまで作成したので
実際にレトロ系テレビゲームのデータを投入して 各種検索もデモします
サンプルデータ tvgames.zip(EUC-JP) をデータベース化します
$ eunzip tvgames.zip
Archive: tvgames.zip
inflating: tvgames.txt
$ head -n 10 tvgames.txt | iconv -f euc-jp
ドンキーコング,FC,任天堂,4500,1983-07-15
ドンキーコングJR.,FC,任天堂,4500,1983-07-15
ポパイ,FC,任天堂,4500,1983-07-15
五目ならべ [連珠],FC,任天堂,4500,1983-08-27
麻雀,FC,任天堂,4500,1983-08-27
マリオブラザーズ,FC,任天堂,4500,1983-09-09
ポパイの英語遊び,FC,任天堂,4500,1983-11-22
ベースボール,FC,任天堂,4500,1983-12-07
ドンキーコングJR. の算数遊び,FC,任天堂,4500,1983-12-12
テニス,FC,任天堂,4500,1984-01-14
$
$ eunzip tvgames.zip Archive: tvgames.zip inflating: tvgames.txt $ head -n 10 tvgames.txt | iconv -f euc-jp ドンキーコング,FC,任天堂,4500,1983-07-15 ドンキーコングJR.,FC,任天堂,4500,1983-07-15 ポパイ,FC,任天堂,4500,1983-07-15 五目ならべ [連珠],FC,任天堂,4500,1983-08-27 麻雀,FC,任天堂,4500,1983-08-27 マリオブラザーズ,FC,任天堂,4500,1983-09-09 ポパイの英語遊び,FC,任天堂,4500,1983-11-22 ベースボール,FC,任天堂,4500,1983-12-07 ドンキーコングJR. の算数遊び,FC,任天堂,4500,1983-12-12 テニス,FC,任天堂,4500,1984-01-14 $
ファミコンから プレイステーション1まで 全11429タイトルを納めているので
検証用のデータベース素材としてお手頃です
このデータを格納するテーブルを作成します
$ psql -U gamer games psql (9.1.0) "help" でヘルプを表示します. games=> create table tvgames ( name text, plathome text, company text, price int, release_date date ); CREATE TABLE games=> \\dt リレーションの一覧 スキーマ | 名前 | 型 | 所有者 ----------+---------+----------+-------- public | tvgames | テーブル | gamer (1 行) games=> \\d tvgames テーブル "public.tvgames" カラム | 型 | 修飾語 --------------+---------+-------- name | text | plathome | text | company | text | price | integer | release_date | date | games=> \\q $
\\dt と叩けば定義されているテーブルを一覧で確認できます
\\d テーブル名 でテーブルの定義も見れます
サンプル tvgames.txtを insert文に加工して SQL投入できるようにします
$ iconv -f euc-jp -t utf-8 tvgames.txt | sed "s/'/''/g" | sed "s/^\\(.*\\),\\(.*\\),\\(.*\\),\\(.*\\),\\(.*\\)$/insert into tvgames ( name, plathome, company, price, release_date ) values ( '\\1', '\\2', '\\3', \\4, '\\5' );/" | less -r > tvgame_insert.txt $ head -n 10 tvgame_insert.txt insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-07-15' ); insert into tvgames ( name, plathome, company, price, release_date ) values ( 'JR.', 'FC', '任天堂', 4500, '1983-07-15' ); insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-07-15' ); insert into tvgames ( name, plathome, company, price, release_date ) values ( ' [連珠]', 'FC', '任天堂', 4500, '1983-08-27' ); insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-08-27' ); insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-09-09' ); insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-11-22' ); insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1983-12-07' ); insert into tvgames ( name, plathome, company, price, release_date ) values ( 'JR. の算数遊び', 'FC', '任天堂', 4500, '1983-12-12' ); insert into tvgames ( name, plathome, company, price, release_date ) values ( '', 'FC', '任天堂', 4500, '1984-01-14' ); $
PostgreSQLでは ' をエスケープするために '' と 2つ重ねて指定します
では作成した insert文を流し込みますが
psql に -f でテキストファイルを指定すれば テキストの内容を順番に実施してもらえます
$ psql -U gamer -f tvgame_insert.txt games INSERT 0 1 〜 INSERT 0 1 $
tvgamesテーブルの完成です
実際に SQLの select構文を使って各種検索をためしてみます まずは10レコード分の表示です
$ PAGER=cat psql -U gamer games psql (9.1.0) "help" でヘルプを表示します. games=> select * from tvgames limit 10; name | plathome | company | price | release_date ------------------------------+----------+---------+-------+-------------- ドンキーコング | FC | 任天堂 | 4500 | 1983-07-15 ドンキーコングJR. | FC | 任天堂 | 4500 | 1983-07-15 ポパイ | FC | 任天堂 | 4500 | 1983-07-15 五目ならべ [連珠] | FC | 任天堂 | 4500 | 1983-08-27 麻雀 | FC | 任天堂 | 4500 | 1983-08-27 マリオブラザーズ | FC | 任天堂 | 4500 | 1983-09-09 ポパイの英語遊び | FC | 任天堂 | 4500 | 1983-11-22 ベースボール | FC | 任天堂 | 4500 | 1983-12-07 ドンキーコングJR. の算数遊び | FC | 任天堂 | 4500 | 1983-12-12 テニス | FC | 任天堂 | 4500 | 1984-01-14 (10 行) games=>
1983年はファミコンが発売されてから爆発的にヒットする直前です
psqlは PAGER環境変数に設定されたプログラムで selectの結果を表示します
デフォルトの less が一番使い勝手がよいですが ページ送りが不要な場合など cat を指定します
次に 1995年4月1日〜5月1日 の間に発売されたソフトの一覧を表示します between構文を使います
games=> select * from tvgames where release_date between '1995-4-1' and '1995-5-1'; name | plathome | company | price | release_date -------------------------------------------------------------+--------------------+------------------------------------------+-------+-------------- EMIT Vol.2〜命がけの旅〜 | SS | 光栄 | 8800 | 1995-04-01 EMIT Vol.3〜私にさよならを〜 | SS | 光栄 | 8800 | 1995-04-01 デイトナUSA | SS | セガ | 6800 | 1995-04-01 レディーストーカー〜過去からの挑戦〜 | SFC | タイトー | 9980 | 1995-04-01 Dの食卓 | 3DO | 三栄書房 | 8800 | 1995-04-01 蒼き伝説シュート! | GB | バンプレスト | 3980 | 1995-04-07 THE クイズ ギアファイト! | GG | セガ | 3800 | 1995-04-07 クイズ キング・オブ・ファイターズ | NG(CD) | ザウルス | 5800 | 1995-04-07 得点王3 | NG | SNK | 29800 | 1995-04-07 フォーメーションサッカー95 della セリエA | PCE(SCDR2)(AC対応) | ヒューマン | 9800 | 1995-04-07 全日本プロレス2 3・4武闘館 | SFC | 日本コンピュータシステム | 10800 | 1995-04-07 ドラえもん 友情伝説 | 3DO | 小学館 | 7800 | 1995-04-07 SD飛龍の拳外伝 | GB | カルチャーブレーン | 4700 | 1995-04-14 勝馬予想 競馬貴族EX'95 | GB | キングレコード | 6900 | 1995-04-14 ワールドヒーローズ2 | NG(CD) | ADK | 5800 | 1995-04-14 パチ夫くん パチンコランド大冒険 | PS | ココナッツジャパン | 6800 | 1995-04-14 柿木将棋 | SS | アスキー | 7800 | 1995-04-14 ぱずるんでス! | SFC | 日本物産 | 8980 | 1995-04-14 RES ARCANA | SFC | ココナッツジャパン | 9500 | 1995-04-14 EMIT Vol.1 時の迷子 | 3DO | 光栄 | 8800 | 1995-04-14 デビルズコース | 3DO | 松下電器 | 8800 | 1995-04-14 パドックノート’95 | 3DO | フジテレビジョン | 8800 | 1995-04-14 MYST | 3DO | マイクロキャビン | 7800 | 1995-04-14 Jリーグ ライブ'95 | GB | エレクトロニック・アーツ・ビクター | 5980 | 1995-04-21 カオティクス | 32X | SEGA | 7800 | 1995-04-21 餓狼伝説3 ROAD TO THE FINALVICTORY | NG | SNK | 32000 | 1995-04-21 ギャラクシーファイト UNIVERSAL WARRIORS | NG(CD) | サンソフト | 7800 | 1995-04-21 サイバーリップ | NG(CD) | SNK | 5800 | 1995-04-21 ファイヤースープレックス | NG(CD) | SNK | 5800 | 1995-04-21 ベースボールスターズプロフェッショナル | NG(CD) | SNK | 4800 | 1995-04-21 ロボアーミー | NG(CD) | SNK | 5800 | 1995-04-21 金沢将棋'95 | PS | セタ | 7900 | 1995-04-21 ママレード・ボーイ | SFC | バンダイ | 9800 | 1995-04-21 魔法陣グルグル | SFC | エニックス | 10800 | 1995-04-21 タクティカルサッカー | SFC | エレクトロニックアーツビクター | 9800 | 1995-04-21 なつきクライシスバトル | SFC | エンジェル | 10800 | 1995-04-21 真・聖刻 | SFC | ユタカ | 9800 | 1995-04-21 真SD戦国伝 大将軍列伝 | SFC | ベック | 9800 | 1995-04-21 スーパーリアル麻雀P5 パラダイス オールスター4人打ち | SFC | セタ | 9800 | 1995-04-21 リジョイス〜アレサ王国の彼方〜 | SFC | やのまん | 9900 | 1995-04-21 宮路社長のパチンコファン勝利宣言2 | SFC | POW | 9800 | 1995-04-21 スーパートランプコレクション | SFC | ボトムアップ | 8900 | 1995-04-21 紺碧の艦隊 | 3DO | 徳間書店 | 8800 | 1995-04-21 ぼのぐらし | 3DO | アミューズ/バンダイビジュアル | 8800 | 1995-04-21 ポリスノーツ パイロットディスク | 3DO | コナミ | 2980 | 1995-04-21 パズルボブル | NG(CD) | タイトー | 6800 | 1995-04-27 赤ずきんチャチャ | GB | トミー | 3900 | 1995-04-28 空想科学少年ガリバーボーイ 空想科学パズル プリッとポン | GB | バンダイ | 3980 | 1995-04-28 チキチキ天国 | GB | J・ウイング | 3900 | 1995-04-28 パチ夫くん3 | GB | ココナッツジャパン | 4800 | 1995-04-28 魔法陣グルグル 勇者とククリの大冒険 | GB | タカラ | 3980 | 1995-04-28 TEMPO Jr. | GG | セガ | 3800 | 1995-04-28 テイルスのスカイパトロール | GG | セガ | 3800 | 1995-04-28 テレビアニメスラムダンク 強豪真っ向対決! | MD | バンダイ | 8800 | 1995-04-28 トゥルーライズ | MD | アクレイムジャパン | 7800 | 1995-04-28 餓狼伝説3 ROAD TO THE FINALVICTORY | NG(CD) | SNK | 8800 | 1995-04-28 スロット勝負師 | PCE(SCDR2) | 日本物産 | 8500 | 1995-04-28 ガンナーズ ヘブン | PS | ソニー・コンピュータエンタテインメント | 5800 | 1995-04-28 ぐっすんおよよ | PS | エクシング | 6800 | 1995-04-28 ジャンピングフラッシュ!アロハ男爵ファンキー大作戦の巻 | PS | ソニー・コンピュータエンタテインメント | 5800 | 1995-04-28 ミスランド まちがい探しゲーム | PS | アルトロン | 5800 | 1995-04-28 ヴァーチャル ハイドライド | SS | セガ | 5800 | 1995-04-28 アイルトン・セナ パーソナルトーク〜Message for the future〜 | SS | セガ | 8800 | 1995-04-28 輝水晶伝説アスタル | SS | セガ | 5800 | 1995-04-28 三國志4 | SS | 光栄 | 14800 | 1995-04-28 スーパーボンバーマン3 | SFC | ハドソン | 8900 | 1995-04-28 スーパーパチンコ大戦 | SFC | バンプレスト | 6900 | 1995-04-28 牌勢麻雀 凌駕 | SFC | アスキー | 12800 | 1995-04-28 プラネットチャンプ TG3000 | SFC | ケムコ | 9500 | 1995-04-28 Jリーグエキサイトステージ'95 | SFC | エポック社 | 9800 | 1995-04-28 川のぬし釣り2 | SFC | パックインビデオ | 10800 | 1995-04-28 シミュレーションプロ野球 | SFC | ヘクト | 12800 | 1995-04-28 トゥルーライズ | SFC | アクレイムジャパン | 10900 | 1995-04-28 3次元格闘ボールズ | SFC | メディアリング | 9800 | 1995-04-28 タロットミステリー | SFC | ヴィジット | 9800 | 1995-04-28 初段位認定 初段プロ麻雀 | SFC | ギャップス | 9800 | 1995-04-28 バーチャルカメラマンPart3 | 3DO | ナグザット | 8800 | 1995-04-28 ワールドカップ スーパースタジアム | 3DO | テレビ東京/ギャガ・コミュニケーションズ | 6800 | 1995-04-28 (78 行) games=>
NeoGeoのロムの値段の高さにびっくりしますが スーパーファミコンも1万円越えなど結構な値段です
次に group by 構文を使った機種別ソフト本数の集計です
games=> select plathome, count( name ) from tvgames group by plathome; plathome | count -----------------------+------- GG | 196 SFC | 1391 PCE(SG) | 4 MCD | 110 PCE(SCDR2) | 235 NG(CD) | 99 FCD | 195 NG | 117 PCE(CDR2) | 92 32X | 18 GBC | 142 PS | 4439 SFC(NP) | 33 ARCADE CARD専用 | 12 N64 | 200 FC周辺ソフト | 9 SS | 1212 VB | 19 GB&GBC | 201 GB | 767 64DD | 7 ※バーコードボーイ同梱 | 1 3DO | 215 FC | 1042 PCE(SCDR2)(AC対応) | 16 PCE | 229 MD | 416 PCE(CDR2)(S対応) | 12 (28 行) games=>
最後に 複雑なクエリを実行して PostgreSQLのパフォーマンスを確認します
名称の先頭部分が一致することを条件にして 5作以上シリーズ化されているゲームを抜き出そうとしてます
例えば「ドラゴンクエスト」をベース名として「ドラゴンクエスト2」「ドラゴンクエスト3」…
を抜き出そうとしています
games=> select gbase.name, gelement.name, gelement.release_date, gelement.plathome, gelement.price from ( select distinct name from tvgames ) as gbase, tvgames gelement where octet_length( gbase.name ) > 3 and left( gelement.name, char_length( gbase.name ) ) = gbase.name and ( select count( name ) from tvgames gsub where gbase.name != gsub.name and left( gsub.name, char_length( gbase.name ) ) = gbase.name ) >= 4 order by gbase.name, gelement.release_date; 〜 悠久幻想曲 | 悠久幻想曲 Ensemble Vol.1 | 1998-12-10 | PS | 3800 悠久幻想曲 | 悠久幻想曲Ensemble Vol.2 | 1999-02-18 | PS | 3800 悠久幻想曲 | 悠久幻想曲 ensemble vol.2 | 1999-03-04 | SS | 3800 悠久幻想曲 | 悠久幻想曲 保存版 PerpetualCollection | 1999-10-14 | PS | 8800 悠久幻想曲 | 悠久幻想曲3 パーペチュアルブルー | 1999-12-22 | PS | 5800 遊戯王デュエルモンスターズ | 遊戯王デュエルモンスターズ | 1998-12-17 | GB | 4300 遊戯王デュエルモンスターズ | 遊戯王デュエルモンスターズ2 闇界決闘記 | 1999-07-08 | GB&GBC | 4500 遊戯王デュエルモンスターズ | 遊戯王デュエルモンスターズ3 三聖戦神降臨 | 2000-07-13 | GBC | 4500 遊戯王デュエルモンスターズ | 遊戯王デュエルモンスターズ4 最強決闘者戦記 海馬デッキ | 2000-12-07 | GBC | 4800 遊戯王デュエルモンスターズ | 遊戯王デュエルモンスターズ4 最強決闘者戦記 城之内デッキ | 2000-12-07 | GBC | 4800 遊戯王デュエルモンスターズ | 遊戯王デュエルモンスターズ4 最強決闘者戦記 遊戯デッキ | 2000-12-07 | GBC | 4800 (1749 行) games=> \\q $
1万レコードのテーブルを 2つ組み合わせて検索する高負荷な処理ですが
検証環境では実行時間は 61秒でした
驚くことに MySQLで同様の検索をしたときは 2分20秒だったのに比べ半分以下の時間となってます
PostgreSQLの最適化能力の高さが感じとれます
紹介は以上です PostgreSQLは機能としても高機能で
商用データベースである Oracleに決して見劣りしていないのではないでしょうか
IPv6サーバツールへ戻る
Postfixのインストール
Postfix 構築ログ
Postfix が 64bit + IPv6 環境で動作するかの検証です
CPU | PhenomII X4 905e (2.5GHz 4コア) |
---|---|
マザーボード | GA-880GM-USB3 |
メモリ | 16GB (DDR3-1066) |
イーサネット | Realtek8111D (R8168 GbE) |
Linuxカーネルバージョン | 3.0 (x86_64) |
GCC | 4.5.2 |
glibc | 2.13.1 |
BerkeleyDB | db-5.1.25.NC |
LDAP | OpenLDAP-2.4.23 |
Postfix | 2.9.2 |
SASL | Cyrus-SASL-2.1.25 |
インストール
まず前準備として 必要なアカウントを作成します
通常は postfix:postfix アカウント と postdrop グループを作成しますが
検証環境は Gentoo Stage3 ベースのシステムで既に mailアカウントが存在するのでこれを流用し
mail:mail アカウントは流用 maildrop グループを新設します
$ su
# groupadd -g 13 maildrop
# exit
$
$ su # groupadd -g 13 maildrop # exit $
13は GID(グループID)ですシステムで未割り当ての値を選定してください
グループの一覧は /etc/group で管理されています
では Postfix本体のインストールに入ります
ここから最新安定版のソースを取得して下記のようにインストールします
$ tar -xzf postfix-2.9.2.tar.gz $ cd postfix-2.9.2 $ make makefiles AUXLIBS='-lnsl' make -f Makefile.in MAKELEVEL= Makefiles (echo "# Do not edit -- this file documents how Postfix was built for your machine."; /bin/sh makedefs) >makedefs.tmp 〜 [src/tlsproxy] cat ../../conf/makedefs.out Makefile.in >Makefile rm -f Makefile; (cat conf/makedefs.out Makefile.in) >Makefile $
検証環境では AUXLIBSに -lnsl と -lresolv の記載が必要でした
make時に必要なライブラリがリンクされず 未解決シンボルエラーが出たためです
gcc -Wmissing-prototypes -Wformat -DHAS_PCRE -g -O -I. -I../../include -DLINUX3 -o sendmail sendmail.o ../../lib/libglobal.a ../../lib/libutil.a -L/usr/lib64 -lpcre -ldb ../../lib/libutil.a(dict_nis.o): In function `dict_nis_lookup': /home/admin/postfix-2.9.2/src/util/dict_nis.c:173: undefined reference to `yp_match' /home/admin/postfix-2.9.2/src/util/dict_nis.c:187: undefined reference to `yp_match' ../../lib/libutil.a(dict_nis.o): In function `dict_nis_init': /home/admin/postfix-2.9.2/src/util/dict_nis.c:81: undefined reference to `yp_get_default_domain' collect2: ld はステータス 1 で終了しました make: *** [sendmail] エラー 1 make: *** [update] エラー 1
環境によっては さらに -lresolv も必要かもしれません
コンパイルエラーが出た場合試してみてください
ビルドを続けます
$ make set -e; for i in src/util src/global src/dns src/tls src/xsasl src/milter src/master src/postfix src/fsstone src/smtpstone src/sendmail src/error src/pickup src/cleanup src/smtpd src/local src/trivial-rewrite src/qmgr src/oqmgr src/smtp src/bounce src/pipe src/showq src/postalias src/postcat src/postconf src/postdrop src/postkick src/postlock src/postlog src/postmap src/postqueue src/postsuper src/qmqpd src/spawn src/flush src/verify src/virtual src/proxymap src/anvil src/scache src/discard src/tlsmgr src/postmulti src/postscreen src/dnsblog src/tlsproxy; do 〜 gcc -Wmissing-prototypes -Wformat -DHAS_PCRE -g -O -I. -I../../include -DLINUX3 -o tlsproxy tlsproxy.o tlsproxy_state.o ../../lib/libtls.a ../../lib/libmaster.a ../../lib/libglobal.a ../../lib/libutil.a -L/usr/lib64 -lpcre -ldb -lnsl -lresolv cp tlsproxy ../../libexec $
ビルドは完了です 各種インストール条件は make install 時に対話式で設定できます
main.cf などの設定を上書きしない(バージョンアップのみの)場合は make upgrade と打ちます
$ su # make install 〜 Warning: if you use this script to install Postfix locally, this script will replace existing sendmail or Postfix programs. Make backups if you want to be able to recover. Before installing files, this script prompts you for some definitions. Most definitions will be remembered, so you have to specify them only once. All definitions should have a reasonable default value. Please specify the prefix for installed file names. Specify this ONLY if you are building ready-to-install packages for distribution to OTHER machines. See PACKAGE_README for instructions. install_root: [/] (何も入力せずEnter) Please specify a directory for scratch files while installing Postfix. You must have write permission in this directory. tempdir: [/home/admin/postfix-2.9.2] (何も入力せずEnter) Please specify the final destination directory for installed Postfix configuration files. config_directory: [/etc/postfix] (何も入力せずEnter) Please specify the final destination directory for installed Postfix administrative commands. This directory should be in the command search path of adminstrative users. command_directory: [/usr/sbin] (何も入力せずEnter) Please specify the final destination directory for installed Postfix daemon programs. This directory should not be in the command search path of any users. daemon_directory: [/usr/libexec/postfix] (何も入力せずEnter) Please specify the final destination directory for Postfix-writable data files such as caches or random numbers. This directory should not be shared with non-Postfix software. data_directory: [/var/lib/postfix] /var/db/postfix Please specify the destination directory for the Postfix HTML files. Specify "no" if you do not want to install these files. html_directory: [no] (何も入力せずEnter) Please specify the owner of the Postfix queue. Specify an account with numerical user ID and group ID values that are not used by any other accounts on the system. mail_owner: [postfix] mail Please specify the final destination pathname for the installed Postfix mailq command. This is the Sendmail-compatible mail queue listing command. mailq_path: [/usr/bin/mailq] (何も入力せずEnter) Please specify the destination directory for the Postfix on-line manual pages. You can no longer specify "no" here. manpage_directory: [/usr/local/man] /usr/share/man Please specify the final destination pathname for the installed Postfix newaliases command. This is the Sendmail-compatible command to build alias databases for the Postfix local delivery agent. newaliases_path: [/usr/bin/newaliases] (何も入力せずEnter) Please specify the final destination directory for Postfix queues. queue_directory: [/var/spool/postfix] (何も入力せずEnter) Please specify the destination directory for the Postfix README files. Specify "no" if you do not want to install these files. readme_directory: [no] (何も入力せずEnter) Please specify the final destination pathname for the installed Postfix sendmail command. This is the Sendmail-compatible mail posting interface. sendmail_path: [/usr/sbin/sendmail] (何も入力せずEnter) Please specify the group for mail submission and for queue management commands. Specify a group name with a numerical group ID that is not shared with other accounts, not even with the Postfix mail_owner account. You can no longer specify "no" here. setgid_group: [postdrop] maildrop Updating /ram/libexec/postfix/anvil... Updating /ram/libexec/postfix/bounce... Updating /ram/libexec/postfix/cleanup... Updating /ram/libexec/postfix/discard... Updating /ram/libexec/postfix/dnsblog... 〜 Updating /ram/share/man/man8/trace.8... Updating /ram/share/man/man8/trivial-rewrite.8... Updating /ram/share/man/man8/verify.8... Updating /ram/share/man/man8/virtual.8... Warning: you still need to edit myorigin/mydestination/mynetworks parameter settings in /etc/postfix/main.cf. See also http://www.postfix.org/STANDARD_CONFIGURATION_README.html for information about dialup sites or about sites inside a firewalled network. BTW: Check your /etc/aliases file and be sure to set up aliases that send mail for root and postmaster to a real person, then run /usr/bin/newaliases. #
各質問に対して ターゲットシステムの環境に応じて パラメータを設定していきます
何も入力せずに Enter を押すと大括弧で括られたデフォルト値が選択されます
質問が終わったらファイルがコピーされて 更新ファイルも画面上で分かるようになっています
syslogへの設定も行います 検証環境では syslog-ngを利用しているので
syslog-ng.conf に下記の設定を追加します
destination mail { file("/var/log/mail.log"); }; destination mailinfo { file("/var/log/mail.info"); }; destination mailwarn { file("/var/log/mail.warn"); }; destination mailerr { file("/var/log/mail.err"); }; filter f_mail { facility(mail); }; log { source(src); filter(f_mail); destination(mail); }; log { source(src); filter(f_mail); filter(f_info); destination(mailinfo); }; log { source(src); filter(f_mail); filter(f_warn); destination(mailwarn); }; log { source(src); filter(f_mail); filter(f_err); destination(mailerr); };
最後に Linuxシステムで Postfixを制御するための start/stopスクリプトを手動で作成します
(通常 Linuxディストリビューションのパッケージインストールすれば 自動作成されているはず)
検証環境は Gentooベースのシステムのため /etc/init.d/postfix を以下の内容で作成しました
(スクリプトへの実行権限の付与を忘れずに)
#!/sbin/runscript # Copyright 1999-2004 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header$ depend() { need net.eth0 } start() { ebegin "Starting Postfix" /usr/sbin/postfix start eend $? } stop() { ebegin "Stopping Postfix" /usr/sbin/postfix stop eend $? }
以上のインストール過程は IPv4 IPv6 32bit 64bit いずれの環境でも同じ手順でした
ただし 後半になりますが SMTP AUTH化 TLS化 するためにオプションを追加再ビルドします
設定
Postfixサーバの動作設定を行います 主に /etc/postfix/main.cf が設定対象です
ここで IPv6に関する設定も行います 下記は修正箇所とその説明です
inet_protocols = ipv6
inet_interfaces = loopback-only
inet_protocols = ipv6 inet_interfaces = loopback-only
ネットワーク設定です 検証環境のため IPv6のみを扱うという強気な設定です
通常は inet_protocols = all と IPv4 IPv6 両方喋るようにします
inet_interfacesは メール配送要求を受け付けるインターフェースを指定します
まずはローカルからのみ配送を受けるため loopback-only を指定しています
(loopback-only は IPv6へも対応しています)
myhostname = phenom.mydomain mydomain = mydomain myorigin = $mydomain append_at_myorigin = yes append_dot_mydomain = no
メールサーバの名称と ローカルドメインの設定です
検証環境では mydomain というローカルなドメイン名を設定しています
たとえ自分が 独自ドメインを取得していようともとりあえずローカルなドメイン名を設定します
(独自ドメインは masquerade_domains で設定できるため)
myoriginは ローカル配送するメールについて送信元のドメイン部分に付与される名称です
今回 $mydomain としているためここでの例では アカウント@mydomain というアドレスになります
デフォルトの $myhostname を指定すると アカウント@phenom.mydomain アドレスになります
append_at_myorigin と append_dot_mydomain はメールアドレス操作(修正)機能です
append_at_myorigin は ドメイン部分のない宛先に $myorigin を追加します
(例えば admin 宛のメールは admin@mydomain 宛のメールに宛先修正されます 通常これは必須)
append_dot_mydomain は ドメイン部分がホスト名のみの場合 $mydomain を追加します
(例えば admin@phenom 宛のメールは admin@phenom.mydomain 宛のメールに宛先修正されます)
mydestination = $myhostname, localhost.$mydomain, localhost
ローカル配送対象となる 宛先ドメインの設定です
宛先ドメインが 指定ドメインのいずれかであればローカル配送が行われます
Postfixでは $myhostnameは必須で あとは localhost(::1)を追加しています
relayhost = relay_domains =
リレー(メール転送)の設定ですが
ローカル配送のみとし転送自体を禁止するため relay_domains を空としています
外部へのメールやりとりが必要になったら設定します
home_mailbox = Maildir/ #mail_spool_directory = /var/spool/mail
ローカル配送時のメールボックスのフォーマット指定です
上記のように / を最後に使うと Maildir方式(1メール1ファイル)となります
この場合 ~/Maildir/ 配下に保存されることになります
mail_spool_directory は指定しません
これを指定すると メールスプール方式という最古の方式となり
/var/spool/mail/ にアカウント毎のメールファイル(1ファイル中に複数メールが含まれる)が作られます
メールのローカル配送方式が 3種類あるので紹介しておきます
メールスプール方式 | インターネット黎明期のメール配送方式 /var/mail/ユーザ名/ に単一のメールスプールファイルを置いて 配送されてきたメールはそのファイルに追記 |
---|---|
mbox形式 | ホームディレクトリ ~/ にメールスプールファイルを置く Sendmailで主に使われていた |
Maildir形式 | ホームディレクトリに Maildir/ などの専用ディレクトリを置いて 1メール=1ファイル で格納する最近の方式 スプールほどファイルを占有する必要がなく複数の MTA MUA(IMAPなど) と共用させやすい 専用のメールサーバを立てる場合 iノードの枯渇に注意する必要がある |
alias_maps = hash:/etc/postfix/aliases alias_database = $alias_maps
最後にエイリアスの設定です
エイリアスとはメール転送機能で 特定の宛先のローカル配送に対して 別の宛先に転送します
ここもカスタマイズしています
通常は /etc/aliases を設定するケースが多いのですが postfixディレクトリを指定しています
これにより newaliasesコマンドにより /etc/postfix/aliases.db が作成されます
aliases の作成については後述します
ひとまず main.cf の修正を終えたので内容をチェックします
# postconf -n alias_database = $alias_maps alias_maps = hash:/etc/postfix/aliases append_at_myorigin = yes append_dot_mydomain = no command_directory = /usr/sbin config_directory = /etc/postfix daemon_directory = /usr/libexec/postfix data_directory = /var/db/postfix debug_peer_level = 2 home_mailbox = Maildir/ html_directory = no inet_interfaces = loopback-only inet_protocols = ipv6 mail_owner = mail mailq_path = /usr/bin/mailq manpage_directory = /usr/share/man mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain mydomain = mydomain myhostname = phenom.mydomain myorigin = $mydomain newaliases_path = /usr/bin/newaliases queue_directory = /var/spool/postfix readme_directory = no relay_domains = relayhost = sample_directory = /etc/postfix sendmail_path = /usr/sbin/sendmail setgid_group = maildrop unknown_local_recipient_reject_code = 550 # postfix check #
設定ファイルの誤りがあれば postfix check 時にメッセージが表示されます
設定に問題がなければ Postfixを起動します
# /etc/init.d/postfix start * Caching service dependencies ... [ ok ] * Starting Postfix ... postfix/postfix-script: starting the Postfix mail system [ ok ] #
起動していれば netstat -a コマンドで TCP/SMTPのポートが開いていることが確認できます
$ netstat -a | grep smtp tcp6 0 0 localhost:smtp [::]:* LISTEN unix 2 [ ACC ] STREAM LISTENING 494568 private/smtp $
/etc/postfix/alaises への転送設定も追加しておきましょう
root: admin
root宛へのメールを (普段ログインする)admin宛へ転送するための設定を追加しました
下記コマンドで aliases.db へ反映します
$ su # newaliases # ls -l /etc/postfix/aliases* -rw-r--r-- 1 root root 8841 8月 28 17:38 /etc/postfix/aliases -rw-r--r-- 1 root root 12288 9月 4 09:22 /etc/postfix/aliases.db #
では ローカル配送の試験を行ってみます telnet コマンドで SMTPプロトコルを直接流し込みます
$ telnet -6 localhost 25 Trying ::1... Connected to localhost. Escape character is '^]'. 220 phenom.mydomain ESMTP Postfix EHLO mydomain 250-phenom.mydomain 250-PIPELINING 250-SIZE 10240000 250-VRFY 250-ETRN 250-ENHANCEDSTATUSCODES 250-8BITMIME 250 DSN MAIL FROM: root@mydomain 250 2.1.0 Ok RCPT TO: admin@mydomain 250 2.1.5 Ok DATA 354 End data with. test mail . 250 2.0.0 Ok: queued as 0250E24060 QUIT 221 2.0.0 Bye Connection closed by foreign host. $ su # tail -f /var/log/mail.log 〜 Apr 28 13:45:33 phenom postfix/smtpd[3986]: connect from localhost[::1] Apr 28 13:49:25 phenom postfix/smtpd[3986]: 0250E24060: client=localhost[::1] Apr 28 13:49:45 phenom postfix/cleanup[4023]: 0250E24060: message-id=<20120428134925.0250E24060@phenom.mydomain> Apr 28 13:49:45 phenom postfix/qmgr[3924]: 0250E24060: from= , size=286, nrcpt=1 (queue active) Apr 28 13:49:45 phenom postfix/local[4025]: 0250E24060: to= , relay=local, delay=38, delays=38/0/0/0.01, dsn=2.0.0, status=sent (delivered to maildir) Apr 28 13:49:45 phenom postfix/qmgr[3924]: 0250E24060: removed Apr 28 13:50:45 phenom postfix/smtpd[3986]: disconnect from localhost[::1] #
SMTPは TCP/25ポートを使います
MAIL FROM: や RCPT TO: で送信元や宛先を指定し
DATA で本文を記載します 本文の終了として . ピリオドのみの行を入力します
telnet後は mail.logでも 正常にローカル配送されたことが記録されています
メールも確かに adminアカウント宛に配送されていました
Return-Path:X-Original-To: admin@mydomain Delivered-To: admin@mydomain Received: from mydomain (localhost [IPv6:::1]) by phenom.mydomain (Postfix) with ESMTP id 0250E24060 for ; Sat, 28 Apr 2012 13:49:07 +0000 (UTC) Message-Id: <20120428134925.0250E24060@phenom.mydomain> Date: Sat, 28 Apr 2012 13:49:07 +0000 (UTC) From: root@mydomain test mail
(書きかけ)
LAN内からの SMTP送信を受け付ける
IPv6による SMTP接続が動作することまで確認しました
次は localhost以外の 自宅LANからの接続を許可するように設定します
main.cf の設定変更箇所は下記の通りです
inet_interfaces = all
inet_interfaces = all
loopback-only から all に変更するだけです
Postfixを再起動してテストします Sylpheedメーラを別ホストから試します
# /etc/init.d/postfix restart * Stopping Postfix ... postfix/postfix-script: stopping the Postfix mail system [ ok ] * Starting Postfix ... postfix/postfix-script: starting the Postfix mail system [ ok ] # netstat -a | grep smtp tcp6 0 0 [::]:smtp [::]:* LISTEN unix 2 [ ACC ] STREAM LISTENING 498865 private/smtp #
Sylpheedの設定画面を開いたところです
SMTPはデフォルトの 25番のままです SSLも設定しません
普通にメールを記述して 送信すると
Return-Path:X-Original-To: admin@mydomain Delivered-To: admin@mydomain Received: from turion.mydomain (turion.mydomain [IPv6:fe80::2***:****:***2]) by phenom.mydomain (Postfix) with ESMTP id 90A7824061 for ; Sat, 28 Apr 2012 14:23:17 +0000 (UTC) Date: Sun, 22 Apr 2012 01:42:58 +0900 From: テスト To: admin@mydomain Subject: テストメール Message-Id: <20120422014258.c87c82dd.admin@******.com> X-Mailer: Sylpheed 3.1.3 (GTK+ 2.19.0; i686-pc-linux-gnu) Mime-Version: 1.0 Content-Type: text/plain; charset=ISO-2022-JP Content-Transfer-Encoding: 7bit テストです
正常に送信できています
SMTP AUTHに対応する
次の段階として SMTP AUTH を導入します
SMTP AUTHにより SMTP接続時に アカウント/パスワードでの認証が必須となり
未認証の SMTP接続はメールが送信できません
これにより メールサーバが不正中継の土台となってしまう事態を防ぎます
将来メールサーバをインターネットに接続する際に必須といえる仕組みです
認証基盤(アカウント パスワードの管理)として
SASL(Simple Authentication Security Layer) が使えます
ここでは Cyrus-SASL のインストール手順にあわせて BerkeleyDB5対応も行います
$ tar -xzf cyrus-sasl-2.1.25.tar.gz
$ cd cyrus-sasl-2.1.25
$
$ tar -xzf cyrus-sasl-2.1.25.tar.gz $ cd cyrus-sasl-2.1.25 $
configureを始める前に BerkeleyDB5対応のための変更を行います
configureスクリプトの内容を書き換えて libdb-5.1.so をリンクするようにします
7233 7234 saved_LIBS=$LIBS 7235 for dbname in ${with_bdb} db-5.1 db-4.7 db4.7 db47 db-4.6 db4.6 db46 db-4.5 db4.5 db45 db-4.4 db4.4 db44 db-4.3 db4.3 db43 db-4.2 db4.2 db42 db-4.1 db4.1 db41 db-4.0 db4.0 db-4 db40 db4 db-3.3 db3.3 db33 db-3.2 db3.2 db32 db-3.1 db3.1 db31 db-3 db30 db3 db 7236 do 7237 LIBS="$saved_LIBS -l$dbname" 7238 cat >conftest.$ac_ext <<_ACEOF
7235行目で dbのバージョン候補を指定して検索しているので
候補の最初に db-5.1 を追加します これで libdb-5.1.so を掴んでくれます
BerkeleyDBの関数に正しい引数を渡す必要があります
sasldb/db_berkeley.c も編集が必要です 変更箇所は 104行目です
104 #if DB_VERSION_MAJOR >= 5 || DB_VERSION_MINOR >= 1 105 ret = (*mbdb)->open(*mbdb, NULL, path, NULL, DB_HASH, flags, 0660); 106 #else 107 ret = (*mbdb)->open(*mbdb, path, NULL, DB_HASH, flags, 0660); 108 #endif
utils/dbconverter-2.c も編集します 217行目を同様に変更します
217 #if DB_VERSION_MAJOR >= 5 || DB_VERSION_MINOR >= 1 218 ret = (*mbdb)->open(*mbdb, NULL, path, NULL, DB_HASH, DB_CREATE, 0664 ); 219 #else 220 ret = (*mbdb)->open(*mbdb, path, NULL, DB_HASH, DB_CREATE, 0664); 221 #endif
$ ./configure --prefix=/usr --enable-static=yes --enable-java --enable-ntlm --enable-login --enable-ldapdb --with-ldap=/usr --enable-sql configure: creating cache ./config.cache checking build system type... x86_64-unknown-linux-gnu checking host system type... x86_64-unknown-linux-gnu 〜 config.status: creating saslauthd.h config.status: executing depfiles commands Configuration Complete. Type 'make' to build. $ make make all-recursive make[1]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25' に入ります Making all in include 〜 make[2]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25' に入ります make[2]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25' から出ます make[1]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25' から出ます $ su # make install Making install in include make[1]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25/include' に入ります make[2]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25/include' に入ります 〜 make[2]: `install-data-am' に対して行うべき事はありません. make[2]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25' から出ます make[1]: ディレクトリ `/home/admin/cyrus-sasl-2.1.25' から出ます #
saslauthd sasldblistusers2 saslpasswd2 といったコマンドが使えるようになります
Cyrus-SASLが入ったら Postfixの方も対応するために再ビルドが必要です
再度ビルドディレクトリで 下記のように実施してください
$ make clean 〜 $ make makefiles CCARGS='-DUSE_SASL_AUTH -DUSE_CYRUS_SASL -DUSE_TLS -I/usr/include/sasl' AUXLIBS='-lsasl2 -lssl -lnsl' 〜 $ make 〜 $ su # make upgrade 〜 #
Cyrus-SASLを利用するためのオプションと TLSを利用するためのオプションも追加しています
Cyrus-SASLの設定に話を戻します
ここでは sasldb形式の認証データベースと LDAP形式の認証データベースを両方試します
まず sasldb形式から 下記コマンドでデータベースを作れます
# saslpasswd2 -c -u testtest.com mailtest Password: パスワードを入力 Again (for verification): 同じパスワード # chown mail /etc/sasldb2 # ls -l /etc/sasldb2 -rw-r----- 1 mail root 12288 4月 29 01:12 /etc/sasldb2 #
/etc/sasldb2 ができます これは BerkeleyDB形式のデータベースです
また Postfix smtpd から読み書きできるよう mailオーナーに変更しています
-u オプションでドメインを指定しています
# sasldblistusers2 mailtest@testtest.com: cmusaslsecretOTP mailtest@testtest.com: userPassword #
sasldblistusers2 で登録済アカウントを確認できます
sasldb形式を Postfixで扱えるよう /usr/lib/sasl2/smtpd.conf を作成します
pwcheck_method: auxprop auxprop_method: sasldb mech_list: cram-md5 digest-md5 plain login
Postfix側 main.cf には下記のように設定を追加します
smtpd_sasl_auth_enable = yes smtpd_sasl_local_domain = testtest.com smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination
smtpd_sasl_local_domain には saslpasswd2の時と同じドメインを指定します
設定後 Postfixをリスタートしましょう
Sylpheed側は メール送信の設定を変更する必要があります
SMTP AUTHを有効にして sasldbに登録したアカウントパスワードを設定します
これで SMTP AUTH化は完了です
SMTP AUTHのチェックを外すと メール送信ができないことも確認しましょう
検証環境では OpenLDAPを使っているので
認証基盤を sasldbから 本命の LDAPに切り替えます
OpenLDAPは設定済でメール用アカウントパスワードが下記のように登録済とします
dn: uid=mailtest,ou=People,dc=local objectClass: top objectClass: posixAccount objectClass: account objectClass: postLdapAdmin uid: mailtest cn: MyName uidNumber: 500 gidNumber: 100 homeDirectory: /home/admin loginShell: /usr/bin/bash userPassword:: **************== gecos: MyName mail: admin@testtest.com mailDirectory: /home/admin/Maildir
Cyrus-SASLで sasldb以外のデーターベースを使うには saslauthdが必要です
まず /usr/etc/saslauthd.conf を下記のように設定します
ldap_servers: ldap://localhost ldap_bind_dn: cn=Manager, dc=mydomain ldap_password: ******** ldap_search_base: ou=People,dc=testest,dc=com ldap_filter: (&(uid=%u)(objectClass=posixAccount))
ldap_bind_dn には データベースにアクセスするための LDAPユーザを指定します
(本当は Managerアカウントでなく 読み出し用アカウントを作るべきです)
設定完了したら saslauthdを起動しましょう
# saslauthd -a ldap #
/usr/lib/sasl2/smtpd.conf を saslauthd に向くように設定変更します
pwcheck_method: saslauthd mech_list: digest-md5 plain login
cram-md5 を入れると認証に失敗するようなので削除しています
Sylpheed側には LDAPに登録したアカウントパスワードを設定すれば
sasldbと同じようにメールが送れるはずです
LDAPデータベースが使えたら /etc/sasldb2 は不要になります
saslauthd はシステム起動時に自動起動するようにしておきましょう
TLS化する
SMTP AUTHを導入しましたが
インターネットにサーバ公開することを考えたら まだセキュリティに不安です
通信経路を暗号化するSSLを導入しましょう
OpenSSLがあれば 秘密鍵 と サイト証明書 が作れます
# openssl genrsa -des3 -out ./postfix.pem 2048
Generating RSA private key, 2048 bit long modulus
.........................+++
...+++
e is 65537 (0x10001)
Enter pass phrase for ./postfix.pem:適当なパスワード
Verifying - Enter pass phrase for ./postfix.pem:同じパスワード
# openssl rsa -in ./postfix.pem -out /usr/etc/ssl/private/postfix.pem
Enter pass phrase for /ram/postfix.pem:同じパスワード
writing RSA key
# rm ./postfix.pem
#
# openssl genrsa -des3 -out ./postfix.pem 2048 Generating RSA private key, 2048 bit long modulus .........................+++ ...+++ e is 65537 (0x10001) Enter pass phrase for ./postfix.pem:適当なパスワード Verifying - Enter pass phrase for ./postfix.pem:同じパスワード # openssl rsa -in ./postfix.pem -out /usr/etc/ssl/private/postfix.pem Enter pass phrase for /ram/postfix.pem:同じパスワード writing RSA key # rm ./postfix.pem #
1回目のコマンドは秘密鍵(パスワード付)の作成
2回目のコマンドで鍵のパスワードを解除し 本命のディレクトリに出力
次のコマンドで 自己証明書を作成します
# openssl req -new -x509 -key /usr/etc/ssl/private/postfix.pem -out /usr/etc/ssl/certs/postfix.pem You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:JP State or Province Name (full name) [Some-State]:Tokyo Locality Name (eg, city) []:Ekoda-ku Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyDomain Organizational Unit Name (eg, section) []:Home Common Name (eg, YOUR name) []:MyName Email Address []:admin@mydomain #
署名情報は適当でかまいません (公的認証局に登録するようなものでないので)
ファイル名や拡張子も 各システムのポリシーに従って変えてもかまいません
鍵ができたので Postfixの設定を行います main.cf に下記行を追加します
# TLS smtpd_use_tls = yes smtpd_tls_key_file = /usr/etc/ssl/private/postfix.pem smtpd_tls_cert_file = /usr/etc/ssl/certs/postfix.pem smtpd_tls_session_cache_database = btree:/etc/postfix/smtpd_tls_scache smtpd_tls_loglevel = 1
smtpd_tls_loglevel は必要な詳細度に応じて 0〜4 の値に調整してください
また TCPポート番号が変わるため master.cf への修正も必要です
#smtp inet n - n - - smtpd smtps inet n - n - - smtpd -o smtpd_tls_wrappermode=yes -o smtpd_sasl_auth_enable=yes -o smtpd_client_restrictions=permit_sasl_authenticated,reject -o milter_macro_daemon_name=ORIGINATING
smtp(TCP/25)の行をコメントアウトして smtps(TCP/465) の行を有効にするだけです
Postfixを再起動したら ポート番号465が開いているのが確認できるはずです
# netstat -a | grep urd tcp6 0 0 [::]:urd [::]:* LISTEN #
Sylpheed等メールクライアントの設定を変えます
「SSLを使用」にチェックを入れるだけです
高度な設定タブでは 送信ポート番号が 465番に変わっていることがわかります
初回メール送信で証明書の確認が求められますが 暗号化が完了したことが確認できます
インターネットへの接続
Postfixの IPv6動作は前半で完了し 認証や通信暗号化も行いました
最後の仕上げにインターネットへの接続も行います
外部ドメイン宛のメールをインターネットに飛ばす設定
Postfixの main.cf に下記更新を行います
inet_protocols = all
mydomain = testtest.com
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, mydomain
relayhost = [smtp.*****.ocn.ne.jp]:25
smtp_bind_address = 192.168.0.254
inet_protocols = all mydomain = testtest.com mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, mydomain relayhost = [smtp.*****.ocn.ne.jp]:25 smtp_bind_address = 192.168.0.254
inet_protocols = all で IPv4も許可する設定としました
外出中メールを送信したいとき 自宅の PostfixにIPv4でつなげるためです
(早く IPv6が普及してほしい)
残りの設定は 外部ドメイン宛のメールをインターネットに飛ばす設定です
mydestination に該当しない宛先は relayhostにメールを配送する設定を行います
mydomain に独自ドメインがあればそれを設定します
relayhost は外部への飛ばし先ですが プロバイダが用意しているサーバを利用します
(MX検索を抑止するため 大括弧[]で括る必要があります)
smtp_bind_address は自サーバのインターフェースアドレスを指定します
ブロードバンドルータには上記の設定を入れました
IMAP接続用に ポート10993番を開けて IMAPサーバの993番に転送します
SMTP接続用に ポート10465番を開けて SMTPサーバの465番に転送します
これでメール受信送信が 外出中から可能になります
便利になる反面 セキュリティの確保にも十分注意する必要があります
IPv6サーバツールへ戻る
UQ WiMAX 導入
WiMAXとは
無線通信の規格です 最大40Mbps(上り方向は10Mbps)まで出ます
Wi-Fiとは別の規格のため 専用通信装置が必要ですが
上記の通り ルータが提供されていたり WiMAX内蔵のノートPCもあります
プラン | 長所 | 短所 | 月額(およそ) |
---|---|---|---|
公衆無線LAN | 安い ファーストフード店や空港や鉄道の単位でアクセスポイントが敷かれている |
カバーエリアが狭い(事業者同士でアクセスポイントを共有する工夫も見られるが) | 0円〜1800円 FONという無線LANを相互提供する仕組みもあります |
3G(携帯) | カバーエリアが広い(携帯通信なので) | 値段が高い 携帯端末以外をインターネットにつなげられない(最近 テザリングサービスも出てきているので改善傾向かも) |
4500円(定額の場合) |
イーモバイル | カバーエリアが広い テザリングに対応している |
4580円(2年縛りプラン) | |
WiMAX | 速度が速い カバーエリアが広い テザリングに対応している 1契約で 3台まで端末が持てる |
電話サービスがない | 3880円(1年縛り) |
LTE(NTTドコモ Xi) | 速度が速い(最大 75Mbps) 低遅延 |
サービス始まったばかりでエリアが狭い | 4935円(2年縛りプラン) |
TD-LTE(WCP XGP) | 未調査 | 未調査 | サービスが始まっていない |
LTE(KDDI) | 未調査 | 未調査 | サービスが始まっていない |