ZFS優しすぎ涙がでた。
前口上
試しにZFSを使ってみて(VMware Playerで気軽に試せるようになったとは、なんと便利な世の中か)本当に驚いた。
ディスク繋いでzpoolコマンド一発ですぐ使える。パーティションに頭を悩ませる必要もない。RAIDだって楽勝。ディレクトリごとに圧縮することもできるし、気が変わったら、いつでも止めることもできる。スナップショットも早い。
実は、何年か前にZFSについて調べたときはまだまだバギーな印象だったのと、ZFSを使えるようなパワフルマシンがなく保留にしてたんだけど、すごく損した気分。
いままで幾たび、fdiskやnewfs失敗してひどい目にあったことか。電子の海に消えたデータを思う。
そしてRAID。ソフトRAIDで言えばlvmも有名だが、俺にはもうコマンドが複雑すぎて覚えられない(lv...が論理ボリュームを、pv...が物理ボリュームを扱うんだって?)。
これはすごく危険。
だってソフトRAID含め、こういったディスクを扱うコマンドを使うのは、初期設定と、問題の発生したとき。
俺みたいなオッチョコチョイが、問題が発生して焦っているときに、コマンドが複雑だと二次災害を引き起こすんだって。
…正直に言うと実際に引き起こした。
ZFSならとにかくzpool、zfsさえ覚えておけばいいのだ。
宅鯖ではZFSを使いたいからFreeBSDを選んだ。
そして、いろいろwebを渉猟するにi386でZFSは辛そうなのでamd64とし、下記の通りZFSのバージョンもどーんと上がっているので, 9.0-RELEASEを入れた。メジャーバージョンの最初はちょっと不安ではあるけれど。
あとは、特に難しいこともなく、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。
FreeBSDのnetatalk関連の起動スクリプトは、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なら設定は簡単だし、gmailがsmtp開放してるってんで、まあ入れてみた。
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
スタティックウェブパス、スタティックファイルパスは、FreeBSDでportsから入れた場合だとそれぞれ/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