2014年12月1日月曜日

rsyslog 複数のポートで待ち受けるには

ログサーバとしてrsyslogを稼動させる時に、複数のポートで待ち受けしてみようというのが今回の内容です。
#検証は、CentOS6.6 + rsyslog-8.5.0で行っています


TCPの514ポートと5140ポートで待ちうけをする場合は、rsyslog.confを以下のように編集します。
module(load="imtcp")
input(type="imtcp" port="514")
input(type="imtcp" port="5140")

編集完了後にrsyslogをrestartし、状態を確認すると以下のようになります。
# netstat -antup | grep rsyslog
tcp        0      0 0.0.0.0:5140    0.0.0.0:*   LISTEN      1333/rsyslogd
tcp        0      0 0.0.0.0:514     0.0.0.0:*    LISTEN      1333/rsyslogd
#


※UDPでも同様の方法で設定できます。

2014年11月15日土曜日

rsyslog + MySQL 特定ホストだけMySQLへの出力を停止するには

以前、シスログをMySQLへ書き出す「rsyslog + MySQL」という記事を書きました。
今回はその記事に少し内容をプラスしてみます。

・ログサーバで、リモートから受け取ったログをファイルとして保存する以外に、MySQLにも保存している
・非常に大量のログを出力するホストがいるが、そのホストからのシスログだけMySQLには出力したいくない

といったシナリオを実現させる方法について2つピックアップしてみます。
※評価は、CentOS6.6 + rsyslogのver8.5.0で行っています


ファシリティで除外する方法


ログを送ってくる側でファシリティを指定できるのであれば、そのファシリティだけMySQLに出力されないようにするのがお手軽です。
*.*;local4.none     :ommysql:localhost,Syslog,rsyslog,PASSWORD


アクションで除外する方法


記述は面倒になりますが、以下のように記述する事で192.168.233.100と192.168.233.101から送られてくるシスログはMySQLへは出力されなくなります。
この場合のキモは”stop”の記述で、それ以降のログ出力の停止、つまりMySQLへのログ出力を停止する事ができます。

$template STOPSQL, "/var/log/%fromhost%/%$year%%$month%%$day%.log"

if \
  ( $fromhost-ip == '192.168.233.100' or \
   $fromhost-ip == '192.168.233.101' ) \
then {
        action(type="omfile"
          DirCreateMode="0750"
          DirGroup="logadmin"
          FileCreateMode="0640"
          FileOwner="logadmin"
          dynaFile="STOPSQL")
        stop
}

*.*     :ommysql:localhost,Syslog,rsyslog,PASSWORD

(備考)
actionとしてomfileを指定する場合、2つ注意することがあります。

1.DirCreateModeやFileCreateModeなどパーミッションに関連するパラメータは、全体に適用されるようにグローバルで指定してあったとしても、上記のように改めて指定する必要があります
2.さらに出力されるファイルの指定(上記だとdynaFileの行)は、一番最後に指定する必要があります

2014年11月5日水曜日

CentOS 7(RHEL7) でIPエイリアスの操作

CentOS7(RHEL7)になってネットワーク周りの設定もだいぶお作法が変わってきました。
今回はタイトルの通り、IPエイリアスの操作についてです。



一時的な(手動による)操作

※書式を確認するときは、ip addr helpとします
IPアドレス、ネットマスク、インターフェース名はお使いの環境にあわせて適宜読みかえてください

<追加時>
# ip addr add 192.168.233.8/24 dev ens32

<削除時>
# ip addr del 192.168.233.8/24 dev ens32

※追加作業後にIPアドレスを確認すると、ens32のセカンダリアドレスとして登録されている事が確認できます。
# ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:7e:2f:54 brd ff:ff:ff:ff:ff:ff
    inet 192.168.233.7/24 brd 192.168.233.255 scope global ens32
       valid_lft forever preferred_lft forever
    inet 192.168.233.8/24 brd 192.168.233.255 scope global secondary ens32
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe7e:2f54/64 scope link
       valid_lft forever preferred_lft forever
#


恒久的な操作

※上記1.の方法だと再起動すると追加した設定は消えてしまいます。
  恒久的に保存するにはいくつか方法がありますが、今回はnmtui-editコマンドを使ってみる事にします。
 →この操作で/etc/sysconfig/network-scripts/ifcfg-<interface名>に
   IPADDR1PREFIX1として追加されます


1.nmtui-editコマンドを実行します。
 ※もし書式が崩れるようであれば、 LANG=C nmtui-edit と実行してください

2.IPエイリアスを追加するインターフェースを選択後、[TAB]キーで<Edit...>にカーソルを合わせEnterを押します。










3.次に現在インターフェースに設定されているIPアドレスの下にある<Add...>にカーソルを合わせてEnterを押します。






4.IPエイリアスの設定を追加します。
  追加後、画面右下の<OK>にカーソルを合わせてEnterを押します。







5.一番最初の画面に戻るので、画面右下の<Quit>にカーソルを合わせてEnterを押します。















以上で、OSを再起動しても設定したIPエイリアスが消える事はありません。

2014年11月3日月曜日

CentOS7(RHEL7) デフォルトで起動するkernelを変更するには

CentOS7(RHEL7)になってブートローダーがGRUB2になりました。

kernelのセキュリティアップデートなどで新しいkernelをインストール & リブートして、新しいkernelで起動していると思ったら古いままだったいう事はありませんか?

本来、期待するところとしてはGRUBの時のように、ほっといても一番最新のkernelが起動してくる事です。

ところが(どういった理由でその状態になるかは調べてませんが)、下記のようにmenuentryが登録された場合、OS起動時にデフォルトで起動してくるのは、1番上のkernel(1番古いkernel)になります。

# grep ^menuent /boot/grub2/grub.cfg | awk -F\' '{ print $2 }'
CentOS Linux, with Linux 3.10.0-123.el7.x86_64 <-最も古いkernel
CentOS Linux, with Linux 3.10.0-123.6.3.el7.x86_64  <-最新のkernel
CentOS Linux, with Linux 3.10.0-123.4.4.el7.x86_64
CentOS Linux, with Linux 3.10.0-123.4.2.el7.x86_64
CentOS Linux, with Linux 0-rescue-09cc85c5693c44fe999137f3ea268654
#

前置きが長くなりましたが、今回はこの例のようにmenuentryがきれいに並んでくれなかった場合に、デフォルトで起動するkernelを任意に指定する方法について3つピックアップしてみます。


1./etc/default/grubのGRUB_DEFAULTに起動するkernelの番号を渡す方法
 
‐ /etc/grub2.confなりで先頭がmenuentryから始まる行を確認する
 - 起動するkernelを番号で指定する 
   -> 最初のmenuentryを0(ゼロ)として上から順に扱われる
   -> 上記の前置きでgrepしたmenuentryの例では、一番最新のkernelで起動するなら"GRUB_DEFAULT=1"と指定する
 - 編集が完了後、以下のコマンドでgrub.cfgを生成し直す
  ※grub2になって、/boot/grub2/grub.cfgは直接編集する事ができなくなりました
# grub2-mkconfig -o /boot/grub2/grub.cfg


2./etc/default/grubのGRUB_DEFAULT=savedを活かして、記述を追記する方法

 - 以下の行を追記します
GRUB_DEFAULT=saved
GRUB_SAVEDEFAULT=true <-追記
 - 編集完了後、以下のコマンドでgrub.cfgを編集し直す
grub2-mkconfig -o /boot/grub2/grub.cfg
 - OS起動時に起動するkernelを手動で選択する

 以上で、次回からは選択したkernelで起動するようになります。

 
3./etc/default/grubのGRUB_DEFAULT=savedを活かして、grub2-set-defaultコマンドで起動するkernelのmenuentry_id_optionを指定する方法

  - grub2-set-defaultコマンドで指定するmenuentry_id_optionの値を調べてから実施します
grep ^menuentry /boot/grub2/grub.cfg
# grub2-set-default <上記で調べたmenuentry_id_option>
# grub2-mkconfig -o /boot/grub2/grub.cfg

なお、設定した値は、以下のコマンドで確認することができます。
# grub2-editenv list
saved_entry=gnulinux-3.10.0-123.9.2.el7.x86_64-advanced-8bb0c9cd-5584-492e-a498-0723073163b9


※個人的には、新しいkernelをインストールする度に/etc/default/grubを編集する手間のない2番目がお勧めです



(備考)
・/etc/default/grub2で指定可能なオプションは、info grub2 で確認できます

$ info grub2 とするとメニューが出てくるので、
 -> 矢印キーでカーソルを"* Configuration::"の箇所にもっていきEnter
 -> 次に矢印キーでカーソルを"* Sinple configuration::"の箇所に持っていきEnter

・もしくは以下のURLでも確認できます
http://www.gnu.org/software/grub/manual/html_node/Simple-configuration.html#Simple-configuration

2014年9月8日月曜日

CentOS6.x + S3QL 2系 (Amazon S3マウント編)

前回のインストール編の続きで、Amazon S3ストレージサービスをマウントして使ってみようというのが今回の内容です。
#検証環境は、CentOS6.5(x86_64) + S3QLのバージョン2.11.1です



Amazon Web Serviceでの準備


ここでは詳細な説明は割愛させてもらいますが、AWSにアカウントを作成後、以下の2点を準備しておく必要があります。

1.Amazon S3でバケットの作成
 ⇒今回は、メールBOXの場所として利用しようと思ったので、"s3ql-mail"と作成しました

2.S3にアクセスするためのAccess Key IDSecret Access Keyの作成


S3QLからの操作


1.ファイルシステムの作成
暗号化パスワードは、この作業で新規に作成します。
# mkfs.s3ql s3://s3ql-mail
Enter backend login: Access Key ID を入力
Enter backend passphrase: Secret Access Key を入力
Before using S3QL, make sure to read the user's guide, especially
the 'Important Rules to Avoid Loosing Data' section.
Enter encryption password: 暗号化パスワード を入力
Confirm encryption password: 暗号化パスワード を再度入力
Generating random encryption key...
Creating metadata tables...
Dumping metadata...
..objects..
..blocks..
..inodes..
..inode_blocks..
..symlink_targets..
..names..
..contents..
..ext_attributes..
Compressing and uploading metadata...
Wrote 150 bytes of compressed metadata.
#

2.マウント
適当なマウントポイント(ここでは、/mail_storage)を作成してマウントします。
※暗号化パスワードは、ファイルシステムの作成時に指定したものを入力します。
※マウントオプションは、"mount.s3ql --help"で確認してください。
# mkdir /mail_storage
# mount.s3ql --allow-other s3://s3ql-mail /mail_storage
Using 2 upload threads.
Autodetected 10202 file descriptors available for cache entries
Enter backend login:Access Key ID を入力
Enter backend passphrase:Secret Access Key を入力
Enter file system encryption passphrase:暗号化パスワード を入力
Using cached metadata.
Setting cache size to 8732 MB
Mounting filesystem...
#
# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3        13G  1.4G   11G  11% /
tmpfs           935M     0  935M   0% /dev/shm
/dev/sda1       194M   86M   98M  47% /boot
s3://s3ql-mail  1.0T     0  1.0T   0% /mail_storage
#

以上で、後はローカルのファイルシステムと同様に読み書きができます。




(備考1)マウント時にAccess Key ID、Secret Access Key、暗号化パスワードの入力を省略するには
 ⇒authinfo2を以下のように作成する
# touch ~/.s3ql/authinfo2
# chmod 600 ~/.s3ql/authinfo2
# vi ~/.s3ql/authinfo2

<記述内容>==========================
[s3]
storage-url: s3://s3ql-mail
backend-login: Access Key ID
backend-password: Secret Access Key 
fs-passphrase: 暗号化パスワード
====================================

(備考2)OS起動時に自動的にバケットをマウントするには
下記のような起動スクリプトを作成後、ファイルに実行権を付与し、自動起動するようにしてください
# chkconfig --add s3ql

<起動スクリプトの作成例>
※バケット名やマウントポイントなどは各自の環境にあわせて修正する必要があります
#!/bin/bash
#
# chkconfig: 35 60 40
# description: S3QL Backup File System
#
# Source function library.
. /etc/init.d/functions
#
AUTHFILE="/root/.s3ql/authinfo2"
BUCKET="s3://s3ql-mail"
MOUNTPOINT="/mail_storage"
OPTIONS="--allow-other"
start() {
        echo -n $"Mounting S3QL: "
        mount | grep $MOUNTPOINT > /dev/null
        if [ $? -eq 0 ];then
                echo $"Cannot mount $MOUNTPOINT. Already mounted !!"
                echo
                exit 1
        fi
        echo
        fsck.s3ql --batch $BUCKET
        mount.s3ql $OPTIONS $BUCKET $MOUNTPOINT
        RETVAL=$?
        [ $RETVAL -eq 0 ] && success || failure
        echo
}
stop() {
        echo -n $"Unmounting S3QL: "
        mount | grep $MOUNTPOINT > /dev/null
        if [ $? -ne 0 ];then
                echo $"Already unmounted !!"
                echo
                exit 1
        fi
        umount.s3ql $MOUNTPOINT && success || failure
        echo
}
case "$1" in
    start)
        start
        ;;
    stop)
        stop
        ;;
    *)
        echo "Usage: `basename $0` {start|stop}"
        exit 1
        ;;
esac

2014年8月30日土曜日

CentOS6.x + S3QL 2系 (インストール編)

2014年9月7日追記:
9月5日にバージョン2.11.1がリリースされています。
⇒主な変更点は、バージョン2.11でmountt.s3qlコマンドがデーモン化しなくなったのが、元に戻った事です。
下記の記事は特に修正はしていませんが、同様の手順でバージョン2.11.1の導入が可能なので、試すのであれば最新版でどうぞ!!



S3QLとは、Amazon S3のようなストレージサービスをローカルにマウントし、通常のハードディスクのようなデータ操作を可能にするツールです。
⇒もちろん実際のデータはローカルではなく、ストレージサービス側に保存されます

現在、S3QLには(原則、機能追加を行わないバグフィックスだけの)バージョン1系と(新機能追加など活発な開発が行われている)バージョン2系が存在します。

どうせ使うなら新しいほうが良いよねという事で、CentOS6.5(x86_64)にバージョン2.11(2014年8月時点での最新版)を導入するのが今回の内容です。


基本的には、以下のドキュメントを参考に進めていきます。
http://www.rath.org/s3ql-docs/installation.html
https://bitbucket.org/nikratio/s3ql/wiki/installation_centos



S3QL ver2.11のインストール


1.ビルドに必要なパッケージをインストール
# yum install autoconf gcc unzip fuse fuse-devel libattr-devel

2.Python3.3のインストール
バージョン2系はPythonの3.3以上が必要になるので、ドキュメントを真似てPUIAS repoからPython3.3をインストールします。
※1行だけ、文字が小さくなってすみません(変なところで改行が入るのを防ぐ為)

# cd /etc/pki/rpm-gpg/
# wget -q http://springdale.math.ias.edu/data/puias/6/x86_64/os/RPM-GPG-KEY-puias
# rpm --import RPM-GPG-KEY-puias
# cat <<EOF >> /etc/yum.repos.d/puias-computational.repo
> [PUIAS_6_computational]
> name=PUIAS Computational Base
> mirrorlist=http://puias.math.ias.edu/data/puias/computational/\$releasever/\$basearch/mirrorlist
> gpgcheck=1
> gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-puias
> EOF
#
# yum install python3 python3-devel python3-libs

3.Pythonのパッケージ管理ツールpipのインストール
この作業でsetuptoolsも一緒にインストールされます。

# wget -O - https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python3
# pip -V
pip 1.5.6 from /usr/lib/python3.3/site-packages (python 3.3)
#
# pip list
pip (1.5.6)
setuptools (5.4.2)
#

4.SQLiteをソースでインストール
OS標準のパッケージsqlite-3.6.20とコンフリクト(上書き)しないように、/usr/local/sqlite-3.8配下にインストールします。

$ wget http://www.sqlite.org/2014/sqlite-autoconf-3080500.tar.gz
$ tar zxf sqlite-autoconf-3080500.tar.gz
$ cd sqlite-autoconf-3080500
$ ./configure --prefix=/usr/local/sqlite-3.8
$ make
$ su
Password: パスワードの入力
# make install
# echo "/usr/local/sqlite-3.8/lib" > /etc/ld.so.conf.d/sqlite.conf
# ldconfig

5.Pythonモジュールのインストール
ドキュメントに指定されているPythonモジュールをインストールします。
# pip install pycrypto
# pip install defusedxml
# pip install requests
# pip install llfuse
# pip install dugong

6.APSWモジュールのインストール
SQLiteを/usr/local/sqlite-3.8配下にインストールしているので、それに合わせてsetup.pyファイルを編集してからインストールを実施します。
# wget https://github.com/rogerbinns/apsw/releases/download/3.8.5-r1/apsw-3.8.5-r1.zip
# unzip apsw-3.8.5-r1.zip
# cd apsw-3.8.5-r1
# cp -p setup.py{,.orig}
# vi setup.py
<編集後のdiff出力>====================================
--- setup.py.orig       2014-06-04 21:32:56.000000000 +0900
+++ setup.py    2014-08-14 22:43:08.417085436 +0900
@@ -19,8 +19,8 @@
 ## http://www.python.org/doc/2.5.2/dist/setup-config.html
 ##
-include_dirs=['src']
-library_dirs=[]
+include_dirs=['src','/usr/local/sqlite-3.8/include']
+library_dirs=['/usr/local/sqlite-3.8/lib']
 define_macros=[]
 libraries=[]
=====================================================
# python3 setup.py install

7.S3QL 導入前の確認
今までの作業の結果、インストールしたモジュール等を確認すると以下のようになります。

# pip list
Warning: cannot find svn location for apsw==3.8.5-r1
apsw (3.8.5-r1)
defusedxml (0.4.1)
dugong (3.2)
llfuse (0.40)
pip (1.5.6)
pycrypto (2.6.1)
requests (2.3.0)
setuptools (5.4.1)
#

8.S3QL 2.11のインストール
APSWモジュールのインストールと同様に、ソースでインストールしたSQLiteを指定してインストールします。
# wget https://bitbucket.org/nikratio/s3ql/downloads/s3ql-2.11.tar.bz2
# tar jxf s3ql-2.11.tar.bz2
# cd s3ql-2.11
#
# python3 setup.py build_ext --include-dirs='/usr/local/sqlite-3.8/include' \
> --library-dirs='/usr/local/sqlite-3.8/lib' --inplace
# python3 runtests.py tests
(snip)
========= 550 passed, 17 skipped, 1 warnings in 161.45 seconds ===========
#
# python3 setup.py install
(snip)
Using /usr/lib64/python3.3/site-packages
Finished processing dependencies for s3ql==2.11
#

 結果、S3QLのコマンド群が以下のようにインストールされます。
# ls -l /usr/bin/*s3ql*
-rwxr-xr-x 1 root root 294 Aug 29 23:17 /usr/bin/fsck.s3ql*
-rwxr-xr-x 1 root root 294 Aug 29 23:17 /usr/bin/mkfs.s3ql*
-rwxr-xr-x 1 root root 296 Aug 29 23:17 /usr/bin/mount.s3ql*
-rwxr-xr-x 1 root root 290 Aug 29 23:17 /usr/bin/s3qladm*
-rwxr-xr-x 1 root root 288 Aug 29 23:17 /usr/bin/s3qlcp*
-rwxr-xr-x 1 root root 292 Aug 29 23:17 /usr/bin/s3qlctrl*
-rwxr-xr-x 1 root root 292 Aug 29 23:17 /usr/bin/s3qllock*
-rwxr-xr-x 1 root root 310 Aug 29 23:17 /usr/bin/s3ql_oauth_client*
-rwxr-xr-x 1 root root 288 Aug 29 23:17 /usr/bin/s3qlrm*
-rwxr-xr-x 1 root root 292 Aug 29 23:17 /usr/bin/s3qlstat*
-rwxr-xr-x 1 root root 298 Aug 29 23:17 /usr/bin/s3ql_verify*
-rwxr-xr-x 1 root root 298 Aug 29 23:17 /usr/bin/umount.s3ql*
#


長くなったのでここまでで一旦終了とし、次回、実際にAmazon S3をマウントしてみたいと思います。

2014年7月24日木曜日

DRBD 8.4.x コミュニティバイナリでセットアップ

以前「DRBD8.4.x RPM作成」という記事を書きましたが、そんな面倒な事をせずにほぼ最新のRPMが用意されているコミュニティ(ELrepo)版バイナリでセットアップしよう!というのが今回の内容です。

#検証環境は、CentOS6.5(x86_64) x2台です
 - ホスト名はそれぞれnode01とnode02です
 - コマンドプロンプトに[ALL]とある場合は、両方のホストで作業を実施し、
  [ONE]とある場合は、どちらか片方のホストで作業を実施する事を意味します


ELrepoリポジトリの作成

ELrepoのサイトに書いてあるとおりですが、下記のようにリポジトリを作成します。
[ALL]# rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
[ALL]# rpm -Uvh http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
Retrieving http://www.elrepo.org/elrepo-release-6-6.el6.elrepo.noarch.rpm
Preparing...                ########################################### [100%]
   1:elrepo-release         ########################################### [100%]
[ALL]#


DRBDのインストール

[ALL]# yum install drbd84-utils kmod-drbd84


DRBDのセットアップ

※詳細は、以前に書いた「DRBD 8.4.x 設定(初回フル同期スキップ)」の”DRBD領域の準備”以降を参照してください。

ここではざっと流れだけをあげておきます。

1.DRBD領域の用意 → ファイルシステムを作成していないまっさらなパーティションを用意
2.DRBDの設定ファイルの作成
3.metaデータ領域を作成
 [ALL]# drbdadm create-md r0/0
4.DRBDの起動
 [ALL]# /etc/rc.d/init.d/drbd start
5.どちらかをmasterに昇格して、初回同期
 [ONE]# drbdadm primary r0/0
  [ONE]# drbdaldm new-current-uuid -clear-bitmap r0/0
6.master側でファイルシステムを作成し、マウント
 [ONE]# drbdadm primary r0/0
  [ONE}# mkfs.ext4 /dev/drbd0
  [ONE]# mount /dev/drbd0 /mnt
  

コミュニティ版バイナリのメリット

一番のメリットは、KMP (Kernel Module Package)に対応したパッケージングがされている事です。
具体的には、新しいkernelをインストールすると、自動的にdrbd.koが用意されるようになります。

以前に書いた「DRBD8.4.x RPM作成」では、新しいkernelが提供されるたびに、その新しいkernel用のDRBDモジュールを生成する作業が必要でした。
 →DRBDモジュールをビルドし忘れて新しいkernelで起動すると当然DRBDが起動できません

kernelのアップデートをしていくと下記のようになっていきます。
#実体はkmod-drbd84パッケージでインストールされたdrbd.koのシンボリックリンクとなります
# locate drbd.ko
/lib/modules/2.6.32-358.el6.x86_64/extra/drbd84/drbd.ko
/lib/modules/2.6.32-431.1.2.0.1.el6.x86_64/weak-updates/drbd84/drbd.ko
/lib/modules/2.6.32-431.17.1.el6.x86_64/weak-updates/drbd84/drbd.ko
/lib/modules/2.6.32-431.5.1.el6.x86_64/weak-updates/drbd84/drbd.ko
#

※詳細が知りたい場合は、weak-updatesのキーワードで検索してみてください

2014年7月8日火曜日

CentOS5.x にpostfix2.12をソースからインストール

CentOS5.xでpostfixをyumでインストールするとバージョンが2.3.3と非常に古い。
epel-postfixリポジトリを利用して、バージョン2.9や2.10をRPMで導入するのもいいのですが、どうせなら一番新しいpostfixをソースからインストールしてみよう!というのが今回の内容です。
※なお、作業はCentOS5.10(x86_64)で実施しています。


今回インストールする条件

※あくまでも1例です。
  必ずこの通りビルドしなくてはいけないという事ではないので、ドキュメントで良く確認して必要な機能を増減させてください。


・以下の2つを実現するためにstableな2.11ではなく、experimentalな2.12を利用します
 - 共有ライブラリをサポートするpostfixをビルドする
 - 様々なルックアップテーブルをプラグインとして利用する

・SMTP認証を利用します(タイプはdovecot)
・ルックアップテーブルとしてPCREを利用します
・TLSを利用します



Postfix2.12のインストール手順


1. パッケージ postfixのアンインストール

もし、インストールされていない場合は、一度インストールを実施してください。
インストール実施後、起動ファイルの/etc/rc.d/init.d/postfixを任意の場所に退避(コピー)してから改めてアンインストールを実施してください。
これで、以下の2つの作業が省略できます。

 - postfixの動作に必要なユーザやグループの作成
 - 起動ファイルの作成


2. パッケージ sendmailのアンインストール

もし、インストールされているようであればアンインストールしてください。
※Postfixをソースからインストールする事で、パッケージのsendmailに含まれるsendmailコマンドやmailqコマンドを上書いてしまう為、管理を煩雑にしないためアンインストールをお勧めします
※依存関係でエラーになる場合は下記のように"--nodeps"オプションを付与して実施してください
 →他のパッケージが依存しているsendmailコマンド等は、postfixをインストールする事で用意されます

# rpm -e --nodeps sendmail


3.openssl1.x、その他のビルドに必要なパッケージのインストール

CentOS5.xのopensslのバージョンはこちらも0.9.8と古く、そのままだとpostfix2.12ではTLS関連のビルドが行えませんので、ここではソースから最新のopensslを/usr/local配下にインストールします。
$ wget -O - http://www.openssl.org/source/openssl-1.0.1h.tar.gz | tar zxf -
$ cd openssl-1.0.1h/
$ ./config  --prefix=/usr/local
$ make
$ su
# make install

また、Postfixのビルドに必要なその他のパッケージを以下のようにインストールしておきます。
# yum -y install pcre-devel db4-devel


4.ソースの展開

$ wget http://mirror.postfix.jp/postfix-release/experimental/postfix-2.12-20140703.tar.gz  ←★改行されてますがここまでが1行
$ tar zxf postfix-2.12-20140703.tar.gz
$ cd postfix-2.12-20140703


 5.makefilesの作成

インストールする条件に合わせて、以下のように実施します。

$ make makefiles shared=yes \
shlib_directory=/usr/lib64/postfix/2.12-20140703/ dynamicmaps=yes \
CCARGS="-DUSE_TLS -DUSE_SASL_AUTH -DDEF_SERVER_SASL_TYPE=\\\"dovecot\\\" \
-I/usr/local/include/openssl" \
AUXLIBS="-lssl -lcrypto -L/usr/local/lib64" \
AUXLIBS_PCRE=`pcre-config --libs`


6. ビルドとインストール

$ make
$ su
# make install
   (snip)
  ※以下、聞かれる質問には、表示されるものをそのまま選択します(Enterを押していきます)。
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: [/]
Please specify a directory for scratch files while installing Postfix. You
must have write permission in this directory.
tempdir: [/home/toshiaki/postfix-2.12-20140703]
Please specify the final destination directory for installed Postfix
configuration files.
config_directory: [/etc/postfix]
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]
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]
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]
Please specify the final destination directory for the Postfix HTML
files. Specify "no" if you do not want to install these files.
html_directory: [no]
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]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]
Please specify the final destination directory for the Postfix on-line
manual pages. You can no longer specify "no" here.
manpage_directory: [/usr/local/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]
Please specify the final destination directory for Postfix queues.
queue_directory: [/var/spool/postfix]
Please specify the final destination directory for the Postfix README
files. Specify "no" if you do not want to install these files.
readme_directory: [no]
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]
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]
Please specify the final destination directory for Postfix shared-library
files.
shlib_directory: [/usr/lib64/postfix/2.12-20140703/]
Please specify the final destination directory for non-executable files
that are shared among multiple Postfix instances, such as postfix-files,
dynamicmaps.cf, as well as the multi-instance template files main.cf.proto
and master.cf.proto.
meta_directory: [/etc/postfix]

 (snip)

    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.
#



Postfixの起動など

後は、/etc/aliasesや/etc/postfix/main.cfなどの設定ファイルを編集しすれば、postfixが起動できます。

# postfix start (もしくは # /usr/sbin/postfix start

また、os起動時にpostfixを自動起動させるには、postfixをアンインストールする前に退避させておいた/etc/rc.d/init.d/postfixファイルを元の場所にもどし、以下のように設定します。

# chkconfig --add postfix
# chkconfig postfix on 



(備考)

静的ライブラリと共有ライブラリでのバイナリファイルのサイズの違い


<静的ライブラリ>
# ls -lh /usr/sbin/post*
-rwxr-xr-x 1 root root     193K Jan  9  2013 /usr/sbin/postalias*
-rwxr-xr-x 1 root root     112K Jan  9  2013 /usr/sbin/postcat*
-rwxr-xr-x 1 root root     261K Jan  9  2013 /usr/sbin/postconf*
-rwxr-sr-x 1 root postdrop 168K Jan  9  2013 /usr/sbin/postdrop*
-rwxr-xr-x 1 root root     100K Jan  9  2013 /usr/sbin/postfix*
-rwxr-xr-x 1 root root     112K Jan  9  2013 /usr/sbin/postkick*
-rwxr-xr-x 1 root root     108K Jan  9  2013 /usr/sbin/postlock*
-rwxr-xr-x 1 root root     100K Jan  9  2013 /usr/sbin/postlog*
-rwxr-xr-x 1 root root     185K Jan  9  2013 /usr/sbin/postmap*
-rwxr-sr-x 1 root postdrop 189K Jan  9  2013 /usr/sbin/postqueue*
-rwxr-xr-x 1 root root     116K Jan  9  2013 /usr/sbin/postsuper*

<共有ライブラリ>
 ※サイズが大幅に小さくなっているのが確認できます
# ls -lh /usr/sbin/post*
-rwxr-xr-x 1 root root      34K Jul  7 00:34 /usr/sbin/postalias*
-rwxr-xr-x 1 root root      29K Jul  7 00:34 /usr/sbin/postcat*
-rwxr-xr-x 1 root root     318K Jul  7 00:34 /usr/sbin/postconf*
-rwxr-sr-x 1 root postdrop  27K Jul  7 00:34 /usr/sbin/postdrop*
-rwxr-xr-x 1 root root      22K Jul  7 00:34 /usr/sbin/postfix*
-rwxr-xr-x 1 root root      16K Jul  7 00:34 /usr/sbin/postkick*
-rwxr-xr-x 1 root root      19K Jul  7 00:34 /usr/sbin/postlock*
-rwxr-xr-x 1 root root      18K Jul  7 00:34 /usr/sbin/postlog*
-rwxr-xr-x 1 root root      39K Jul  7 00:34 /usr/sbin/postmap*
-rwxr-xr-x 1 root root      52K Jul  7 00:34 /usr/sbin/postmulti*
-rwxr-sr-x 1 root postdrop  30K Jul  7 00:34 /usr/sbin/postqueue*
-rwxr-xr-x 1 root root      48K Jul  7 00:34 /usr/sbin/postsuper*




2014年6月28日土曜日

Fedora20 テキスト インストール

マシンスペックの向上した現在、そんなに出番はないと思いますが・・・
Fedora20をテキストモードでインストールしようというのが今回の内容です。



最初にこのモードでインストールする場合の注意点を2つあげておきます。
これが許容できない場合は、他の手段でのインストールを検討してください。

  1. ディスクレイアウトをカスタマイズできない 
  2. インストール完了後、コンソールのKEYMAPが英語になる
         ※コンソールのKEYMAPを変更したい場合は、この記事の一番最後を見てください




テキストインストール


それでは早速インストールをしていきましょう。

1.インストールが開始されたら画面下部の「Press Tab for full configuration options on menu items.」のメッセージに従って、TABキーを押します。ブートオプションとして、textを指定します。





2.次に、最初に注意としてあげたディスクのパーティショニングについての情報が表示され、textモードではなくvncモードでのインストールを代替案として提示されます。ここではテキストモードでインストールする為、”2”と入力します。
 ※vncでのインストールは、こちらの記事を参照してください


















すると画面下部にInstallationメニューが表示されます。
項目的には1)~7)まであり、設定が必要な箇所には”!”マークがついていて、これを全て設定済み(”x”マーク)にしていきます。






3.各項目の設定

※画面の一番下に「Please make your choice from above ['q' to quit | 'c' to continue | 'r' to refresh]: 」とあるように、もし項目をちゃんとセットアップしたのにもかかわらず”x”マークがつかない場合は、一度”r”キーを押してrefreshを実施してみてください。


1)Timezone Settings
上記の画面から1と入力後、Asiaの6 → Tokyoの71と選択しました。

2)Installation source
2と入力後、ここではCD/DVDの1と選択しました。

3)Software selecttion
3と入力後、ここではMinimal Installの12 → continueのcと進めました。

4)Installation Destination
4と入力後、c  → Use All Spaceの2 → c → Standard Partitionの1 → c と進めました。

5)Network configuration
DHCPでIPが取得できると最初から”x”マークがついていますが、固定IPを設定するには5と入力後

- Set hostnameの1を入力後、サーバのホスト名を入力
- Configure device xxxxの2を入力後、必要箇所を一つづつ入力











で最後に c → c と進めました。

6)Root password
6と入力後、任意のパスワードを2回入力しました。

7)User creation
7と入力後、一般(作業用)ユーザを作成しました。
 - 3)Username でユーザ名を
 - 4) Use password でパスワード認証を有効に
 - 5) Passwordで、ユーザのパスワードを設定
 - 6) Administratorの箇所にチェックを入れることでsudoの設定が有効になります


以上で、下記のように全ての項目にxがついた状態でcを入力するとインストールが開始されます。




そして、「Installation complete. Press return to quit」と表示されたらインストールは完了です。
表示されたとおりRetrunキーを押し、インストーラーを終了させてください。






















コンソールのKEYMAPを変更するには


ここでは、jp106へ変更してみます。
※変更が完了するまでは、コンソールは英語のKEYMAPになっているので、可能であればPuttyなどのSSHクライアントから作業を実施した方が良いかもしれません


1. /etc/vconsole.confの修正

以下の記述だけにします。
KEYMAP="jp106"

2. Setup Virtual Consoleの再起動
# systemctl status systemd-vconsole-setup.service
systemd-vconsole-setup.service - Setup Virtual Console
   Loaded: loaded (/usr/lib/systemd/system/systemd-vconsole-setup.service; static)
   Active: active (exited) since Sat 2014-06-28 16:40:14 JST; 27min ago
     Docs: man:systemd-vconsole-setup.service(8)
           man:vconsole.conf(5)
 Main PID: 72 (code=exited, status=0/SUCCESS)
Jun 28 16:40:14 test.examp.com systemd[1]: Starting Setup Virtual Console...
Jun 28 16:40:14 test.examp.com systemd[1]: Started Setup Virtual Console.
#
# systemctl restart systemd-vconsole-setup.service

以上で、コンソールのKEYMAPも日本語になっているはずです。

2014年5月20日火曜日

Fedora20 VNC経由でインストール

タイトルのとおり、Fedora20をVNC経由でインストールしようというのが今回の内容です。



インストールするサーバでの作業


1.インストールが開始されたら画面下部の「Press Tab for full configuration options on menu items.」のメッセージに従って、TABキーを押します。
するとブートオプションが入力できるようになるので、ここでvncと入力後、Enterを押します。




















2.多少時間はかかりますが、下記の図のようにvnc clientから接続する情報が提示されるので、メモをしておきます。







クライアントからの作業


ここからは、VNC Viewerのインストールされている端末から作業を継続します。
※私の場合は、Windows7+Chrome+拡張機能(VNC Viewer for Google Chrome)でアクセスしました




VNC Viewerを起動するとインストールするサーバのIPアドレスをきかれるので、サーバでの作業2.のところでメモした情報を入力して、[Connect]をクリックします。




















すると、以下のようにインストーラーが立ち上がるので、後は通常どおりインストールを進めます。


2014年5月6日火曜日

Linux Tips: コンソールでの文字化けを解消するには

久しぶりにDebian系ディストリのインストールを行った。
その際、インストール初期に聞かれるLanguageの画面で”日本語”を選択し、インストールを完了させました。
次に、コンソールを利用したのですが、manを見れば文字化け、apt-get updateをすれば表示されるメッセージは文字化けと困った事に。


原因は、日本語でセットアップしたことにより、localeが以下のように設定されてしまうから。
→コンソールで、ja_JP.UTF-8の表示は基本的にまともにできない
 (いまでもkonとかあるんだろうか → さがしたらkon2とかでてきますね)
~$ locale
LANG=ja_JP.UTF-8
LANGUAGE=
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=
$

前置きが長くなりましたが、この状態を回避しようというのが今回の内容です。


回避策

1.インストール初期のLanguageをEnglishにしてインストールし直す


時間が許せばこの方法が、一番ベストだと思います。
これでlocaleは、en_US.UTF-8あたりに設定されるので、基本的に文字化けしません。
※サーバ用途では、日本語による表示を必要としないのなら、不必要なパッケージのインストールを防ぐという観点から、これを特にお勧めします


2.コンソールにログイン後、環境変数を設定する


ログイン後、以下のコマンドを毎回実行してから作業を実施します。
※これが面倒な場合は下記の3.を試してください。
$ export LANG=C


3. 作業する$TERMにあわせて$LANGを自動的に選択させる


以下の記述を~/.bashrcあたりにすることによって、$TERMの種類により、ログインする環境にあわせた$LANGを設定する事ができます。
※コンソールはCの表示にし、それ以外(例えばxtermやWindows上のPuttyなど)は日本語での表示を可能にします

case $TERM in
   linux)
        LANG=C
        ;;
   *)
    LANG=ja_JP.UTF-8
    ;;
esac
export LANG


(備考)
Redhat系の場合、この3.と同様の設定が、Fedoraだと8あたりから、CentOSだと5から/etc/profile.d/lang.shとして用意されています

2014年5月2日金曜日

Fedora20 インストール画面がまともに表示されなかったら

自分のところでは、VMware環境で100%なってしまいますが)インストールを開始してパーティショニングするところで、下の画像のように、画面の表示がおかしくなり困った事はないでしょうか?
この状況を回避しようというのが今回の内容です。







回避策


インストーラーのAnacondaで解像度を調整することにより回避する事ができます。

1.インストールが開始されたら画面下部の「Press Tab for full configuration options on menu items.」のメッセージに従って、TABキーを押します。





2.するとブートオプションを入力できるようになるので、ここに解像度を指定してやります。
  ここでは、resolution=1024x768と指定しました。



結果、以下のように画面全てがまともに表示されるようになります。




(備考)
Anacondaのブートオプションには、その他に有用な(面白そうな)ものが結構あるので興味があれば調べてみると良いかもしれません。

https://fedoraproject.org/wiki/Anaconda_Boot_Options?rd=Anaconda/Options

2014年3月26日水曜日

CentOS6(RHEL6)でクラッシュダンプを取得する SSH経由で他のホストへ出力

前回の続きで、タイトルのとおりSSH経由でダンプをリモートのホスト上にはかせてみようというのが今回の内容です。

※評価は、CentOS6.5(x86_64)でメモリ2GBを搭載したマシンを2台用意して行っています
※また、2台のIPアドレスは下記のとおりです
 ダンプを受け取るリモート側のホスト:192.168.233.21
 ダンプをはくホスト        :192.168.233.12



ダンプを受け取るリモート側での作業


ダンプをはく側からSSH経由でアクセスしてくるので、事前にダンプ用ユーザ(下記の例ではkdumpユーザ)の作成とそのユーザでデータを保存できる領域(下記の例では、ホームディレクトリをとして/kdumpを指定)を作成します。
# useradd -m -d /kdump kdump
# grep kdump /etc/passwd
kdump:x:502:502::/kdump:/bin/bash
#




ダンプをはく側での作業



1. /etc/kdump.confの編集

※リモート側で準備したkdumpユーザの権限で、(SCPを使って)データ転送を実施します
※デフォルトで/var/crash配下にデータを転送しようとしますが、その際のアクセス権に注意する必要があります
→pathで任意の場所を指定すれば、デフォルト以外の場所に転送可能なので、下記の例ではリモート側で準備した/kdump配下に転送します
 net kdump@192.168.233.21
 path /kdump
 core_collector makedumpfile -c --message-level 1 -d 31



2. kdump用SSH鍵の登録
以下のようにkdumpスクリプトを使って、ダンプをはく側での秘密鍵と公開鍵の生成とダンプを受け取るリモート側への公開鍵の登録までを実施します。

# /etc/rc.d/init.d/kdump propagate
Generating new ssh keys... done.
kdump@192.168.233.21's password:          ←★パスワードを入力
/root/.ssh/kdump_id_rsa has been added to ~kdump/.ssh/authorized_keys on 192.168.233.21
#
(注意)
ダンプを受け取るリモート側で、SSHのパスワード認証が有効になっている必要があります
→鍵認証のみで運用している場合は、鍵登録に失敗しますが、その際は
  /root/.ssh/kdump_id_rsa.pubを手動でauthorized_keysとして登録します


3.変更の適用
# /etc/rc.d/init.d/kdump restart
Stopping kdump:                                            [  OK  ]
Detected change(s) the following file(s):
  /etc/kdump.conf
Rebuilding /boot/initrd-2.6.32-431.1.2.0.1.el6.x86_64kdump.img
Starting kdump:                                            [  OK  ]
#




動作確認

ダンプをはく側でkernelをクラッシュさせて、リモートで受け取る側にダンプが出力されているか確認します。

# ls -l /kdump/192.168.233.12-2014-03-24-17\:55\:07/
total 19884
-rw-rw-r-- 1 kdump kdump    85833 Mar 24 17:55 vmcore-dmesg.txt
-rw-rw-r-- 1 kdump kdump 20274689 Mar 24 17:55 vmcore.flat
#

2014年3月17日月曜日

CentOS6(RHEL6)でクラッシュダンプを取得する

OSが突然死するとログに手掛かりとなるような出力(判断材料)が意外な程なく、途方にくれる事が多いのですが、その対策としてダンプをはかせてみようというのが今回の内容です。
※評価は、CentOS6.5(x86_64)でメモリ2GBを搭載したマシンで行っています



クラッシュダンプを取得する為のセットアップ


CentOS6.5でクラッシュダンプを取得するには、kdumpサービスを利用します。
以下、その手順です。


1. 必要なパッケージのインストール


kdumpサービスを利用するには、kexec-toolsがインストールされている必要があります。
# yum install kexec-tools


2. メモリー使用量の設定


クラッシュダンプ用に割り当てるメモリ容量を設定します。
→通常、起動しているOSからはそのメモリ領域はないものとして扱われます(※下記の(備考)参照)


設定は、grub.confのkernelの行に”crashkernel”パラメータを渡すことで行いますが、
通常、最初から”crashkernel=auto”と指定されていると思います。

※CentOS6.5では、2GB以上のメモリが搭載されていればkdumpサービスが有効になっていなくても、自動的にメモリの割り当てだけは行われています
※autoで割り当てられたメモリ容量は以下のいずれかのコマンドで確認できます
 # cat /proc/cmdline
 # cat /sys/kernel/kexec_crash_size

2GB未満の場合は、自動的に割り当てられることはないので、autoの箇所に128Mとじかに指定する必要があります

title CentOS (2.6.32-431.5.1.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.5.1.el6.x86_64 <中略> crashkernel=auto
        initrd /initramfs-2.6.32-431.5.1.el6.x86_64.img

(備考)====================================================
・2GBのメモリ搭載し、crashkernelの指定がない場合のメモリ容量

# cat /proc/meminfo
MemTotal:        2046588 kB
MemFree:         1867764 kB
Buffers:            7584 kB
     ・
     ・
・2GBのメモリを搭載し、crashkernel=autoの指定がある場合のメモリ容量
 →2GBからクラッシュダンプ用に割り当てられたメモリ容量が差し引かれて表示されます
# cat /proc/meminfo
MemTotal:        1914492 kB
MemFree:         1733792 kB
Buffers:            7568 kB
     ・
     ・
============================================================


3. 設定ファイル /etc/kdump.confの編集


今回は、デフォルトのままで特に編集を行いませんでした。


4. kdumpサービスの起動と状態確認

# chkconfig kdump on
# /etc/rc.d/init.d/kdump start
No kdump initial ramdisk found.                            [WARNING]
Rebuilding /boot/initrd-2.6.32-431.1.2.0.1.el6.x86_64kdump.img
Starting kdump:                                            [  OK  ]
#

kdumpサービスが有効になったかは以下のコマンドで確認できます
# /etc/rc.d/init.d/kdump status
Kdump is operational
#
# cat /sys/kernel/kexec_crash_loaded
1
#



コアダンプの分析


コアダンプの分析を行うまでの手順は下記のようになります。

1. 必要なパッケージのインストール


デバッグ情報付きでビルドされたカーネルとcrashパッケージをインストールします
→現在running中のkernelに合わせてインストールします
# yum --enablerepo=debug install kernel-debuginfo-`uname -r` crash


2. kernelクラッシュ


今回は、下記コマンドで強制的にkernelクラッシュを発生させます
# echo c > /proc/sysrq-trigger

これで下記のように/var/crashディレクトリ配下にコアダンプが吐かれます。

# ll /var/crash/127.0.0.1-2014-03-17-17\:36\:44/
total 30292
-rw------- 1 root root 30929131 Mar 17 17:36 vmcore
-rw-r--r-- 1 root root    85835 Mar 17 17:36 vmcore-dmesg.txt
#


3. crashユーティリティの実行

# crash /usr/lib/debug/lib/modules/2.6.32-431.1.2.0.1.el6.x86_64/vmlinux \
> /var/crash/127.0.0.1-2014-03-17-17\:36\:44/vmcore

以下のようにプロンプトが戻っててきたら、各種コマンドで解析が実施できます。
→利用できるコマンドはhelpで確認できます


crash 6.1.0-5.el6
Copyright (C) 2002-2012  Red Hat, Inc.
Copyright (C) 2004, 2005, 2006, 2010  IBM Corporation
Copyright (C) 1999-2006  Hewlett-Packard Co
Copyright (C) 2005, 2006, 2011, 2012  Fujitsu Limited
Copyright (C) 2006, 2007  VA Linux Systems Japan K.K.
Copyright (C) 2005, 2011  NEC Corporation
Copyright (C) 1999, 2002, 2007  Silicon Graphics, Inc.
Copyright (C) 1999, 2000, 2001, 2002  Mission Critical Linux, Inc.
This program is free software, covered by the GNU General Public License,
and you are welcome to change it and/or distribute copies of it under
certain conditions.  Enter "help copying" to see the conditions.
This program has absolutely no warranty.  Enter "help warranty" for details.

GNU gdb (GDB) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu"...

      KERNEL: /usr/lib/debug/lib/modules/2.6.32-431.1.2.0.1.el6.x86_64/vmlinux
    DUMPFILE: /var/crash/127.0.0.1-2014-03-17-17:36:44/vmcore  [PARTIAL DUMP]
        CPUS: 1
        DATE: Mon Mar 17 17:36:41 2014
      UPTIME: 00:41:54
LOAD AVERAGE: 0.10, 0.17, 0.08
       TASKS: 71
    NODENAME: kdump.example.com
     RELEASE: 2.6.32-431.1.2.0.1.el6.x86_64
     VERSION: #1 SMP Fri Dec 13 13:06:13 UTC 2013
     MACHINE: x86_64  (3192 Mhz)
      MEMORY: 2 GB
       PANIC: "Oops: 0002 [#1] SMP " (check log for details)
         PID: 4289
     COMMAND: "bash"
        TASK: ffff880037c20ae0  [THREAD_INFO: ffff880037aea000]
         CPU: 0
       STATE: TASK_RUNNING (PANIC)

crash>


2014年2月24日月曜日

rsyslog 制御文字の出力を抑制するには

今回は、$EscapeControlCharactersOnReceiveディレクティブについてです。
※評価はCentOS6.5(x86_64) + rsyslog-7.6.0で行っています


各種ログで以下のように"#0111"などの制御文字が出力され、ログが見にくいなと感じたことはありませんか?

Feb 20 23:31:48 host1 dovecot: auth: Debug: client passdb out: OK#0111#011user=user01@example.com
Feb 20 23:31:48 host1 dovecot: auth: Debug: master in: REQUEST#0113825991681#0111858#0111#01139e00ee36ea2ede7441004cca9bf81c7#011session_pid=1861


$EscapeControlCharactersOnReceive off

とrsyslog.confに設定することにより、この制御文字の出力を抑制することができます。
これですっきりと読みやすいログになりました。

Feb 20 23:33:26 host1 dovecot: auth: Debug: client passdb out: OK   1   user=user01@example.com
Feb 20 23:33:26 host1 dovecot: auth: Debug: master in: REQUEST  3685744641      1877    1       93338956ff312fddeea4e71e715cd44a      session_pid=1882

2014年2月13日木曜日

ひとつのホストで異なるバージョンのPostgreSQLを起動する

今回は、ひとつのホスト上で異なるバージョンのPostgreSQLを起動してみたいと思います。
起動するPostgreSQLは過去にねたとしてあげたコミュニティ版の9.2と9.3とし、OSはCentOS6.5(x86_64)とします。

コミュニティ版のPostgreSQL9.xは、データベースクラスタが最初から同じ位置ではないので、利用するポートがかぶらないようにすれば実現は簡単です。


起動スクリプトを使う場合


PostgreSQL9.3は5432ポートで起動させるので(特別なことをせずに) /etc/rc.d/init.d/postgresql-9.3 start で起動します。

PostgreSQL9.2は"/etc/rc.d/init.d/postgresql-9.2"内のPGPORTの記述をPostgreSQL9.3が利用する5432ポートと異なるものに変更します。
ここでは、5433ポートに変更します。
PGPORT=5433
後は、/etc/rc.d/init.d/postgresql-9.2 start で起動します。


pg_ctlを使う場合


面倒でもフルパスで指定するのが間違いがないでしょう。

[postgres@pgsql ~]$ /usr/pgsql-9.3/bin/pg_ctl start -D /var/lib/pgsql/9.3/data
[postgres@pgsql ~]$ /usr/pgsql-9.2/bin/pg_ctl start -o "-p 5433" -D /var/lib/pgsql/9.2/data


動作確認


下記のように9.2と9.3のPostgreSQLが起動しているのが確認できます。
[postgres@pgsql ~]$ ps -fC postgres
UID        PID  PPID  C STIME TTY          TIME CMD
postgres  1364     1  0 18:19 pts/0    00:00:00 /usr/pgsql-9.3/bin/postgres -D /var/lib/pgsql/9.3/data
postgres  1365  1364  0 18:19 ?        00:00:00 postgres: logger process
postgres  1367  1364  0 18:19 ?        00:00:00 postgres: checkpointer process
postgres  1368  1364  0 18:19 ?        00:00:00 postgres: writer process
postgres  1369  1364  0 18:19 ?        00:00:00 postgres: wal writer process
postgres  1370  1364  0 18:19 ?        00:00:00 postgres: autovacuum launcher process
postgres  1371  1364  0 18:19 ?        00:00:00 postgres: stats collector process
postgres  1406     1  0 18:21 pts/0    00:00:00 /usr/pgsql-9.2/bin/postgres -D /var/lib/pgsql/9.2/data -p 5433
postgres  1407  1406  0 18:21 ?        00:00:00 postgres: logger process
postgres  1409  1406  0 18:21 ?        00:00:00 postgres: checkpointer process
postgres  1410  1406  0 18:21 ?        00:00:00 postgres: writer process
postgres  1411  1406  0 18:21 ?        00:00:00 postgres: wal writer process
postgres  1412  1406  0 18:21 ?        00:00:00 postgres: autovacuum launcher process
postgres  1413  1406  0 18:21 ?        00:00:00 postgres: stats collector process
[postgres@pgsql ~]$

psqlコマンドはより新しいバージョンのものになりますが、ポートを指定して下位のバージョンに接続する事ができます。
[postgres@pgsql ~]$ psql -V
psql (PostgreSQL) 9.3.2
[postgres@pgsql ~]$
[postgres@pgsql ~]$ psql -p 5433
psql (9.3.2, server 9.2.6)
Type "help" for help.
postgres=#

2014年2月10日月曜日

コミュニティ版PostgreSQL9.3

以前のねたをPostgreSQL9.3でリメイクします。
なお、今回インストールした環境はCentOS6.5なので、ここからCentOS6-x86_64用のものを利用しています。


以下、そのセットアップ手順です。

インストール

[root@pgsql ~]# rpm -ivh http://yum.postgresql.org/9.3/redhat/rhel-6-x86_64/pgdg-centos93-9.3-1.noarch.rpm
[root@pgsql ~]# yum -y install postgresql93-server


環境整備

/usr/pgsql-9.3配下にいろいろインストールされるので、それに合わせて環境を整備する。
[root@pgsql ~]# su - postgres
[postgres@pgsql ~]$ vi .bash_profile

以下、その編集内容
PATH=$PATH:$HOME/bin:/usr/pgsql-9.3/bin
PGDATA=/var/lib/pgsql/9.3/data
MANPATH="$MANPATH":/usr/pgsql-9.3/share/man

export PATH PGDATA MANPATH

即時反映するには、以下を実行
[postgres@pgsql ~]$ source .bash_profile


 データベース・クラスタの作成と起動

※ rootユーザで # service postgresql-9.3 initdb を実行してもデータベース・クラスタの作成はできます。
  しかし、localeは指定できてもEncodingが指定できない(SQL_ASCIIになる)ので、ここでは普通にinitdbを実行して
  データベースクラスタを作成しています。

[postgres@pgsql ~]$ initdb --no-locale -E UTF-8
[postgres@pgsql ~]$ pg_ctl start -D $PGDATA
server starting
[postgres@pgsql ~]$ ps -fC postgres
UID        PID  PPID  C STIME TTY          TIME CMD
postgres  1295     1  0 00:28 pts/0    00:00:00 /usr/pgsql-9.3/bin/postgres -D /var/lib/pgsql/9.3/data
postgres  1296  1295  0 00:28 ?        00:00:00 postgres: logger process
postgres  1298  1295  0 00:28 ?        00:00:00 postgres: checkpointer process
postgres  1299  1295  0 00:28 ?        00:00:00 postgres: writer process
postgres  1300  1295  0 00:28 ?        00:00:00 postgres: wal writer process
postgres  1301  1295  0 00:28 ?        00:00:00 postgres: autovacuum launcher process
postgres  1302  1295  0 00:28 ?        00:00:00 postgres: stats collector process
[postgres@pgsql ~]$
[postgres@pgsql ~]$ psql -l
                             List of databases
   Name    |  Owner   | Encoding | Collate | Ctype |   Access privileges
-----------+----------+----------+---------+-------+-----------------------
 postgres  | postgres | UTF8     | C       | C     |
 template0 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
 template1 | postgres | UTF8     | C       | C     | =c/postgres          +
           |          |          |         |       | postgres=CTc/postgres
(3 rows)
[postgres@pgsql ~]$


※あとは、rpmに含まれるinitスクリプトを利用して自動起動するようにしておけば良いと思います。
[root@pgsql ~]# chkconfig postgresql-9.3 on





2014年1月26日日曜日

Postfix Tips: 外部へのメール送信に配送制限をかけるには

今回は、お行儀の悪いユーザがいるメールサーバの管理者に向けてのTipsです。

具体的には、
  1. 特定ドメインに対して(短時間に)大量のメールを送信する(怒)
  2. その結果、特定ドメインにペナルティを科せられてメールを受け取ってもらえなくなる
  3. いつまでも配送できないキューが溜まりまくる
といった状況な時に使います。
※もしくはそういう状況に陥らない為に使います

つまり、特定ドメインに対して短時間に大量のメールを送ろうとしても、ゆっくりと配送するように制限をかけてしまいます。



以下、gmailへの送信を例に実際の設定例です。

1./etc/postfix/master.cfに新しいtransportを作成(定義)
 →ここで作成したtransportの名前がmain.cfで指定するパラメータ名の一部になります

slow      unix  -       -       n       -       -       smtp
     -o syslog_name=postfix-slow


2./etc/postfix/main.cfを編集
 →master.cfに指定したtransport名を使って設定します

# 配送制限をかけるドメインをtransportに指定
transport_maps = hash:/etc/postfix/transport

# 1コネクションでのメール制限
slow_initial_destination_concurrency = 2
slow_destination_concurrency_limit = 10


# 配送制限(ここでは10秒で指定)
slow_destination_rate_delay = 10s


3./etc/postfix/transportの編集
 →編集後、postmap /etc/postfix/transport を実行する必要があります

gmail.com  slow:

4.postfix reloadを実行



これでどんなに大量にメールを送信しようとしても10秒ごとにしかメールが配送できなくなります。
※下記は、ローカルからgmail宛てに1秒間に10通のメールを送信した際のログです
  →ぴったり10秒にはなりませんでしが、delay=19 → delay=30 → delay=41 と一気に送信したのにもかかわらずゆっくりと配送されているのがわかると思います

Jan 26 00:20:34 mailsv postfix/smtpd[1413]: connect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: 6BB6540275: client=localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/cleanup[1416]: 6BB6540275: message-id=<0582.0003.0009@mailsv.example.com>
Jan 26 00:20:34 mailsv postfix/qmgr[1398]: 6BB6540275: from=<foo@mailsv.example.com>, size=867, nrcpt=1 (queue active)
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: disconnect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: connect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: 70AB840C80: client=localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/cleanup[1416]: 70AB840C80: message-id=<0582.0003.0008@mailsv.example.com>
Jan 26 00:20:34 mailsv postfix/qmgr[1398]: 70AB840C80: from=<foo@mailsv.example.com>, size=867, nrcpt=1 (queue active)
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: disconnect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: connect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: 74B9040C81: client=localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/cleanup[1418]: 74B9040C81: message-id=<0582.0003.0007@mailsv.example.com>
Jan 26 00:20:34 mailsv postfix/qmgr[1398]: 74B9040C81: from=<foo@mailsv.example.com>, size=867, nrcpt=1 (queue active)
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: disconnect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: connect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: 792E840C84: client=localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/cleanup[1416]: 792E840C84: message-id=<0582.0003.0006@mailsv.example.com>
Jan 26 00:20:34 mailsv postfix/qmgr[1398]: 792E840C84: from=<foo@mailsv.example.com>, size=867, nrcpt=1 (queue active)
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: disconnect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: connect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: 79E6940C85: client=localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/cleanup[1418]: 79E6940C85: message-id=<0582.0003.0005@mailsv.example.com>
Jan 26 00:20:34 mailsv postfix/qmgr[1398]: 79E6940C85: from=<foo@mailsv.example.com>, size=867, nrcpt=1 (queue active)
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: disconnect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: connect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: 7CD8641272: client=localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/cleanup[1416]: 7CD8641272: message-id=<0582.0003.0004@mailsv.example.com>
Jan 26 00:20:34 mailsv postfix/qmgr[1398]: 7CD8641272: from=<foo@mailsv.example.com>, size=867, nrcpt=1 (queue active)
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: disconnect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: connect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: 7F67F41273: client=localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/cleanup[1418]: 7F67F41273: message-id=<0582.0003.0003@mailsv.example.com>
Jan 26 00:20:34 mailsv postfix/qmgr[1398]: 7F67F41273: from=<foo@mailsv.example.com>, size=867, nrcpt=1 (queue active)
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: disconnect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: connect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: 8302441274: client=localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/cleanup[1416]: 8302441274: message-id=<0582.0003.0002@mailsv.example.com>
Jan 26 00:20:34 mailsv postfix/qmgr[1398]: 8302441274: from=<foo@mailsv.example.com>, size=867, nrcpt=1 (queue active)
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: disconnect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: connect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: 8884141275: client=localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/cleanup[1418]: 8884141275: message-id=<0582.0003.0001@mailsv.example.com>
Jan 26 00:20:34 mailsv postfix/qmgr[1398]: 8884141275: from=<foo@mailsv.example.com>, size=867, nrcpt=1 (queue active)
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: disconnect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: connect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: 8C31D41276: client=localhost.localdomain[127.0.0.1]
Jan 26 00:20:34 mailsv postfix/cleanup[1416]: 8C31D41276: message-id=<0582.0003.0000@mailsv.example.com>
Jan 26 00:20:34 mailsv postfix/qmgr[1398]: 8C31D41276: from=<foo@mailsv.example.com>, size=867, nrcpt=1 (queue active)
Jan 26 00:20:34 mailsv postfix/smtpd[1413]: disconnect from localhost.localdomain[127.0.0.1]
Jan 26 00:20:53 mailsv postfix-slow/smtp[1417]: 6BB6540275: to=<fuga@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.25.26]:25, delay=19, delays=0.02/0.01/0.36/18, dsn=2.0.0, status=sent (250 2.0.0 OK 1390663253 yh9si5084332pab.5 - gsmtp)
Jan 26 00:20:53 mailsv postfix/qmgr[1398]: 6BB6540275: removed
Jan 26 00:21:04 mailsv postfix-slow/smtp[1417]: 70AB840C80: to=<fuga@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.25.26]:25, delay=30, delays=0.02/29/0.45/0.95, dsn=2.0.0, status=sent (250 2.0.0 OK 1390663264 s7si5004113pae.243 - gsmtp)
Jan 26 00:21:04 mailsv postfix/qmgr[1398]: 70AB840C80: removed
Jan 26 00:21:15 mailsv postfix-slow/smtp[1417]: 74B9040C81: to=<fuga@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.25.27]:25, delay=41, delays=0.02/40/0.37/0.89, dsn=2.0.0, status=sent (250 2.0.0 OK 1390663275 if4si5018201pbc.256 - gsmtp)
Jan 26 00:21:15 mailsv postfix/qmgr[1398]: 74B9040C81: removed
Jan 26 00:21:27 mailsv postfix-slow/smtp[1417]: 792E840C84: to=<fuga@gmail.com>, relay=gmail-smtp-in.l.google.com[173.194.79.26]:25, delay=53, delays=0/51/0.36/1.2, dsn=2.0.0, status=sent (250 2.0.0 OK 1390663287 ef2si5024111pbb.251 - gsmtp)
Jan 26 00:21:27 mailsv postfix/qmgr[1398]: 792E840C84: removed
Jan 26 00:21:38 mailsv postfix-slow/smtp[1417]: 79E6940C85: to=<fuga@gmail.com>, relay=gmail-smtp-in.l.google.com[173.194.79.26]:25, delay=64, delays=0.01/63/0.36/0.82, dsn=2.0.0, status=sent (250 2.0.0 OK 1390663298 vb2si2342207pbc.157 - gsmtp)
Jan 26 00:21:38 mailsv postfix/qmgr[1398]: 79E6940C85: removed
Jan 26 00:21:49 mailsv postfix-slow/smtp[1417]: 7CD8641272: to=<fuga@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.129.27]:25, delay=75, delays=0.01/74/0.34/0.69, dsn=2.0.0, status=sent (250 2.0.0 OK 1390663309 ye6si5033450pbc.200 - gsmtp)
Jan 26 00:21:49 mailsv postfix/qmgr[1398]: 7CD8641272: removed
Jan 26 00:22:00 mailsv postfix-slow/smtp[1417]: 7F67F41273: to=<fuga@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.129.27]:25, delay=86, delays=0.01/85/0.35/0.71, dsn=2.0.0, status=sent (250 2.0.0 OK 1390663320 xu6si5070591pab.80 - gsmtp)
Jan 26 00:22:00 mailsv postfix/qmgr[1398]: 7F67F41273: removed
Jan 26 00:22:11 mailsv postfix-slow/smtp[1417]: 8302441274: to=<fuga@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.25.26]:25, delay=97, delays=0.02/96/0.38/0.71, dsn=2.0.0, status=sent (250 2.0.0 OK 1390663331 r7si5013931pbk.267 - gsmtp)
Jan 26 00:22:11 mailsv postfix/qmgr[1398]: 8302441274: removed
Jan 26 00:22:22 mailsv postfix-slow/smtp[1417]: 8884141275: to=<fuga@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.25.27]:25, delay=108, delays=0.01/107/0.36/0.71, dsn=2.0.0, status=sent (250 2.0.0 OK 1390663342 s4si5028494pbg.213 - gsmtp)
Jan 26 00:22:22 mailsv postfix/qmgr[1398]: 8884141275: removed
Jan 26 00:22:34 mailsv postfix-slow/smtp[1417]: 8C31D41276: to=<fuga@gmail.com>, relay=gmail-smtp-in.l.google.com[74.125.25.27]:25, delay=119, delays=0.03/118/0.36/0.7, dsn=2.0.0, status=sent (250 2.0.0 OK 1390663354 sj5si5023288pab.197 - gsmtp)
Jan 26 00:22:34 mailsv postfix/qmgr[1398]: 8C31D41276: removed