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

2014年1月21日火曜日

rsyslog DirCreateMode・FileCreateModeが意図したとりに動作しない

今回は、$DirCreateMode/$FileCreateModeディレクティブについてです。


このディレクティブはrsyslogでログを出力する際に、ディレクトリとファイルに任意のパーミッションを設定するものです。
このディレクティブでlog-userでもログを参照させる為、下記のように設定をしてみましたが、
$DirCreateMode 0750
$DirGroup log-user
$FileCreateMode 0640
$FileGroup log-user


mail.*                                   /var/log/postfix/maillog

実際に設定されたパーミッションを確認すると、それぞれのディレクティブのデフォルト値が設定されてしまいます。
[root@rsyslog ~]# find /var/log/postfix/ -ls
522578  4 drwx------   2 root   log-user  4096 Jan 15 23:34 /var/log/postfix/
522597  4 -rw-------   1 root   log-user   883 Jan 20 23:44 /var/log/postfix/maillog
[root@rsyslog ~]#


これを解決するには、下記のように$umaskディレクティブを追加する必要があります。
$umask 0000
$DirCreateMode 0750
$DirGroup log-user
$FileCreateMode 0640
$FileGroup log-user


mail.*                                   /var/log/postfix/maillog

これで意図したとおりのパーミッションになります。
[root@rsyslog ~]# find /var/log/postfix/  -ls
522578  4 drwxr-x---  2 root   log-user   4096 Jan 21 00:03 /var/log/postfix/
522597  4 -rw-r-----  1 root   log-user    186 Jan 21 00:03 /var/log/postfix/maillog
[root@rsyslog ~]#


2014年1月13日月曜日

rsyslog ログを転送するとTAGがかけてしまう

今回は、rsyslogでログを転送した際に、TAG部分で32文字以降が欠けてしまう件についてです。
#検証を行った環境は、転送元・転送先ともにOSがCentOS6.5でrsyslogはver7.4.8です


ログの転送先(ログサーバ側)で、転送されてきたCRON系のログを確認していたところ、本来

Jan 13 16:01:01 host run-parts(/etc/cron.hourly)[1197]: starting 0anacron

と記録されているものが、

Jan 13 16:01:01 host run-parts(/etc/cron.hourly)[1197 starting 0anacron

と、32文字以降の2文字(”]”と”:”) が省略されていることに気がつきました。


調べてみるとまんまずばりの情報が下記にありました。

http://www.rsyslog.com/sende-messages-with-tags-larger-than-32-characters/


RFC的には、ログのTAG部分は32文字を最大とするのが正解で、rsyslogでは転送用templateで32文字の制限が行われています。

なので、ログの転送元で新しく”32文字の制限を行わない”templateを定義すれば、TAG部分が欠けてしまう現象は回避できます。
具体的には、下記のようにします。

# 以下は改行されていますが、1行で記述する必要があります
template(name="ForwardFullTag" type="string" string="<%PRI%>%TIMESTAMP:::date-rfc3339%
 %HOSTNAME% %syslogtag%%msg:::sp-if-no-1st-sp%%msg%")


#  以下は無理に一行にまとめる必要はありません
# (転送先のTargetは環境に合わせて変更してください)
*.* action(type="omfwd"
 Target="192.168.233.14"
 Port="514"
 Protocol="tcp"
 Template="ForwardFullTag"
)