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