NetatalkとAvahiを使ってFreeBSDマシンをTime Capsuleとして使う

Mac OS XにはTime Machineというバックアップ機能があって、ローカル接続したHDDかネットワーク接続したファイルサーバに自動的にバックアップを作成してくれる。デスクトップ型ならローカル接続したHDDを使うのが、高速かつ確実だけど、ノート型の場合はいちいちHDDを接続するのが面倒で、そのうちバックアップを取らなくなる恐れがある。
Time Machineに使えるネットワーク接続したファイルサーバは、Apple純正のTime Capsuleがあるけど、内蔵のHDDが故障したらせっかく取得したバックアップがパーになるから、冗長化されたHDDを使いたい。
そこで、手元のFreeBSDマシンをTime Capsuleっぽく仕立てることにした。
Time Capsuleは、ディスク共有をAFP over TCP、サービス広告をBonjourで実現してるので、それらを適切に設定すればTime Capsuleっぽく動作させることができる。

インストール

portsから、net/netatalknet/avahiをインストールする。それぞれがAFP over TCPBonjourを担当する。NetatalkでTime Machine対応を簡単に実現するには、Netatalk 2.0.5以上が必要である。net/netatalkは現在2.1.5だから問題なし。

Netatalkの設定

ユーザのホームディレクトリは共有せず、Time Machine用ボリュームの共有のみを行う設定とする。
まずはAFP over TCPを担当するafpdの設定を、/usr/local/etc/afpd.confに記述する。デフォルトではユーザごとのホームディレクトリを共有する設定になっているので、-nouservolを追加して共有しない設定にする。認証は、OSのローカルユーザアカウントを使うことにしてる。
(追記)ホームディレクトリの共有は、/usr/local/etc/AppleVolumes.defaultで指定されてるから、該当箇所をコメントアウトすればOK。afpd.confの編集は不要。id:K-HATさん、ご指摘ありがとうございました。

# The "~" below indicates that Home directories are visible by default.
# If you do not wish to have people accessing their Home directories,
# please put a pound sign in front of the tilde or delete it.
# ~
↑これをコメントアウトする

次はafpdで共有するボリュームの設定を、/usr/local/etc/AppleVolumes.defaultに記述する。

/path/to/backup "Time Machine" options:tm

options:tmがTime Machine対応のための設定である。Time Machineは、ディスク容量があればあるだけバックアップを作成するので、共用のボリュームの場合はlimitsizeも指定してTime Machineに使用するディスク容量を制限するとよい。今回はZFSのquotaを使ってディスク容量を制限するため、limitsizeの指定はしなかった。/path/to/backupは、接続の際使用するユーザで書き込み可能としておくこと。

Avahiの設定

/usr/local/etc/avahi/services以下に、広告するサービスの設定ファイルを設置する。以下はAFP over TCPの設定ファイルadisk.serviceである。

<?xml version="1.0" standalone='no'?>
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
  <name replace-wildcards="yes">%h</name>
  <service>
    <type>_adisk._tcp</type>
    <port>9</port>
    <txt-record>sys=adVF=0x100</txt-record>
    <txt-record>dk0=adVN=Time Machine,adVF=0x81</txt-record>
  </service>
</service-group>

adVF=0x81がTime Machine対応ボリュームの証。これでTime Capsuleディスクを探すときに、一覧に登場するようになる。

/etc/rc.confの設定

NetatalkとAvahiが起動時に起動するよう、/etc/rc.confに設定を追加する。

avahi_daemon_enable="YES"
avahi_dnsconfd_enable="YES"
netatalk_enable="YES"
cnid_metad_enable="YES"
afpd_enable="YES"

最後に手動でサービスを起動するか、サーバごと再起動するかする。その後、afpd、cnid_metad、avahi-daemonが起動しているかどうか確認する。
Time Machine環境設定から「ディスクを選択」を実行すると、設定した共有ボリュームが表示される。Time Machineボリュームを選択すれば、ネットワーク経由でTime Machineが実行可能。すばらしい。