tinderbox 4.0.0を使ってみる

FreeBSDportsをbuildするためのシステムであるtinderboxの最新版4.0.0がリリースされていたので、FreeBSD 9.1-RELEASEにインストールして使ってみた。

4.0.0になっていろいろと新機能が使えるようになっている。

  • SQLiteサポート
  • tinderbuildがjail(8)を使うようになった
  • WebuiがPDOを使うようになった
  • md(4)を使った多様なファイルシステムを使えるようになった
  • tinderbox 3.3からのアップグレードに対応した
  • ドキュメントが一新された

これ以外にも、細かいところでlftpを使ったjail構築でtxz方式の新しいリリースパッケージに対応してたり、src/portsの更新にsubversionが使えるようになっていたりと、最近のFreeBSDを使うなら絶対に更新すべき。
インストールはports-mgmt/tinderboxから、設定は以下の通り。せっかくなのでSQLiteを使うことにして、lsofはkernel sourceをインストールしていないのでoffにした。

  ┌────────────────────────── tinderbox-4.0.0 ─────────────────────────────┐
  │ ┌────────────────────────────────────────────────────────────────────┐ │
  │ │ [x] CHECK_ROOT    Check if ./tc is run by uid 0                    │ │
  │ │ [x] EMAILS        Support for build failure/completion emails      │ │
  │ │ [x] LOG_COMPRESS  Support bzip'ing the logs                        │ │
  │ │ [ ] LSOF          For killMountProcesses() when using nullfs       │ │
  │ │───────────────────────────────── DB ───────────────────────────────│ │
  │ │ [ ] PGSQL         PostgreSQL database support                      │ │
  │ │ [ ] MYSQL         MySQL database support                           │ │
  │ │ [x] SQLITE        SQLite database support                          │ │
  │ │──────────────────────────────── WEB ───────────────────────────────│ │
  │ │ (*) APACHE        Apache server support                            │ │
  │ │ ( ) HIAWATHA      Hiawatha server                                  │ │
  │ │ ( ) LIGHTTPD      Lighttpd server support                          │ │
  │ │ ( ) NGINX         Nginx server                                     │ │
  │ └────────────────────────────────────────────────────────────────────┘ │
  ├────────────────────────────────────────────────────────────────────────┤
  │                     <  OK  >           <Cancel>                        │
  └────────────────────────────────────────────────────────────────────────┘

インストールが終わったら、setupスクリプトを実行する。

# cd /usr/local/tinderbox/scripts
# ./tc Setup

Welcome to the Tinderbox Setup script.  This script will guide you through
some of the automated Tinderbox setup steps.  Once this script completes ,
you should review the documentation in /usr/local/tinderbox/scripts/README
or on the web at http://tinderbox.marcuscom.com/ to complete your setup.

Hit <ENTER> to get started:

ここでEnterキーを押して

INFO: Checking prerequisites ...
DONE.

INFO: Creating default configuration files ...
DONE.

INFO: Beginning database configuration.
Enter database driver (mysql pgsql sqlite): sqlite
Enter database name (full or relative paths allowed) [tinderbox]:
Is this setting correct:
    Database name : tinderbox
(y/N)y

sqliteを選択してDB名を入力、yを入力したらあとは自動的にセットアップされる。

INFO: Checking for prerequisites for sqlite database driver ...
DONE.

INFO: Loading Tinderbox schema into /usr/local/tinderbox/scripts/tinderbox
...
DONE.

INFO: Database configuration complete.

Congratulations!  The scripted portion of Tinderbox has completed successfully.
You should now verify the settings in /usr/local/tinderbox/scripts/tinderbox.ph
are correct for your environment, then run "/usr/local/tinderbox/scripts/tc
init" to complete the setup.  Be sure to checkout
http://tinderbox.marcuscom.com/ for further instructions.

セットアップが終わったら、設定ファイルを編集する。tinderbox.phは$TINDERBOX_HOST, $TINDERBOX_URI, $SUBJECTあたりをお好みで変更する。

# Configurable options
$TINDERBOX_HOST	 = 'http://tinderbox.example.com';
$TINDERBOX_URI	 = '/tb';
$SUBJECT	 = 'Example Tinderbox:';
$SENDER		 = 'tinderbox@example.com';
$SMTP_HOST	 = 'mail.example.com';

# These should probably be left alone
$LOGS_URI	 = $TINDERBOX_URI . '/logs';
$SHOWBUILD_URI	 = $TINDERBOX_URI . '/index.php?action=list_buildports&build=';
$SHOWPORT_URI	 = $TINDERBOX_URI . '/index.php?action=describe_port&id=';

1;

webui/inc_ds.php.distを元にしてinc_ds.phpを作成する。SQLiteを使うので、DB_DRIVERとDB_PATHを設定すればOK。

<?php

$DB_DRIVER = 'sqlite';
$DB_PATH = '../tinderbox'; # sqlite only

?>

webui/inc_tinderbox.php.distを元にしてinc_tinderbox.phpを作成する。tinderbox_nameとtemplate_dirを好みで設定すれば、ほかはそのままで問題なし。template_dirはdefaultよりpaefchenが個人的な好み。
Apacheでwebuiにアクセスできるよう、Aliasを設定する。こんなファイルを/usr/local/etc/apache22/Includes/tinderbox.confとして作成する。

Alias /tb/logs/ "/usr/local/tinderbox/logs/"
Alias /tb/packages/ "/usr/local/tinderbox/packages/"
Alias /tb/errors/ "/usr/local/tinderbox/errors/"
Alias /tb/wrkdirs/ "/usr/local/tinderbox/wrkdirs/"
Alias /tb/ "/usr/local/tinderbox/scripts/webui/"

<Directory /usr/local/tinderbox/scripts/webui>
    DirectoryIndex index.php
    Allow from all
</Directory>

<Directory ~ /usr/local/tinderbox/(packages|logs|errors|wrkdirs)>
    Options Indexes
    Allow from all
</Directory>

jailを作成する。ftpサーバはほかに近いミラーサーバがあれば、そっちを指定するとネットワークに優しい。

# ./tc createJail -j 9.1 -d "FreeBSD 9.1-RELEASE" -t 9.1-RELEASE -u LFTP -H ftp.jp.freebsd.org

portsを作成する。

# ./tc createPortsTree -p FreeBSD -d "FreeBSD ports tree" -u SVN -P http -H svn.freebsd.org -D ports/head -w http://svnweb.freebsd.org/ports/

buildを作成する。

# ./tc createBuild -b 9.1-FreeBSD -j 9.1 -p FreeBSD -d "9.1-RELEASE with FreeBSD ports tree"

バックグラウンドでbuildするために、/etc/rc.confでtinderdを使う設定をする。

tinderd_enable="YES"
tinderd_directory="/usr/local/tinderbox/scripts"
tinderd_flags="-nullfs"

あとはばりばりと使うだけ。

# ./tc addPort -b 9.1-FreeBSD -d lang/perl5.14
# ./tc addBuildPortsQueueEntry -b 9.1-FreeBSD -d lang/perl5.14

netatalk 3.0.1から3.0.3へのアップグレードが失敗する

netatalk 3.0.3がportsになっていたのでportupgradeを使ってアップグレードしようとしたら、build errorでmakeが失敗した。

afp_config.c: In function 'configinit':
afp_config.c:136: error: too few arguments to function 'load_volumes'
gmake[3]: *** [afpd-afp_config.o] Error 1
gmake[3]: Leaving directory `/usr/ports/net/netatalk3/work/netatalk-3.0.1/etc/afpd'
gmake[2]: *** [all-recursive] Error 1
gmake[2]: Leaving directory `/usr/ports/net/netatalk3/work/netatalk-3.0.1/etc'
gmake[1]: *** [all-recursive] Error 1
gmake[1]: Leaving directory `/usr/ports/net/netatalk3/work/netatalk-3.0.1'
gmake: *** [all] Error 2
*** [do-build] Error code 1

エラーメッセージはこんなかんじ。
ざっと調査したところ、共有ライブラリの問題だったので、古いnetatalk 3.0.1をアンインストールしてから3.0.3をインストールして解決した。
後から気づいたけど、PRになってた。Googleでは引っかからなかったので気づかなかったよ。

ZFSでsnapshotを使うならfreebsd-snapshotがやっぱり便利

再びZFSな環境に戻ってきたので、過去のエントリを参考にして、freebsd-snapshotによるsnapshotのローテーションを設定した。
ZFSのsnapshotはUFSより高速に作成・削除ができるので、使い勝手は最高。理論上は2^64まで作成できるので、世代管理も十分。
zfs set snapdir=visible しておけば、.zfsの下にsnapshotが見えるようになるので、後からあのファイルだけ救出、なんてときも簡単。ZFSってステキ。

ディスクを交換してZFS poolの容量を増やす方法

今回のサーバ更新では、3TBのHDDを2台ミラー構成してZFS poolを作成した。今はこれで十分な容量だけど、将来的に容量が不足した場合はどうにかして容量を増やす必要がある。この場合、だいたい以下2つの方法がある。

  • 別にミラーのZFS poolを作成して、既存のpoolにzpool addする
  • ミラーを構成するHDDを3TBから、より大容量のHDDに交換する

前者は、ディスク増設の物理的なスペースが必要になる、一度addしたら解除できない、などいろいろと考えることが多いので、後者でいきたいところ。
将来に備えて、手順をメモしておく。

  1. 1台目のHDDを交換する
  2. zpool replace "プール名" "ディスク名"で交換したHDDを認識させる
  3. resilver完了まで待つ
  4. 2台目のHDDを交換する
  5. zpool replace "プール名" "ディスク名"で交換したHDDを認識させる
  6. resilver完了まで待つ
  7. zpool online -e "プール名"でZFSが認識する容量を拡張する

プール名とディスク名は、そのときの状況によって読み替えるべし。poolのautoexpandが有効になっていれば、最後の手順は不要かも。

portscoutがfreebsd.orgに登場

freebsd-ports@freebsd.orgのMLを見ていたら、portscoutさんからメールが来てるな〜、ってportscout!!
確認してみると、http://portscout.freebsd.org/が登場してるじゃないの。いつからか分からないけど、知らなかったよ。ここなら稼働率も期待できそうだし、自分用のportscoutを作る意味は無くなったと言えよう。

ZFSのquotaを使ってTime Machineで使う容量を制限する

FreeBSD 9.1-RELEASEとZFSとnetatalk 3.0.1で作るTime Machineサーバ - mteramotoの日記ZFSのquotaを使っている、と書いた内容の補足。
ZFSには、ファイルシステム単位で容量を制限するquotaと、ファイルシステム/ユーザ/グループ単位で容量を制限するuserquotaの2種類のquota機能がある。普通にquotaといって想像するのは後者の方だけど、前者の使いどころもあるのだぜ。
というのも、ZFSはあるプールから切り出したファイルシステムは、プールの容量を共用することになる。具体的に、tankという1TBのプールからa, b, cの3つのファイルシステムを切り出したとすると、aで500GB使うとb, cは空き容量が500GBになっちゃう。Time Machineは空き容量がある限りバックアップを作成する仕様だから、Time Machine用のファイルシステムは容量を制限しないと、同じプールから切り出した他のファイルシステムが使い物にならなくなってしまう。この制限は、ファイルシステム毎で十分だから、まさにZFS quotaの使いどころ。
さて、quotaの設定方法はとっても簡単。

# zfs set quota=600g tank/a

これで、tankプールのaファイルシステムに600GBのquotaが設定できた。

FreeBSD 9.1-RELEASEとZFSとnetatalk 3.0.1で作るTime Machineサーバ

自宅サーバを新しくしたので、これを機会にnetatalkを2.2系から3.0系に新しくした。
インストールはportsのnet/netatalk3から、ZEROCONFオプションを有効にしてインストールする。自動的に依存関係が設定されて、net/avahi-appがインストールされる。
設定は、/usr/local/etc/afp.confのみ設定する必要がある。Time Machineとして使うディレクトリを指定する。うちのafp.confはこんな感じ。

;
; Netatalk 3.x configuration file
;

[Global]

; [Homes]
; basedir regex = /xxxx

[Time Machine]
path = /backup/tm
time machine = yes

ファイルシステムの空き領域を全部Time Machineに使われたくない場合は、vol size limitを指定すること。うちはZFSでQuotaを設定してるので、vol size limitは設定しないことにしてる。
あとは/etc/rc.confにdaemonの起動設定を追加して、avahiとnetatalkを起動すれば準備完了。

/etc/rc.conf

dbus_enable="YES"
avahi_daemon_enable="YES"
avahi_dnsconfd_enable="YES"
netatalk_enable="YES"

daemon起動。

# service dbus start
# service avahi-daemon start
# service avahi-dnsconfd start
# service netatalk start

あとはMacからTime Machineの環境設定を開いて、"ディスクを選択"ボタンを押したとき表示されるディスク一覧に表示されていればOK。
netatalk 2.2系で運用していた頃に比べて、ディスクをマウントしてバックアップを開始するまでの時間が短くなった気がするけど、気のせいか。Time Capsuleは使ったことがないから分からないけど、少し気になるくらいの時間がかかる。Time Capsuleも安くなったし、比較のためにも一回買って使ってみようかな。熱で壊れやすいと評判だけど、Macと同時購入すれば、AppleCareの対象にもなるし。802.11ac対応したら考えてみよう。

参考

APPLE Time Capsule 2TB MD032J/A
by カエレバ
APPLE Time Capsule 3TB MD033J/A
by カエレバ