ZFS優しすぎ涙がでた。

前口上

試しにZFSを使ってみて(VMware Playerで気軽に試せるようになったとは、なんと便利な世の中か)本当に驚いた。
ディスク繋いでzpoolコマンド一発ですぐ使える。パーティションに頭を悩ませる必要もない。RAIDだって楽勝。ディレクトリごとに圧縮することもできるし、気が変わったら、いつでも止めることもできる。スナップショットも早い。
実は、何年か前にZFSについて調べたときはまだまだバギーな印象だったのと、ZFSを使えるようなパワフルマシンがなく保留にしてたんだけど、すごく損した気分。
いままで幾たび、fdiskやnewfs失敗してひどい目にあったことか。電子の海に消えたデータを思う。


そしてRAID。ソフトRAIDで言えばlvmも有名だが、俺にはもうコマンドが複雑すぎて覚えられない(lv...が論理ボリュームを、pv...が物理ボリュームを扱うんだって?)。
これはすごく危険。
だってソフトRAID含め、こういったディスクを扱うコマンドを使うのは、初期設定と、問題の発生したとき。
俺みたいなオッチョコチョイが、問題が発生して焦っているときに、コマンドが複雑だと二次災害を引き起こすんだって。
…正直に言うと実際に引き起こした。


ZFSならとにかくzpool、zfsさえ覚えておけばいいのだ。


ZFS

宅鯖ではZFSを使いたいからFreeBSDを選んだ。
そして、いろいろwebを渉猟するにi386ZFSは辛そうなのでamd64とし、下記の通りZFSのバージョンもどーんと上がっているので, 9.0-RELEASEを入れた。メジャーバージョンの最初はちょっと不安ではあるけれど。

ZFSのバージョン
8.2+ - ZFS v15
9.0+ - ZFS v28

あとは、特に難しいこともなく、2.5Tのディスク1本買ってきて、つないで、領域作って、こんな感じ。
作業ログは後述。

$ sudo zpool status
パスワード:
  pool: vault
 state: ONLINE
 scan: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        vault       ONLINE       0     0     0
          ada1      ONLINE       0     0     0

errors: No known data errors
$ zpool list
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
vault  2.27T  1007G  1.28T    43%  1.00x  ONLINE  -


ディスク1本なので、RAIDも組まず、圧縮もせず(データがjpg写真とか自炊本、自炊DVD、CDとか圧縮の効かないものばかりだから)。
あんなに煽っておいてアレだが、だってまだディスク高いし・・。


チューニング

ただまあ、ここを見てチューニングだけはしておいた。
http://wiki.freebsd.org/ZFSTuningGuide


/boot/loader.confにおけるチューニング

vfs.zfs.prefetch_disable="1"
vfs.zfs.txg.timeout="5"

1行目
ZFSのprefetchを無効にすると全体的にスピードが向上する。
ただし読み書きが頻繁に発生する状態だとシステムが遅くなる傾向あり。
なお、4GB以上のメモリが実装されているとデフォルトで0になるとのこと。

2行目
txgが何の意味か分からないけど(task queue?)、こうしておくとスループットが上がる上に、システムが極端に遅くなる問題が改善される。
(In my case 50-100% CPU is used by ZFS with *no* disk activity during the pauses then a burst of rapid disk activity and then another pause. なんて言ってる)
なお、これはZFS v28からはデフォルト。


/etc/sysctl.confにおける設定

kern.maxvnodes=250000
vfs.zfs.write_limit_override=131072

1行目でvnodes数の上限をデフォルトの約200000(a little over 200,000)から増やす。
2行目でTXG write limitの値を減らす。デフォルト値は知らん。
4GBメモリなら256MB、と書いてあるので、2GBを積んでる俺は128MBにした。
なお、ZFS v28より前ではvfs.zfs.txg.write_limit_overrideとのこと。



そのほかの設定:periodic script

/etc/periodic/daily/404.status-zfsスクリプトがある。
有効にすると、毎日zpoolの状態をしらべて、daily output, security outputでメールしてくれる。
そうそう、root宛のメールは転送設定しておくと便利。

$ sudo /etc/periodic/daily/404.status-zfs

Checking status of zfs pools:
all pools are healthy


/etc/periodic.confに以下を追記しておけばOK

daily_status_zfs_enable="YES" 


以下は作業ログ

作業ログ

ディスクをつないで起動、dmesgで確認

$ dmesg|grep ada
ada0 at ahcich0 bus 0 scbus0 target 0 lun 0
ada0: <VB0250EAVER HPG7> ATA-8 SATA 2.x device
ada0: 300.000MB/s transfers (SATA 2.x, UDMA5, PIO 8192bytes)
ada0: Command Queueing enabled
ada0: 238475MB (488397168 512 byte sectors: 16H 63S/T 16383C)
ada0: Previously was known as ad4
ada1 at ahcich1 bus 0 scbus1 target 0 lun 0
ada1: <WDC WD25EZRX-00MMMB0 80.00A80> ATA-8 SATA 3.x device
ada1: 300.000MB/s transfers (SATA 2.x, UDMA6, PIO 8192bytes)
ada1: Command Queueing enabled
ada1: 2384658MB (4883781168 512 byte sectors: 16H 63S/T 16383C)
ada1: Previously was known as ad6

ada1が新しく繋いだディスク。
ここにZFSを作成する。

$ sudo zpool create vault ada1
Password:
$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
vault on /vault (zfs, local, nfsv4acls)
$ df -h
Filesystem     Size    Used   Avail Capacity  Mounted on
/dev/ada0p2    228G     15G    194G     7%    /
devfs          1.0k    1.0k      0B   100%    /dev
vault          2.2T     31k    2.2T     0%    /vault


無事完成。
なんと勝手にマウントまでしてくれる。これですぐ使える。
2.5Tなのに数秒程度で完了。
ビクビクしながらfdiskしたりnewfsしたりする必要がない。電卓も要らない(そういう時代もあったのです)。
衝撃的です。
コマンドが簡単なうえに、早いというのは、重ねて言うけど障害復旧に極めて有利な点。
大きなディスクをnewfsするときの、遅々として進まないカウンタを見てジリジリしたことのある人なら共感してくれるはず。


なお、この状態では/etc/fstabに何も書き込まれていないので、再起動すればマウントは外れる。


ではここにディレクトリをいくつか作る。
itunes用と、通常の共有ディレクトリ用の二つを作る。

$ sudo zfs create vault/itunes
$ sudo zfs create vault/chamber
$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
vault on /vault (zfs, local, nfsv4acls)
vault/itunes on /vault/itunes (zfs, local, nfsv4acls)
vault/chamber on /vault/chamber (zfs, local, nfsv4acls)
$ df -h
Filesystem      Size    Used   Avail Capacity  Mounted on
/dev/ada0p2     228G     15G    194G     7%    /
devfs           1.0k    1.0k      0B   100%    /dev
vault           2.2T     32k    2.2T     0%    /vault
vault/itunes    2.2T     31k    2.2T     0%    /vault/itunes
vault/chamber    2.2T     31k    2.2T     0%    /vault/chamber


これらを/export配下に移動させる。
これが既存の考えにはない動作。頭の中でファイルシステムに対する考え方がグニョっとなるのを俺は感じたよ。

$ sudo zfs set mountpoint=/export/itunes vault/itunes
$ sudo zfs set mountpoint=/export/chamber vault/chamber
$ mount
/dev/ada0p2 on / (ufs, local, journaled soft-updates)
devfs on /dev (devfs, local, multilabel)
vault on /vault (zfs, local, nfsv4acls)
vault/itunes on /export/itunes (zfs, local, nfsv4acls)
vault/chamber on /export/chamber (zfs, local, nfsv4acls)

そしたら/etc/fstabに書き込んでおしまい。
昔はデバイス名を書き込んでいた場所にZFSのディスクプールを書くわけですな。

vault/itunes    /export/itunes         zfs     rw      0       0
vault/chamber   /export/chamber                zfs     rw      0       0

afpでファイルをコピーしているのだが、あまり負荷はかかっていない模様。
ZFSはリソース食いと聞いてたのでコワゴワコピーしたんだけど、まあ100Mbpsのネットワーク越しですしな。

last pid:  1773;  load averages:  0.11,  0.21,  0.17    up 0+00:45:03  23:54:03
42 processes:  1 running, 41 sleeping
CPU:  0.2% user,  0.0% nice, 15.0% system,  0.4% interrupt, 84.4% idle
Mem: 46M Active, 189M Inact, 1426M Wired, 64M Cache, 200M Buf, 119M Free
Swap: 907M Total, 556K Used, 906M Free

  PID USERNAME     THR PRI NICE   SIZE    RES STATE   C   TIME   WCPU COMMAND
 1697 root           1  31    0 55860K  4288K select  1   3:55 16.36% afpd

そのほか

重大な作業をするときは必ず-nオプションを付けること。
ドライランと呼ばれるもので、実際の作業はせずに結果をシミュレートできる。


ストレージプールを作業するときには明示的にexportすること。
exportすれば、未書き込みのデータがすべて処理され、システムから削除される。

そこで引数なしでimportを実行すると、import可能な、言い換えるとexport済みのプールが表示される。

FreeBSDにMacのファイル共有プロトコルAFPを喋らす。(追記あり)

AFP(Apple Filing Protocol)。
Macのファイル共有はOSXからSMB/CIFSになったと勝手に思いこんでたから驚いた。AppleTalkが今に生きてるとは。
ただ、AFPは下位レイヤにAppletalkじゃなくTCPを使うことができるそうなので納得。
追記:コメントで教えていただきましたが、さいきんAppletalkは死んでしもうたそうです。R.I.P.

UNIX系でAppleTalk互換ソフトウェアといえばNetatalk
Macでファイル共有するなら正直SMB/CIFSでいいかなとも思ったが、どうもNetatalkの方が軽いと聞いたので、試しに使ってみる。
iTunesのライブラリも置いてみたいのだ。

netatalkには、AFPデーモンのafpd、CNID管理のcnid_metad、appletalkを動かすatalkd、リモートプリントサービスのpapd、Mac向けタイムサーバのtimelordが含まれる。
AFP over TCPで要るのは、afpd, cnid_metadと理解した。

Macのファイル共有で面白いのは各ファイル、フォルダに固有のIDを付けて管理するという点。パスを使わないのだ。これは大昔からaliasという考え方があったせいか。
そして、ホストのファイル、ディレクトリとID(CNID, Catalog Node ID)のくくりつけを管理するのがcnd_metadということらしい。(metaという名前だけに、DBは別にあるのだが)


net/netatalkからインストール

# cd /usr/ports/net/netatalk
# make config
Apple Talkを外す。
# make install clean


苦難の設定

すごく大変だった。
なんかマニュアルがすごく分かりにくく感じる。
共有フォルダ設定はAppleVolumes.defaultを使い、それ以外はnetatalk.conf, afpd.confを使うようだ。

以下を見ながら試行錯誤。

http://netatalk.sourceforge.net/2.2/htmldocs/configuration.html#id1590298

/usr/local/etc/netatalk.confで全般の設定。

変えたのは以下の二点。

#### machine's AFPserver/AppleTalk name.
ATALK_NAME=sylph_osx
#### Set which daemons to run.
#### If you use AFP file server, run both cnid_metad and afpd.
CNID_METAD_RUN=yes
AFPD_RUN=yes

/usr/local/etc/afpd.conf
変更なし。


/usr/local/etc/AppleVolumes.default
ここで共有フォルダの設定。下記において最初の二行はデフォルト。
最後の一行のみ追加した。
~はホームディレクトリだな。

:DEFAULT: options:upriv,usedots
~
/export/itunes itunes

なお、以下にオプションが山ほど。
http://netatalk.sourceforge.net/2.2/htmldocs/AppleVolumes.default.5.html

書式は以下の通り。<共有フォルダ実パス> <外部への共有フォルダ名> [<オプション>]

オプションでめぼしいものは以下の二つくらいかな。

tm OSXのタイムマシンサポートを有効に。
ro 読み取り専用

複数指定する場合にはたとえば(実際にはtmとroを一緒に使うことはないが)以下のようにカンマ(,)でつなぐ。

/dir/path share options:tm,ro


そうしたら、/etc/rc.confに以下を追加する。
netatalkを動かすにはavahi_daemonが必要で、avahiを動かすにはdbusが必要だからこんな感じ。
なお運用中に設定を変更した場合にはこれらサービスをすべて再起動したほうがいいようだ。

#AFP
dbus_enable="YES"
avahi_daemon_enable="YES"
avahi_dnsconfd_enable="YES"
netatalk_enable="YES"
cnid_metad_enable="YES"
afpd_enable="YES"

で、再起動するか、/usr/local/etc/rc.dで上から順番に起動させればOK。
FreeBSDnetatalk関連の起動スクリプトは、startさせても何のメッセージも出ないのが不親切だと思う。
macからはafp://<ホスト>の書式でアクセスできる。

運用。安定していないのか?

320GBほどのデータをAFP経由でコピーしたのだが、以下のメッセージが表示されてなかなか終わらない。
何が悪いのだろう?

Mar  6 06:35:22 isis afpd[3237]: afp_disconnect: trying primary reconnect
Mar  6 06:35:22 isis afpd[1695]: Reconnect: transfering session to child[1697]
Mar  6 06:35:22 isis afpd[1695]: Reconnect: killing new session child[3237] after transfer
Mar  6 06:35:22 isis afpd[1697]: afp_dsi_transfer_session: succesfull primary reconnect
Mar  6 06:35:29 isis afpd[3237]: afp_disconnect: primary reconnect succeeded
Mar  6 06:38:18 isis afpd[1697]: read: Operation timed out
Mar  6 06:38:18 isis afpd[1697]: dsi_stream_read: len:-1, Operation timed out
Mar  6 06:38:18 isis afpd[1697]: dsi_stream_send: Broken pipe
Mar  6 06:38:18 isis afpd[1697]: dsi_wrtreply: Broken pipe
Mar  6 06:38:18 isis afpd[1697]: dsi_disconnect: entering disconnected state
Mar  6 06:38:18 isis afpd[1697]: dsi_disconnect: entering disconnected state

ssmtpを使ってroot宛のメールをgmailに転送したら便利杉ワロタ。

ssmtpとは。
Extremely simple MTA to get mail off the system to a mail hub

なんかね、20年近く前までは、sendmailの設定できるってだけで高給取りだったそうなんですよ。
だからqmailとかpostfixとか生まれたらしいんですがね、もうそんな設定の難しいソフトウェアはベースシステムから取っ払ってほしいんですよ。
で、ssmtpなら設定は簡単だし、gmailsmtp開放してるってんで、まあ入れてみた。
root宛にメールを送れば、自分のスマホにメールが届くというのは便利杉で驚いた次第。


事前準備: sendmailよRIP

まずsendmailを止める。

# /etc/rc.d/sendmail stop

sendmailが次回以降も起動しないように/etc/rc.confに以下を追記。
君にはお世話になった。

#vi /etc/rc.conf
(以下を追記)
sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"
sendmail_msp_queue_enable="NO"


ssmtpをインストール

# cd /usr/ports/mail/ssmtp
# make install clean
# make replace

最後のreplaceは/etc/mail/mailer.confを修正して、sendmailをssmtpに置き換えてくれる。
sendmailは他のたくさんのプログラムがアクセスするからね。
/etc/mail/mailer.confを見ると、何が変わったかがわかる。

make replace後の/etc/mail/mailer.confの内容

#sendmail       /usr/libexec/sendmail/sendmail
#send-mail      /usr/libexec/sendmail/sendmail
#mailq          /usr/libexec/sendmail/sendmail
#newaliases     /usr/libexec/sendmail/sendmail
#hoststat       /usr/libexec/sendmail/sendmail
#purgestat      /usr/libexec/sendmail/sendmail
sendmail        /usr/local/sbin/ssmtp
send-mail       /usr/local/sbin/ssmtp
mailq           /usr/local/sbin/ssmtp
newaliases      /usr/local/sbin/ssmtp
hoststat        /usr/bin/true
purgestat       /usr/bin/true


ssmtpの設定

ここでroot宛のメールをgmailに転送する設定をする。

/usr/local/etc/ssmtp/ssmtp.confを作成

root=youremail@gmail.com
mailhub=smtp.gmail.com:587
AuthUser=youremail@gmail.com
AuthPass=yourpassword
UseSTARTTLS=YES


実験

$ mail -v root
Subject: <件名を入れる>
適当な本文
(Ctrl+Dを押す)

これでOK。

FreeBSDのsendmailの息の根を止めるには。

自宅サーバsendmailは正直不要です。と思うことはしばしば。

てっとり早く結論を言えば、以下を/etc/rc.confに追記すればよい。なお、「sendmail_enable = "NONE"」はもう使われていないので注意。詳細は後述。

/etc/rc.confへの追記

  sendmail_enable="NO"
  sendmail_submit_enable="NO"
  sendmail_outbound_enable="NO"
  sendmail_msp_queue_enable="NO"

しかし、handbook 29.4.2 Disable sendmail に記載の通り、以下の懸念がある(2012/3/1)。

Warning: もしこの方法で sendmail のメール送信機能を無効にしたのなら、 完全に動作する代替メール配送システムと置き換えることが重要です。 さもなければ、periodic(8) などのシステム機能は、 それらの結果を通常想定しているようにメールで配送することができなくなるでしょう。
システムの多くの部分が sendmail 互換のシステムがあることを想定しているかもしれません。 もしそれらを無効にした後に、 アプリケーションがメールを送ろうとするために sendmail のバイナリを使用し続ければ、 メールは使われていない sendmail のキューに入り、そして決して配送されないでしょう。

つまりroot等に送られるreportがsendmailのキューにたまり続ける。
(なお、日本語版handbookはどうしても古くなりがちなので、原版も確認すること!)


FreeBSDのベースシステムが送るメールなら、periodicあたりを修正すればよいだろうが、portsなどからインストールするソフトウェアのことも考えるときりがない。
sendmailを動かしたくない目的にもよるが、現実的なところでは外部からのsmtp接続を無効にするだけでいいだろう。
こうした場合の別の懸念としては、意図せずに自サーバが外部へのsmtp接続を試みること、さらに言えば、おかしなメールをバラ撒こうとすることだ。
が、仮に外部へのsmtp接続を無効にしたくとも、rc.confの設定だけではできないようだ。これについては改めて考える。


外部からのsmtp接続を受け付けない場合には、/etc/rc.confに下記を追加すればよく、かつ少なくとも9.0、8.2ではデフォルト設定だ。

/etc/rc.confでの外部からのsmtp接続を受け付けない設定

以下のみを/etc/rc.confに追記

sendmail_enable="NO"

なお、上記はデフォルト

$ uname -v
FreeBSD 8.2-RELEASE-p3 #0: Tue Sep 27 18:07:27 UTC 2011     root@i386-builder.daemonology.net:/usr/obj/usr/src/sys/GENERIC
$ grep sendmail_enable /etc/defaults/rc.conf
sendmail_enable="NO"    # Run the sendmail inbound daemon (YES/NO).


【参考】以下はもう使われていないので注意。

sendmail_enable = "NONE"

man rc.sendmailより

sendmail_enable
(中略)
The ``NONE'' option is deprecated and should not be used.  It will be removed in a future release.


さらにkwsk

FreeBSDにおけるsendmail起動の設定は、以下の変数にYES/NOを代入することで行う。
使い方はrc.sendmail(8)に記載されている。

sendmail_enable=
sendmail_submit_enable=
sendmail_outbound_enable=
sendmail_msp_queue_enable=

これらは最初の3つと1つに分かれる。
最初の3つはセットになっており、一つ目がYESの場合は残り二つが参照されない。
一つ目がNOで、二つ目がYESの場合は最後の一つが参照されない。
したがって、3パターンの設定ができることになり、各パターンについて調べた結果は以下の通り。


・パターン1: デフォルト
外部からのsmtp接続を受け付けない。
内部からのsmtp接続は受け付け、外部への送信は可能。

sendmail_enable="NO"
sendmail_submit_enable="YES"
sendmail_outbound_enable="YES"

・パターン2:
外部、内部ともにsmtp接続を受け付けない。
つまりroot等に送られるreportも届かなくなる。
ただちょっと分からないのは、「"local mail queue management"を提供する」とmanには記載されているのだが、外部、内部ともにsmtp接続を受け付けない状態でのlocal mail queueとはいったいなんだろうか。一応、この状態ではroot権限でsendmailが「Queue runner」として起動する。

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="YES"

パターン3:
この状態ではroot権限のsendmailは一切起動しない。

sendmail_enable="NO"
sendmail_submit_enable="NO"
sendmail_outbound_enable="NO"

上記を別の形で表現すれば以下の通り。(rc.sendmail(8)より引用)

  # MTA
  if (${sendmail_enable} == NONE)
  # Do nothing
  else if (${sendmail_enable} == YES)
       start sendmail with ${sendmail_flags}
  else if (${sendmail_submit_enable} == YES)
       start sendmail with ${sendmail_submit_flags}
  else if (${sendmail_outbound_enable} == YES)
       start sendmail with ${sendmail_outbound_flags}
  endif

  # MSP Queue Runner
  if (${sendmail_enable} != NONE &&
      [ -r /etc/mail/submit.cf] &&
      ${sendmail_msp_queue_enable} == YES)
  start sendmail with ${sendmail_msp_queue_flags}
  endif


なお、sendmail_msp_queue_enableは、smmsp権限で動くQueue runnerの動作スイッチ。
NOを指定すれば起動しない。

MovableType

おなごもすなるMovableTypeを。

まず注意。
Xの入っていないサーバにインストールするときには、あらかじめImageMagick-nox11-6.7.4.4_1 を入れておく!


インストール

下記からインストール
ただ、ImageMagickに依存しているので、何も考えずにインストールするとX関連のportsをたくさん呼び寄せて大変なことになる。
あらかじめImageMagick-nox11をインストールしておくとよいでしょう。
(/etc/make.confにWITHOUT_X11=yes という手もあるが)

# cd /usr/ports/japanese/MT
# make config
# make install clean

make configでUSE_APACHEをチェックしておくと、apacheの設定ディレクトリに必要なファイルを入れてくれるので便利。
(/usr/local/etc/apache22/Includes)
また、デフォルトだとバックエンドのDBにsqliteを使ってくれるのは、個人用との場合には嬉しいですな。


MovableTypeの設定

apache22再起動

# /usr/local/etc/rc.d/apache22 restart

以下にアクセス。あとは画面手順に沿う。

http://<サーバのアドレス>/MTcgi/mt-wizard.cgi


スタティックウェブパス、スタティックファイルパスは、FreeBSDportsから入れた場合だとそれぞれ/MT、/usr/local/www/data/mt-static。
具体的にはapacheの以下の設定で指定した場所。

<IfModule alias_module>
        Alias /MT "/usr/local/www/data/mt-static"
        ScriptAlias /MTcgi "/usr/local/www/cgi-bin/mt"
</IfModule>
スタティックウェブパス: /MT
スタティックファイルパス: /usr/local/www/data/mt-static


最初のウェブサイトを作る。movabletype専用ならサーバ直下でいいけど、そうでないなら適当なディレクトリを指定する。
それに合わせて、サーバ上にディレクトリを作る。忘れずに権限を変えておく。

# mkdir /usr/local/www/apache22/data/m
# chown www:www /usr/local/www/apache22/data/m

あとはまあ。movabletypeの指定に従う。

popサーバ、dovecot2のインストール

popサーバを構築する。

LAN内にゆるーく作るので、とにかく手軽に。

手軽にというのはたとえば、imapとか要らない。pop3でいい。ただネットワーク内をパスワードが平文で流れるのは勘弁。
わざわざMaildirにする必要もなく、mbox形式で結構。
FreeBSD handbook 29.2.4.1章を眺めて、dovecot2を選んだ。

http://en.wikipedia.org/wiki/Dovecot_%28software%29


インストールと設定


インストールはportsで、mail/dovecot2から。設定はそのままで。
後述するが、make cleanしないこと!


設定ファイルは下記だが。

/usr/local/etc/dovecot

READMEがポツリ。

Configuration files go to this directory. See example configuration files in
/usr/local/share/doc/dovecot/example-config/

ということでまるごとコピー。

# cd /usr/local/share/doc/dovecot/example-config/
# cp ./dovecot.conf /usr/local/etc/dovecot/
# cp -R ./conf.d /usr/local/etc/dovecot/


設定ファイルの書き換え。
受け付けるプロトコルの設定。dovecot.confにて。
pop3だけにした。

# Protocols we want to be serving.
#protocols = imap pop3 lmtp
protocols = pop3

メールボックスの場所

http://wiki2.dovecot.org/MailLocation のTypical settingsに沿う。
mboxで結構。

vi conf.d/10-mail.conf

以下を追加
#mail_location =
mail_location = mbox:~/mail:INBOX=/var/mail/%u


SSL設定

LAN内なので、オレオレ証明書で十分。

http://wiki2.dovecot.org/SSL/DovecotConfiguration
http://wiki2.dovecot.org/SSL/CertificateCreation
上記を読むと、dovecot2にはオレオレ証明書を作ってくれるスクリプト、mkcert.shがついてくるそうな。
これは便利。
しかしこのスクリプトはインストールされない。make cleanしてはいけないというのはそのため。もちろん、あとからでも取り出せるけど。

ただ、デフォルトでは/etc/sslの下に証明書を書き込むようだ。
FreeBSDを使っているんだし、/usr/local/etc/sslの下にしたい。
では設定と作成。

conf.d/10-ssl.confにて。

# PEM encoded X.509 SSL/TLS certificate and private key. They're opened before
# dropping root privileges, so keep the key file unreadable by anyone but
# root. Included doc/mkcert.sh can be used to easily generate self-signed
# certificate, just make sure to update the domains in dovecot-openssl.cnf
#ssl_cert = </etc/ssl/certs/dovecot.pem
#ssl_key = </etc/ssl/private/dovecot.pem
ssl_cert = </usr/local/etc/ssl/certs/dovecot.pem
ssl_key = </usr/local/etc/ssl/private/dovecot.pem


pem作成。

再び、http://wiki2.dovecot.org/SSL/CertificateCreation

Self-signed certificate creation

Dovecot includes a script to build self-signed SSL certificates using OpenSSL. In the source distribution this exists in doc/mkcert.sh. Binary installations usually create the certificate automatically when installing Dovecot and don't include the script.


繰り返しになるが、doc/mkcert.shはインストールされない。
portsでdovecot2を作ったところに戻る。
make cleanしてしまった場合、portmaster等でインストールした場合には、慌てず/usr/ports/mail/dovecot2/で「make extract」すればOK。そして、

$ cd /usr/ports/mail/dovecot2/work/dovecot-2.0.16/doc/

ここでスクリプトを実行してもよいし、どこかにコピーしてもよい。
俺様は、なんだか別のことにも使えそうなので、ホームディレクトリにコピーしておいた。スクリプトdovecot-openssl.cnfを参照するのでこれもコピー。

$ cp ./mkcert.sh ~/bin/
$ cp ./dovecot-openssl.cnf ~/bin/


準備をして実行。以下はsh、あるいはbashでの例。

# mkdir /usr/local/etc/ssl
# mkdir /usr/local/etc/ssl/private
# mkdir /usr/local/etc/ssl/certs

# SSLDIR=/usr/local/etc/ssl sh ./mkcert.sh
Generating a 1024 bit RSA private key
..++++++
..............++++++
writing new private key to '/usr/local/etc/ssl/private/dovecot.pem'
-----

subject= /OU=IMAP server/CN=imap.example.com/emailAddress=postmaster@example.com
SHA1 Fingerprint=FF:FF:FF:FF:FF:FF:FF:FE:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF:FF


では/etc/rc.confを修正して、サーバ起動。

# vi /etc/rc.conf
以下を追加
dovecot_enable="YES"

サーバ起動
# /usr/local/etc/rc.d/dovecot start

ログは/var/log/maillogにでる。



make cleanも忘れずに。

$ cd /usr/ports/mail/dovecot2/
# make clean