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"
)

2013年8月25日日曜日

dovecot dbox形式 ”Alternate Storage”について

前回の続きです。
Dovecotのdbox形式のメールBOXフォーマットには、Alternate Storage機能があります。


具体的には、通常のメールBOXを配置しているディスク(またはパーティションやディレクトリ)とは別に、もう一つ代替となるディスク(またはパーティションやディレクトリ)を用意しておけば、その領域もメールBOXとして利用できるようになる機能です。
この機能を使えば、メールBOXのディスクが圧迫してきたので、古いメールを後から追加したディスクに退避させようといった事も可能になります。

この機能は、mail_locationに以下のように(青字の部分を追加で)指定するだけで利用できます。
※評価は、CentOS6.4(x86_64) + dovecot2.2.5 + システムアカウントで、/dev/sdb1を/archiveとしてマウントした状態で行っています

mail_location = sdbox:~/dbox:ALT=/archive/%n


以下、実際の操作例です。
 → 既読メールの移動を実施してみます

サンプルとしてuser01ユーザのメールBOXにメールが10通あり、全て既読の状態です。
# find /home/user01/dbox/
/home/user01/dbox/
/home/user01/dbox/dovecot-uidvalidity
/home/user01/dbox/mailboxes
/home/user01/dbox/mailboxes/INBOX
/home/user01/dbox/mailboxes/INBOX/dbox-Mails
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.log
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.10
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.cache
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.7
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.2
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.6
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.8
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.4
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.5
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.1
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.3
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/u.9
/home/user01/dbox/dovecot-uidvalidity.52127e52
/home/user01/dbox/dbox-alt-root
#

この状態から既読メールをAlternate Storageに移動させるには以下のように実行します。
# doveadm altmove -u user01 seen

結果、user01ユーザのメールBOXは以下のような状態になります。
 →既読メールの10通は/archive/user01ディレクトリ以下に移動しています
# find /home/user01/dbox/ /archive/user01
/home/user01/dbox/
/home/user01/dbox/dovecot-uidvalidity
/home/user01/dbox/mailboxes
/home/user01/dbox/mailboxes/INBOX
/home/user01/dbox/mailboxes/INBOX/dbox-Mails
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.log
/home/user01/dbox/mailboxes/INBOX/dbox-Mails/dovecot.index.cache
/home/user01/dbox/dovecot-uidvalidity.52127e52
/home/user01/dbox/dbox-alt-root
/archive/user01
/archive/user01/mailboxes
/archive/user01/mailboxes/INBOX
/archive/user01/mailboxes/INBOX/dbox-Mails
/archive/user01/mailboxes/INBOX/dbox-Mails/u.8
/archive/user01/mailboxes/INBOX/dbox-Mails/u.1
/archive/user01/mailboxes/INBOX/dbox-Mails/u.9
/archive/user01/mailboxes/INBOX/dbox-Mails/u.6
/archive/user01/mailboxes/INBOX/dbox-Mails/u.4
/archive/user01/mailboxes/INBOX/dbox-Mails/u.10
/archive/user01/mailboxes/INBOX/dbox-Mails/u.3
/archive/user01/mailboxes/INBOX/dbox-Mails/u.2
/archive/user01/mailboxes/INBOX/dbox-Mails/u.7
/archive/user01/mailboxes/INBOX/dbox-Mails/u.5

#

※この機能は、dbox-alt-rootファイルが、シンボリックリンクになることで実現しています。
# ls -l /home/user01/dbox/dbox-alt-root
lrwxrwxrwx 1 user01 user01 15 Aug 25 23:02 /home/user01/dbox/dbox-alt-root -> /archive/user01/
#

なお、移動したAtteanate Storageのメールを元に戻すには以下のように実行します。
# doveadm altmove -r -u user01 all


以上、今回は手動で既読メールを移動させる操作例をあげましたが、バッチ処理でより複雑な条件での操作も可能なので、詳しくは下記を参照してください。

http://wiki2.dovecot.org/Tools/Doveadm/Altmove
http://wiki2.dovecot.org/Tools/Doveadm/SearchQuery