Netatalk 3.0.x and Samba

2014.01.13

このページはnetatalk 3.0.xの時代のものなので既に古いです。
最近の情報については、Netatalk and Sambaのページを御覧ください。


Unix系OSをOS Xのファイルサーバとする場合、AFP、SMB(CIFS)、NFS等、様々なプロトコルから選ぶことができます。
sambaだけを使えば、簡単にOS X/Windows両対応のサーバに出来そうですが、いまのところ、この方法はお勧めできません。
OS XはUNIXなのでNFSが最適と考える人もいますが、この方法もお勧めしません。
Macからはnetatalk、Windowsからはsambaへ接続することをお勧めします。理由は、それぞれのファイルシステムは独自の仕様を持つからです。

OS XのファイルシステムHFS+は、以下のような特徴を持ちます。

WindowsのファイルシステムNTFSは、以下のような特徴を持ちます。

それぞれの仕様に合わせたプロトコルがAFPでありSMBです。
ファイル本体のみ正常に扱うことが出来れば他のメタデータは必要ないという考え方もありますが、メタデータはOSやアプリケーションが何らかの理由で扱うため、これを喪失すると思わぬトラブルに遭遇します。
Mac/Win両対応ファイルサーバを構築するならnetatalk/sambaの組み合わせにすべきです。

OS X 10.9 Mavericks同士の接続はAFPよりもSMB2を優先します。確かに、Mac同士をSMBで接続すると正常にファイル共有できますが、これはMacのSMBサーバ及びSMBクライアント機能が独自の仕組みを持っているからです。Sambaはそのような機能を持っていないので、イマイチ正常に動作しません。NetatalkとSambaの両方が動いているサーバがあった場合、MacはNetatalkを優先します。
OS X Mavericksのファイル共有はSMB2が優先:HAT blog

将来的にNetatalkとSambaがマージされるという話がありますが、それまでは色々と面倒なわけです。
NetatalkとSambaがマージ

このページはnetatalk 3.0.xについて説明しています。現行安定版の3.1.xの解説はまだ書いていません。
古いバージョンは仕様が異なるので、以下のページをご覧ください。
Netatalk 2.1.x and Samba - Time Machine対応だが不完全なのでLion以降でバックアップできない。Bonjour対応なし。ACL/LDAP対応なし。
Netatalk 2.2.x and Samba - Time Machine対応なのでLion以降でもバックアップできる。Bonjour対応あり。ACL/LDAP対応あり。

ここでは特に触れていない速報バグ情報、各プラットフォームでのインストール実例などはblogの方に書いています。
netatalk:HAT blog


問い合わせや開発への参加

sambaは裾野が広いので、バグを見つけても放っておけばそのうち直ってるかもしれません。
一方、netatalkはユーザ数が少なく、開発を行っているのはFrank Lahmただ一人であり、あとは極少数がパッチを提供しているだけです。問題を発見した本人が報告しないと永久に直らない可能性が大です。

netatalkの開発はSourceForgeで行なわれているので、これを使って情報交換してください。
メーリングリストは比較的活発なので、ここに問い合わせたりパッチを送るとすぐにでも反応があります。ただし、誰にも判らないような質問をすると放置されることもあります。ユーザが少ないんだからしょうがないです。
管理者用と開発用がありますが、両者の区別がはっきりしていないので両方読まないと全貌が見えてきません。

管理者用メーリングリストのアーカイブ (見やすいが文字化けしやすい)
管理者用メーリングリストのアーカイブ (見にくいが文字化けしにくい)
Netatalk-admins Info Page - 参加するためのページ

開発用メーリングリストのアーカイブ (見やすいが文字化けしやすい)
開発用メーリングリストのアーカイブ (見にくいが文字化けしにくい)
Netatalk-devel Info Page - 参加するためのページ

Web上に書き込めるシステムもあります。

SourceForge.net: netatalk: Bugs
SourceForge.net: netatalk: Feature Requests
SourceForge.net: netatalk: Patches

日本語のメーリングリストもあります。

Netatalk日本語メーリングリスト

netatalkの開発中のソースの入手はgitコマンドを使います。
Git版はconfigureスクリプトが入ってないので、まず./bootstrapを実行してconfigureスクリプトを生成します。
ただしautotools (autoconf, automake, libtoolなど)のバージョンが古いとmake中にコケます。大抵Makefileの文法がおかしいというエラーになります。この場合、なんとかして新しいautotoolsが入ったシステムを用意して./bootstrapだけ実行し、ソースディレクトリをまるごと現システムにコピーしてからconfigureを実行すればうまくいくかもしれません。

参考: Netatalk 3.0 Manual - Chapter 2. Installation - Source packages - Git

しかし、SourceForgeのシステムは不便なので、同じソースコードがGitHubにも置かれています。最近はGitHub上で開発してからSourceForgeに反映するという手順になってきました。

SourceForge上のソースコードのページ: netatalk / Code
GitHub上のソースコードのページ: Netatalk/Netatalk · GitHub

幾つかブランチがありますが、主要なのは以下のものです。他にも開発の都合で一時的なブランチが作られることがあります。

branch-netatalk-3-1

現行安定版のnetatalk 3.1.xを開発するブランチです。随時更新されています。

branch-netatalk-3-0

旧安定版のnetatalk 3.0.xを保守するブランチです。随時更新されています。

master

リリース用のtarballを作成するためのブランチです。リリースする直前に作業が行われるだけなので、滅多に更新されません。


旧netatalk 2.xユーザのための情報

configureオプションが違う

例えば、Debianユーザの場合は--enable-debianを指定してましたが、今度は--with-init-style=debianと書きます。

configure時にPAMが有効になっている場合、--with-pam-confdir=を適切に設定していないと、クライアントからログインできない可能性が大です。

configure時にD-Busが有効になっている場合、--with-dbus-sysconf-dir=を適切に設定していないと、afpstatsコマンドが動作しません。

ファイルの置き場所が違う

afpd -Vで確認してください。

設定ファイルがシンプルに

2.xは設定ファイルが沢山ありましたが、ほぼ全て廃止になりました。新ファイルafp.confでほぼ全て設定できます。このファイルはsambaのsmb.confをマネしています。manpageまで酷似しています。
拡張子とType/Creatorの対応はextmap.confを使いますが、普通は設定不要でしょう。
新旧パラメータの対応関係は、以下のページの下の方の表をみてください。
Chapter 4. Upgrading from Netatalk 2

デフォルト値が一部変更

旧設定options:upriv設定してなかった場合、新設定unix priv = noを使ってください。新しいデフォルト値はyesです。

ファイル名の扱いが一部変更

旧設定options:usedots設定してなかった場合、先頭のドットが「:2e」に変換されてましたが、この機能はなくなりました。netatalk 3を起動すると随時ドットに変換されます。
Finderで「/」、Terminal.appで「:」に見えていた文字は「:2f」に変換されていましたが、netatalk 3では「:」で保存されます。netatalk 3を起動すると随時変換されます。
つまり、HEX (CAP)エンコーディングは使いません。勝手に変換されるので気にする必要もないでしょう。

起動手順がシンプルに

netatalk 2では起動スクリプトが各デーモンを個別に起動していましたが、この方法は廃止です。
netatalk 3では新たにnetatalk (8)という名前のデーモンが導入されたので、起動スクリプトはnetatalkデーモンを起動するだけです。
netatalkデーモンさえ起動しておけば、あとは必要に応じてafpdcnid_metadcnid_dbdが勝手に起動/停止します。

邪魔な隠しディレクトリは一掃

netatalk 2では、様々なメタデータをAppleDoubleフォーマットにして.AppleDouble/ディレクトリに入れていました。
netatalk 3では、これを[user.]org.netatalk.Metadataという名前の拡張属性にAppleDoubleフォーマットのまま突っ込みます。
旧式のメタデータを発見すると随時拡張属性に変換します(convert appledouble = yes)。dbdコマンドを使えば一気に全部変換できます。
Solaris系でZFSを使っている場合は本当に全部拡張属性に入ります。それ以外の環境の場合、リソースフォークだけはサイズが大きすぎて拡張属性に入りきらないので、「._」で始まるファイル名で保存します。最近はリソースフォークが付いているファイルは少ないので、滅多にこのファイルは作られないでしょう。

CNIDを管理する.AppleDBディレクトリはvar/netatalk/CNID/(ボリューム名)/.AppleDBに自動的に移動されます。

.AppleDesktopディレクトリはvar/netatalk/CNID/(ボリューム名)/.AppleDesktopに自動的に移動されます。

つまり、netatalk 2が作っていた隠しディレクトリは全部なくなります。ただし、拡張属性が使えないファイルシステムを使っている場合は、全てのファイルに対して「._」で始まるファイルが生成されます。

Mac側が作る隠しファイルはどうしようもないです。

廃止された機能

AppleTalk廃止なので、接続できるのはAFP over TCP対応である漢字Talk 7.5.5(要Open Transport J-1.1.2)以降。
SLP対応は廃止なので、サーバを発見できるのはBonjour対応であるMac OS X 10.2以降。
マルチサーバ機能廃止なので、1つのサーバしか定義できない。
サーバ側の文字コードがUnicodeでない場合、つまりEUC-JP等の場合、いわゆる機種依存文字が使えません。たとえば「まるいち」①とかです。CAP (HEX)エンコーディングが廃止になったからです。いまどきのサーバはUTF-8だから気にしなくていいです。

安心してよいところ

要求するライブラリのバージョンは上がってません。BDBは4.6以降のまんまです。netatalk 2.2.xをビルドできた環境なら、たぶんnetatalk 3.0もオッケーです。
設定ファイルafp.confを新たに書かなければいけませんが、簡単です。クソ難しいnetatalk 2の設定ができた人ならば問題ないでしょう。


インストール手順

以下の場所で様々な環境でのインストール実例を紹介しています。

参考: Netatalk 近状:HAT blog

地道に自分でインストールする場合は、まずライブラリ類のインストールから開始します。これらのライブラリは大抵のOSでパッケージが配布されています。ただし、Berkeley DBだけはバージョンを選ぶのでソースからビルドする必要があるかもしれません。

参考: Netatalk 3.0 Manual - Chapter 2. Installation

Berkeley DB (絶対必要)

CNIDを扱うためにBerkeley DB 4.6以上が必須です。
パッケージの名前は、Debian系の場合libdb4.8-dev、RedHat系の場合libdb-develdb4-develというように、見落としやすいので注意してください。
バージョンが適切でないとconfigureの途中でエラーが出て止まるので、適切なバージョンのBerkeley DBをインストールしてください。バージョン番号付きのディレクトリにインストールされるので、既に入っているBerkeley DBを上書きするようなことはありません。この場合、configure時に自動認識しないので、--with-bdb=にてパスを指定する必要があります。

Berkeley DBのありか: Berkeley DB | Oracle Embedded Database

OpenSSLやLibgcrypt (かなり重要)

下の「ユーザ認証」のところで説明するように、暗号化パスワードを使う為にはOpenSSLやLibgcryptをインストールしておく必要があります。前者でDHXが有効になり、後者でDHX2が有効になります。
クライアントがMac OS X 10.5 〜 10.6である場合はどちらか一方、または両方をインストールしておくべきです。
クライアントがOS X 10.7 Lion以降である場合はLibgcryptを入れておくべきです。

OpenSSLのホームページ: OpenSSL: The Open Source toolkit for SSL/TLS
Libgcryptのホームページ: Libgcrypt - Free Software Directory - Free Software Foundation

Bonjourのためデーモン (お勧め)

Bonjour (Zeroconf)を使うと、Mac OS X 10.2以降で便利になります。Macからサーバアイコンが見える、そのサーバアイコンを変えることができる、Time Machineボリュームが見える等の効能があります。
特にTime Machineを使っている人は是非インストールしてください。Macで重大な問題が発生した場合、修復ディスクやインストールメディアで起動してTime Machineからリストアするわけですが、このときBonjourにてバックアップを発見しなければなりません。Bonjourが動いていないと発見できないので、手動で煩雑な処理をする必要があります。テンパっているときにその作業ができますか?

ZeroconfデーモンはAvahimDNSResponderのどちらか一方が使えます。
大抵のLinuxディストリビューションはAvahiパッケージを用意しています。自分でAvahiをビルドする場合はD-Busサポート(--enable-dbus)を有効にしてください。
一方、BSD系やSolaris系だとmDNSResponderが好まれるかもしれません。

Avahiのホームページ: Avahi
mDNSResponderのソースのありか: Source Browser

ACL関連ライブラリやOpenLDAP (使う人だけ)

Mac OS X 10.5 Leopard以降、パーミッションの扱いが「ディレクトリサービスを用いたUUIDベースのACL」というややこしいものになりました。これに対応しない場合、パーミッションの扱いが変です。
ばっちりパーミッションを扱うためには、ACL及びOpenLDAP対応でビルドする必要があります。
ACL関連ライブラリはOSによって異なるので、頑張って調べてインストールしてください。Debian系はlibacl1-devというパッケージです。RedHat系はlibacl-develというパッケージです。
OpenLDAPの設定はかなり面倒くさいので泣きたくなります。

OpenLDAPのホームページ: OpenLDAP, Main Page

libevent (あまり重要でない)

netatalkという名前のデーモンは、libeventライブラリ(バージョン2以降)を使って他のデーモンを操ります。
netatalkのソース内にlibevent2がバンドルされているので、特に自分でインストールする必要はありません。
既にインストールされているlibevent2を使う場合は、--without-libeventを使ってください。

libeventのホームページ: libevent

tdb (あまり重要でない)

netatalkはBerkeley DBを使ってCNIDを管理しますが、もしこれのデータベースファイルが壊れた場合、「Something wrong with the volume's CNID DB, using temporary CNID DB instead.」という警告を出してリードオンリーに変更し、メモリ上でCNIDを管理します。このとき使われるのがtdbライブラリです。
netatalkのソース内にlibtdbがバンドルされているので、特に自分でインストールする必要はありません。
既にインストールされているtdbを使う場合は、--without-tdbを使ってください。

tdbのホームページ: tdb: Main Page

CrackLib (使う人だけ)

クライアントからパスワード変更するときに、強度をチェックするライブラリです。家庭内LANでは気にしないかもしれませんが、大規模サーバでは検討すべきかもしれません。

D-Bus (使う人だけ)

netatalk 3.0.3からはafpstatsコマンドを使ってユーザの接続状態を確認できますが、そのためにD-Busの機能を使います。
同様のコマンドにmacusersがありますが、問題点が指摘されているので将来廃止になるでしょう。

上記AvahiはD-Busの機能を使うので、普通のディストリビューションではD-Busも用意されています。

DTrace (使う人だけ)

SolarisやBSD系のDtraceの機能を使って動的なトレースをとることができます。つまり解析用です。LinuxもSystemTapの互換機能により可能です。
でも、よく知らないのでパス。

iconv実装の確認 (Solaris系だけ要確認)

以下のコマンドを実行して、UTF-8SHIFT_JISに対応していることを確認してください。

$ iconv -l

SolarisやOpenIndianaでは、「unicode」という名前のパッケージが入っていないとSHIFT_JISが扱えません。
NetatalkはSHIFT_JISのラッパーのような動作をおこなってMAC_JAPANESEを実装しているので必要です。

最近のLinux系やBSD系は問題ないと思います。
関数iconv()はlibc実装とlibiconv実装の2種類がありますが、netatalkの場合はどちらでも問題ありません。

古いnetatalkのアンインストール

古いバージョンのnetatalkをインストールしているなら、設定ファイルをバックアップしてから、バイナリ類の削除です。古いものが残っていると色々と悪さします。
ソースから入れていた場合は、そのソースのディレクトリに移動してmake uninstallです。

$ cd netatalk-xxx/
# make uninstall

パッケージで入れている場合は削除用のコマンドが用意されているでしょう。Debian系ならaptitude removeとかaptitude purge、RedHat系ならrpm -eです。

netatalkのインストール

やっとnetatalkのインストールです。ソースはこちら。
Netatalk - Networking Apple Macintosh through Open Source

ソースを展開。

$ tar zxvf netatalk-XXX.tar.gz
または
$ tar jxvf netatalk-XXX.tar.bz2

出来上がったディレクトリに移動。

$ cd netatalk-XXX/

まず、configureのオプションを確認。

$ ./configure --help

大抵のライブラリのオプションはautoになっているので、正しくインストールされていれば指定する必要がありません。
とりあえずconfigureをおこない、最後の表示をみて、認識してない場合はライブラリの確認とオプションの設定をしてください。

では、configureしましょう。

$ ./configure \
        --with-init-style=debian \
        --with-cracklib \
        --with-pam-confdir=/etc/pam.d \
        --with-dbus-sysconf-dir=/etc/dbus-1/system.d

この例では、自動認識しないオプションだけを設定しています。自動認識するのにゴニョゴニョ設定すると、逆におかしくなるケースがあるのでお勧めしません。
--with-init-style=は、そのOSに適した起動サービスを有効にするオプションです。これについては、下の「netatalkの起動」の項を参照してください。
PAMが有効になっている場合は、--with-pam-confdir=を正しく指定しないとログインできない可能性が大です。
D-Busが有効になっている場合は、--with-dbus-sysconf-dir=を正しく指定しないとafpstatsコマンドが動作しません。

configureが正常に終了すると、最後に要約が表示されます。

Compilation summary:
    CPPFLAGS       = -I$(top_srcdir)/include -I$(top_builddir)/include 
    CFLAGS         = -D_U_="__attribute__((unused))" -g -O2
    LIBS           = -ldl  -lcrack
    PTHREADS:
        LIBS   = 
        CFLAGS = -pthread
    SSL:
        LIBS   =  -L/usr/lib64 -lcrypto
        CFLAGS =  -I/usr/include/openssl
    LIBGCRYPT:
        LIBS   = -L/lib/x86_64-linux-gnu -lgcrypt
        CFLAGS = 
    PAM:
        LIBS   =  -lpam
        CFLAGS = 
    WRAP:
        LIBS   = -lwrap
        CFLAGS = 
    BDB:
        LIBS   =  -L/usr/lib64 -ldb-5.1
        CFLAGS = 
    ZEROCONF:
        LIBS   =  -lavahi-common -lavahi-client
        CFLAGS =  -D_REENTRANT
    LDAP:
        LIBS   =  -lldap
        CFLAGS = 
    LIBEVENT:
        bundled
    TDB:
        bundled
Configure summary:
    INIT STYLE:
         debian
    AFP:
         Extended Attributes: ad | sys
         ACL support: yes
    CNID:
         backends:  dbd last tdb
    UAMS:
         DHX     (PAM SHADOW)
         DHX2    (PAM SHADOW)
         RANDNUM (afppasswd)
         clrtxt  (PAM SHADOW)
         guest
    Options:
         Zeroconf support:        yes
         tcp wrapper support:     yes
         quota support:           yes
         admin group support:     yes
         valid shell check:       yes
         cracklib support:        yes
         ACL support:             auto
         Kerberos support:        yes
         LDAP support:            yes
         dbus support:            yes
         dtrace probes:           yes
    Paths:
         Netatalk lockfile:       /var/lock/netatalk
         init directory:          /etc/init.d
         dbus system directory:   /etc/dbus-1/system.d
         pam config directory:    /etc/pam.d
    Documentation:
         Docbook:                 no

このCompilation summary:Configure summary:をよーく見て、必要なライブラリが全部有効になっていることを確認してください。ライブラリをうまく認識しない場合は、そもそもライブラリがインストールされているか確認してください。
Paths:に書かれているdirectoryが実在することを十分に確認してください。
Docbookは開発者がドキュメントを生成するときに使うものなので必要ないです。

めでたくconfigureが終わったら、構築してインストール。

$ make
# make install

sambaのインストール

パス。ここで説明しなくても資料は沢山あるでしょう。


netatalkのafp.confの設定

参考: Netatalk 3.0 Manual - afp.conf

基本的な設定例

[Global]

[Homes]
    basedir regex = /home

[私のタイムマシーン]
    path = /where/my/backup
    time machine = yes
    vol size limit = 1024

[みんなの共有はここ]
    path = /where/all/users
    file perm = 0660
    directory perm = 0770

sambaのsmb.confをマネしたフォーマットです。ただしsmb.confとは違ってcase-sensitiveなので注意してください。[Global][Homes]は頭文字が大文字です。

[Global]セクションはサーバの設定を行います。afp.confのmanpageで(G)になっているパラメータを書くことができます。デフォルトでちゃんと動くので、あまり書くことがないです。
それ以外のセクションはボリュームの設定であり、manpageで(V)になっているパラメータを書くことができます。

[Homes]セクションはホームディレクトリの設定です。afp.confのmanpageで(H)になっているパラメータは[Homes]専用です。basedir regexhome nameがあります。basedir regexを必ず設定してください。しないと機能しません。あと(V)のパラメータも一通り使えますが、pathだけは通常ボリュームと使い方が違うので注意が必要です。

time machine = yesを使うことで、Time Machine用のボリュームを「私のタイムマシーン」という名前で公開しています。
vol size limitはボリュームのサイズとして嘘を報告する設定です。単位はMiBです。この例では1GiBと報告してバックアップ容量を制限しています。このオプションはクセが強いので、manpageをよく読んで理解してから使ってください。

みんなの共有はここ」という名前のボリュームは、パーミッションの設定を緩くしています。file permdirectory permはそれぞれファイルとディレクトリのパーミッションとORを取って保存するものです。

かなり古いMacがあるよ

[ボリューム名]
    path = /xxx/yyy
    file perm = 0600
    directory perm = 0700

Mac OS X 10.510.6はFinderからパーミッションをいじると「0000」になってしまうという、とんでもない問題があるので、この設定をしています。この設定例だと、少なくともファイル所有者は確実に読み書き出来ます。なお、ACLとOpenLDAPが有効になっている場合は、パーミッションは正しく設定されるはずなので、これらの設定は必須ではありません。

[Global]
    mac charset = MAC_JAPANESE

Mac OS 9以前がある場合、AFPサーバはクライアントの文字コードを検出する手段がないので指定してやる必要があります。OS Xの場合はUnicode (UTF8-MAC)に固定されているのでこの設定に左右されません。

[Global]
    uam list = uams_cleartxt.so uams_dhx.so uams_dhx2.so

最近のOS Xならばuams_dhx2.soがあれば十分です。
しかし、クライアントが古ければ古いほど旧式の認証方法が必要です。Mac OS X 10.1以前はユーザ認証にDHX2が使えないので、DHXを使うことになります。
Debian/Ubuntu系のバイナリパッケージがリリースされてもライセンスの関係でDHXが入らないでしょう。この場合、自分でビルドしてDHXを使えるようにするか、もっとセキュリティの甘いクリアテキストを使う必要があるでしょう。詳しくは下の「ユーザ認証」を読んでください。

漢字Talk 7.5.5 (要Open Transport J-1.1.2)よりも古いMacは接続不可能なので諦めてください。なぜならnetatalk 3.xはAppleTalkを廃止したからです。

ウチのサーバ機はUnicodeベースじゃないよ

[Global]
    unix charset = EUC-JP

EUC-JPベースの場合はこのような設定をしてください。Unix側のファイル名の文字コードとか、設定ファイルの文字コードがEUC-JPになります。逆の言い方をすれば、EUC-JPにない文字は扱えません。netatalk 2ではMacJapanese特有の機種依存文字が扱えましたが、netatalk 3では不可能です。CAPエンコーディングを廃止したからです。

afpstatsコマンドを使えるようにする

[Global]
    afpstats = yes

afpstatsコマンドを使うには、D-Bus対応でコンパイルし、この設定を書く必要があります。

ログファイルの設定

[Global]
    log file = /var/log/netatalk.log

ログの保存先です。指定しなければsyslogに渡されます。

デバッグ用にログをとる

[Global]
    log level = default:maxdebug

ログレベルのデフォルト値はdefault:noteであり、普通はこれで十分です。
ちょっと詳しくしたいならdefault:infoです。
解析が難しい問題が発生したときはdefault:maxdebugにしてデバッグします。これは強烈に詳しいので頭痛を誘発するし、負荷が増えて重くなるので通常は使いません。

余計なファイルを隠す

[ボリューム名]
    veto files = /Thumbs.db/desktop.ini/
    delete veto files = Yes

サーバ上に存在するファイルをnetatalk経由では全く存在しないように嘘をつく設定です。
この例では、samba経由のWindowsが作る隠しファイルを、netatalk経由のMacから見えないようにしています。
このveto filesの設定を行なうと、netatalk経由でフォルダを削除しようとしたときにエラーになる事があります。フォルダ内にファイルが隠れているからです。そこでdelete veto filesを設定すれば、隠したファイルをまとめて削除してくれるようになります。delete veto filesはnetatalk 3.0.5の新機能です。


sambaのsmb.confの設定

かなり古いWindowsがあるよ

[global]
    dos charset = CP932

dos charsetは旧クライアント (DOS/Windows 3.x/95/98/ME)からアクセスしたときのファイル名の文字コードです。Windows NT系 (NT/2000/XP/Vista/7/8)からの接続はこの設定に左右されず、UTF-16に固定です。

ウチのサーバ機はUnicodeベースじゃないよ

[global]
    unix charset = EUCJP-MS
    display charset = EUCJP-MS (samba 4で廃止)

EUC-JPベースの場合はこのような設定をしてください。EUCJP-MSとは、EUC-JPを拡張してWindowsが使う特殊な文字を使えるようにした文字コードです。iconv()EUCJP-MSに対応している必要があります。
display charsetはsamba 4で廃止になったので設定する必要はありません。

排他処理問題を軽減する

ここで説明しているのは「軽減する」方法です。
先にSamba経由で開いているファイルを後からNetatalk経由で開いたときに排他制御が働くようにします。
先にNetatalk経由で開いている場合は排他制御が働かないので要注意です。将来的には可能になるでしょうが、現在は無理です。これが問題になる場合、このページで説明しているNetatalk/Sambaの併用はお勧めできませんので、他の方法を検討してください。

SMB (CIFS)にはファイルをロックする機能(oplock)というのがあります。SMBクライアント側でファイルをキャッシュして転送量を減らすものです。システム自身がoplockに対応していないとロック中のファイルをUnix側(netatalk経由も含む)から編集したときにファイルが壊れる可能性があるので、これをを無効にする必要があります。

[共有名]
    oplocks = No

Linuxのようにkernel自身がoplockに対応している場合はoplockが問題なく使えるので次のようにします。

[global]
    kernel oplocks = Yes
[共有名]
    oplocks = Yes

oplockの動作状況はsmbstatusコマンドで確認出来ます。samba経由で一度ロックしておき、Unix側またはnetatalk側から同じファイルをいじったときにロックが外れる事を確認することをお勧めします。

しかし、Windowsの代替データストリームを保存する為に拡張属性の機能streams_xattrを使っている場合、kernel oplocksと共存出来ないので次のようにします。

[global]
    kernel oplocks = No
[共有名]
    oplocks = No
    vfs objects = streams_xattr

他にもlevel2 oplocksとかfake oplocksというパラメータがあります。ややこしい…

余計なファイルを隠す

[共有名]
    veto files = /.DS_Store/Network Trash Folder/TheFindByContentFolder/TheVolumeSettingsFolder/Temporary Items/.TemporaryItems/.VolumeIcon.icns/Icon?/.FBCIndex/.FBCLockFolder/
    delete veto files = Yes

サーバ上に存在するファイルをsamba経由では全く存在しないように嘘をつく設定です。
この例では、netatalk経由のMacが作る隠しファイルやディレクトリを、samba経由のWindowsから見えないようにしています。
このveto filesの設定を行なうと、samba経由でフォルダを削除しようとしたときにエラーになる事があります。フォルダ内にファイルが隠れているからです。そこでdelete veto filesを設定すれば、隠したファイルをまとめて削除してくれるようになります。


CNIDの管理

MacOSの為に作られたHFS+というファイルシステムでは、ファイルやフォルダにCNID (Catalog Node ID)と呼ばれる番号を付けて管理しています。File ID、Directory IDと呼ぶ場合もあります。これはAFPの場合も同様です。
CNIDはinode番号の概念に似ていますが同じではありません。netatalkはCNIDの管理方法をいくつか用意しており、これをcnid schemeといいます。デフォルトのdbdでは、Berkeley DBを使って var/netatalk/CNID/(ボリューム名)ディレクトリでCNIDのデータベースを管理します。

cnid scheme = dbdこれがデフォルト。CNIDデーモンがデータベースを一括管理し、別ディレクトリにデータを保存する。各afpdはCNIDデーモンと通信するだけ。
cnid scheme = tdbCNID管理ディレクトリが読み書き出来ないときに、代わりとしてメモリ上でCNID管理する。
cnid scheme = lastafpdプロセス毎にその場限りの管理をする。これを使うと自動的にリードオンリーになる。CDROMを共有する場合等に使うもの。

通常はdbdで運用しますが、データベースに何らかの不具合が発生した場合は自動的にtdbに移行する仕組みになっています。

管理ディレクトリ内のデータベースは滅多に壊れませんが、もし壊れた場合はメンテ用のdbdコマンドで修復します。このコマンドはnetatalkを起動しっぱなしで使います。それでも直らない場合は-fオプションを使えば、データベースを全部削除してから再構築します。

参考: Netatalk 3.0 Manual - cnid_metad
参考: Netatalk 3.0 Manual - cnid_dbd
参考: Netatalk 3.0 Manual - dbd


Time Machine対応

Bonjourで発見できる場合

Time Machineを使う人は、Zeroconf対応でビルドすることを強くおすすめします。設定は上の方を読んでください。
手順は以下のとおり。

  1. afp.confにてtime machine = yesを設定。必要に応じてvol size limitも設定。
  2. Time Machineでそのボリュームを選ぶ。
  3. 初回バックアップを開始すると、ボリューム内に勝手にイメージバンドルが作られ、勝手にバックアップされる。
  4. 2回目以降は勝手にマウントされ、勝手にバックアップされる。

Bonjourで発見できない場合

Zeroconf対応でビルドしてない場合や、netatalkサーバが別セグメントにある場合はTime Machineボリュームが発見できません。その場合、予め手動でTime MachineボリュームをマウントしてからTime Machineの設定画面を開けば見えるはずです。
Macが起動しなくなった場合、修復ディスクから起動するわけですが、このときTime Machineボリュームが発見できません。修復ディスク上で手動でTime Machineボリュームをマウントして復旧する練習をしておいてください。かなり煩雑な作業になります。


ユーザ認証

netatalkのユーザ認証

AFPのユーザ認証方法(UAM)は、uam listオプションで設定します。デフォルト値はuams_dhx.so uams_dhx2.soです。
UAMにはパスワードを暗号化するもの、しないもの、そもそもパスワードを使わないもの等、色々あります。古い認証方法は8文字制限があるので注意してください。

名前 netatalkのモジュール 説明
No User Authent uams_guest.so ユーザ認証なし。パスワードは使わない。すなわちゲスト接続。
Cleartxt Passwrd uams_cleartxt.so クリアテキスト(平文)パスワード。暗号化なし。8文字制限。Leopard以降はデフォルトで使用禁止。
Randnum Exchange uams_randnum.so 乱数交換。56ビットDES。弱い暗号化。8文字制限。Lion以降ではデフォルトで使用禁止。
2-Way Randnum uams_randnum.so 双方向乱数交換。56ビットDES。弱い暗号化。8文字制限。afppasswdファイルで独自管理。Lion以降ではデフォルトで使用禁止。
DHCAST128 uams_dhx.so (DebianやUbuntuには入ってない) Diffie-Hellman交換。別名DHX。128ビットSSL。強い暗号化。Lion以降ではデフォルトで使用禁止。
DHX2 uams_dhx2.so Diffie-Hellman交換2。更に強い暗号化。オススメ。
Client Krb v2 uams_gss.so Kerberos V認証。
Recon1 なし 再接続。
GSS なし 不明。Appleのドキュメントに載ってないので実装できない。OS X Lionで追加された認証のようだ。
SRP なし 不明。Appleのドキュメントに載ってないので実装できない。Time Capsuleに追加された認証のようだ。

クライアントにOS X 10.7 Lion以降がある場合はDHX2を使えるようにしてください。これよりセキュリティが弱いものは使えなくなっています。

uams_cleartxt.souams_dhx.souams_dhx2.soは、netatalkのコンパイル時のオプションにより、Unixのpasswdファイル、shadow passwd、PAMのどれかを使うことになります。
uams_gss.soはよく知らないのでパス。

DHXパスワードを使う為には、OpenSSLライブラリを使ってnetatalkをコンパイルする必要があります。DHX2パスワードを使う為にはLibgryptライブラリが必要です。
DebianやUbuntuのnetatalkバイナリパッケージにはライセンスの関係でuams_dhx.soが入っていません。Mac OS X 10.2以前はuams_dhx2.soが使えないので注意が必要です。セキュリティ的に不安なuams_cleartxt.soを使うか、自分でビルドしてuams_dhx.soを使えるようにするか、どちらかです。

sambaのユーザ認証

最近ちゃんと調べてないのでパス。


ポート番号

ファイアウォールの設定で悩む人がいるので、関連のあるポート番号の一覧を載せておきます。
IPv6を有効にしている人はv4とv6の両方を確認しないとハマります。

137 netbios-ns NetBIOS名前解決。nmbdが使う。UDP。
138 netbios-dgm NetBIOS Datagram Service。nmbdが使う。UDP。
139 netbios-ssn 古いSMB。smbdが使う。NetBIOS名を解決してから接続する。
445 microsoft-ds 最近のSMB。smbdが使う。NetBIOS名を使わず接続する。
548 afpovertcp AFP over TCP。afpdが使う。Time Machineは548じゃないとダメだが、普通のファイル共有なら別のポート番号でも動く。
901 - Samba Web Administration Tool。swatが使う。そろそろ廃止の方向らしい。IANAには登録されてない。プロトコルとしてはhttp。
4700 - CNIDサーバがafpdとの通信に使う。IANAには登録されてない。通常はlocalhost内での通信なので外部に開く必要はない。
5353 mdns Multicast DNS。AvahiやmDNSResponderが使う。AFPサーバやTime Machineボリュームを宣伝する。UDP。

これ以外にも、LDAPを使っている人は389とかも確認が必要でしょう。
あと、古いMac用にslp.regを記述してSLPで公開する場合は427を開く必要があります。

参考: Service Name and Transport Protocol Port Number Registry
参考: Apple ソフトウェア製品で使われる一般的な TCP および UDP ポート
参考: ダウンロード詳細 Microsoft Windows Server System : ポート番号一覧


やらないほうがいいこと

OS Xから同じ場所にsamba経由とnetatalk経由で接続するな

メタデータの扱い方が異なるので、正常動作しません。
netatalk 3はsamba経由で作られたファイルを自動的にnetatalk方式に変換する機能があるのである程度マシですが、積極的に使うべきではないと思います。
あと、Windowsのファイル名禁止文字「\/:*?"<>|」の扱い方が異なります。
更にNFSやらWebDAVやらsshfsを混ぜると、色々な問題が絡んでひどいことになります。Macはnetatalk、WinはSambaという風に完全に分けることをお勧めします。

Macで作ったファイルをWinで移動するな

netatalk 3では色々と改善されてるので、あまり心配する必要はないでしょう。
しかし、以下のようなケースだとメタデータが「._」で始まる別ファイルに保存されているので問題が発生します。

これらの場合、ファイル本体は正常に移動されますが、別ファイルは移動しないのでメタデータが行方不明になります。

HFS+, FAT, NTFS等をマウントしてnetatalk経由で使うな

可搬性があって便利に思えますが、実際はダメです。
メタデータやファイル名の扱いがUnix系ファイルシステムと完全互換でないからです。OSにnativeなファイルシステムを使ってください。

NFSマウントしたものをnetatalk経由で使う方法もおすすめはしません。

ボリュームのネストに注意

ボリュームのパスをネストすると、CNIDデータベースが競合して異常が発生します。
次のようにlastを使えば競合しません。つまり書込可能なボリュームは1つだけです。

[volume 1]
     path = /where
     cnid scheme = last
[volume 2]
     path = /where/abc
[volume 3]
     path = /where/abc/def
     cnid scheme = last

このlastを使う方法は不便なので、netatalk 3.0.6でvol dbnestオプションが追加されました。
これを使うと、CNIDデータベース(.AppleDB)がボリュームパスの下に作られるので、競合問題が発生しません。

[Global]
     vol dbnest = yes

netatalkの起動/停止

netatalkのデーモンは4つ。

1つめのnetatalkコマンドを起動すれば、他は必要に応じて起動されます。止めるときはnetatalkを止めるだけです。
OSによって起動スクリプトの仕組みが全く異なりますが、要はこのnetatalkコマンドを起動/停止するだけです。
各OSに適したスクリプトをインストールするには、上で説明した--with-init-style=を使います。
スクリプトのインストール先は代表的なパスに決め打ちになっていますが、もし別のパスにする場合は--with-init-dir=を使います。

Debian系

DebianやUbuntuの場合、configure optionは--with-init-style=debianです。
将来systemdに移行する議論中なので、もしそうなれば--with-init-style=systemdを使うことになるかもしれません。

RedHat系

RedHat系(CentOSやScientific Linux)は元々sysvinit互換のupstartを採用しており、--with-init-style=redhat-sysvを使います。serviceコマンドで制御できます。
ただし、Fedora 15以降はsystemdになったので、--with-init-style=redhat-systemdを使います。systemctlコマンドで制御できます。
次のRHEL7はsystemdになると予告されているので、たぶんFedoraと同様になるでしょう。

Gentoo

Gentooはbaselayout/OpenRC/sysvinitを採用しており、--with-init-style=gentooを使います。
試験的にsystemdが導入されているので、その場合は--with-init-style=systemdを使います。

SUSE系

SUSE系は元々sysvinitを採用していたので、--with-init-style=suse-sysvを使います。
ただし、openSUSE 12.1以降はsystemdになったので、--with-init-style=suse-systemdを使います。

FreeBSD

netatalkはFreeBSD用の起動スクリプトを用意していません。FreeBSDのportの方で起動スクリプトを用意しています。/etc/rc.confnetatalk_enable="YES"と記述することで有効になります。

OpenBSD

netatalkはOpenBSD用の起動スクリプトを用意していません。現在はOpenBSD側のportでnetatalk 2.2.x系用の起動スクリプトを用意しています。3.0でも同様になると思います。

NetBSD

configure optionは--with-init-style=netbsdです。

Solaris系

Solaris系はSMFを採用しており、--with-init-style=solarisを使います。svcadmコマンドで制御できます。

その他

よく知りませんが、それぞれのパッケージャが頑張って独自の起動スクリプトを用意しているみたいです。
最近のLinuxベースのシステムはsystemdを採用するケースが増えており、その場合は、--with-init-style=systemdを使っています。


動作確認

クライアントから接続して操作してみるのは当然ですが、転ばぬ先の杖として以下をチェックしておくことお勧めします。

アクセス権の確認

サーバとクライアントの双方で、アクセス権の確認をすべきです。特にnetatalkの場合、サーバ側のls -l、クライアント側のls -l、Finderの「情報を見る」のそれぞれで見え方が違うので面食らいます。
ACLを使っている人は、sambaとnetatalkの両方で動作確認する必要があります。
別ユーザで接続してみて他人のファイルを読み書き出来るかどうかもチェックしておくべきです。

ファイルネームの確認

ASCIIは大抵大丈夫でしょうが、日本語ファイル名、多言語ファイル名、長いファイル名、禁止文字の確認をすべきです。

メタデータの確認

MacとWindowsの双方から操作してみて、リソースフォークやカスタムアイコン、EA、代替データストリーム等が消える条件を知っておくべきです。

タイムスタンプの確認

Macには作成時刻/変更時刻/最終アクセス時刻/バックアップ時刻等があります。Unixには作成時刻と変更時刻の区別がありません。netatalk 3.0では拡張属性に時刻を格納して対応しています。samba側、Unix側から作成したファイルにはこの拡張属性がないわけですから、作成時刻と変更時刻が同じになります。
HFS+やAFPは1s単位で時間を刻みます。
NTFSは100ns単位で時間を刻みますが、FATでは2s間隔しか扱えません。sambaは設定次第でNTFS互換にもFAT互換にもなります。samba 3.5.0で、100ns単位で扱えるようになりました。
Unix側はファイルシステムによって時間の解像度が異なります。例えばext3は1sですがext4は1nsです。
GNU版lsコマンドは--full-timeオプションで1s以下の時間を表示します。
サーバとクライアントでタイムスタンプが完全に一致するとは思わない方がいいです。

エイリアス/シンボリックリンク/ショートカット/ハードリンクの確認

afp.confにもsmb.confにもfollow symlinksというオプションがあります。これの挙動については十分に理解しておく必要があります。

MacのFinder上ではエイリアスとシンボリックリンクが同じように見えますが、ファイルシステム上では全くの別物です。Terminal.app内でls -lしてみればわかります。
エイリアスはサーバ上では意味不明なファイルにしか見えません。エイリアスはCNIDやパスを辿るので、CNIDデータベースを再構築すると辿れなくなる場合があります。
シンボリックリンクの挙動はfollow symlinksの設定によって変わります。サーバ側とクライアント側でどう見えるか確認してください。

Windowsにはショートカットの概念がありますが、シンボリックリンクはありません。ショートカットはサーバ上では意味不明なファイルにしか見えません。 シンボリックリンクの見え方はfollow symlinksの設定によって変わります。クライアントからどう見えるか確認してください。

サーバ側でハードリンクを使っても、MacやWindowsはこれを理解できません。単に別のファイルとして解釈します。

asip-status.plコマンドでnetatalkの確認

AFPクライアントからAFPサーバへの接続は、次のような手順で行なわれます。

  1. Bonjour等でサーバの存在を知る。またはアドレスを既に知っている。
  2. サーバに対して、どんなサーバなのか問い合わせする(GetStatus、別名GetSrvrInfo)。
  3. サーバから返答を受け取る。この返答の中に、様々なサーバの情報が入っている。
  4. この情報を基に、サーバに接続する。

つまり、この問い合わせ(GetStatus)への返答内容が間違っていると、様々な問題が発生します。
netatalkにはasip-status.plというコマンドが付属しています。これはAFPサーバにGetStatusを送り、その返答内容を表示するものです。次はその例です。

# asip-status.pl ホスト名またはIPアドレス
AFP reply from localhost:548
Flags: 1  Cmd: 3  ID: 57005
Reply: DSIGetStatus
Request ID: 57005
Machine type: Netatalk3.0.1
AFP versions: AFP2.2,AFPX03,AFP3.1,AFP3.2,AFP3.3
UAMs: DHX2,DHCAST128
Volume Icon & Mask: Yes
Flags:
    SupportsCopyFile
    SupportsServerMessages
    SupportsServerSignature
    SupportsTCP/IP
    SupportsSrvrNotifications
    SupportsOpenDirectory
    SupportsUTF8Servername
    SupportsUUIDs
    SupportsExtSleep
    SupportsSuperClient
Server name: hoge
Signature:
8a c6 12 3a 0e d9 95 3e 6f 31 e3 a9 17 f5 70 f6  ...:...>o1....p.

Network address: 192.168.1.154 (TCP/IP address)
UTF8 Servername: hoge

Machine type:は単なる参考情報であり、AFPクライアントはこれを気にしません。ただ、ユーザがAFPサーバの情報を知りたいときには便利でしょう。

AFP versions:は対応しているAFPのバージョンです。1.1から2.1迄はAppleTalkであり、2.2以降はTCP/IPです。

UAMs:は対応している認証方法です。詳しくは上の「ユーザ認証」を参照してください。

Flags:はサーバが対応している様々な機能を表します。

Server name:UTF8 Servername:はサーバ名です。前者はMacJapaneseであり、後者はUTF8-MACです。普通はASCIIの名前にするでしょうから、両者は同じでしょう。

Signature:は、サーバを区別する為のものです。同じサーバに二重接続するのを防ぐ為にあります。逆に、何かの間違いで同一のSignatureのサーバがあると、一方にしか繋がらないという問題が発生します。netatalk 2.0には同じSignatureになりやすい問題がありましたが、netatalk 2.1以降で対策がとられました。

Network address:は接続するサーバのアドレスです。適切なアドレスになっている事を確認してください。


安全な接続

いまどきはIPSecを使うんじゃないかなあ。よく知らないけど。

AFP

Mac OS X 10.3から10.4では、サーバにAFP over SSHで安全に繋ぐ機能がありました。afp.conf

[Global]
    advertise ssh = yes
    fqdn = hoge.example.org

と書いておけばAFP over SSHで接続出来ます。ただしnetatalkのログを見ても普通のAFP接続と区別が付かないので、パケットをダンプしてSSHが使われている事を確認する必要があります。psコマンドでsshが動いているのを見る方法もあります。
ところがMac OS X 10.5 LeopardでAFP over SSHが廃止になりました。
今のところ確認している唯一の方法は、netatalkのマニュアルに書かれている手法です。つまり、Terminal.appで

ssh -l $USER $SERVER -L 10548:127.0.0.1:548 sleep 3000

を実行してから、afp://127.0.0.1:10548に接続します。
これならAFP over SSHでnetatalkに接続出来ます。(ただし重いです)

SMB

samba 3.2以降で暗号化通信がサポートされたようですが、よく知らないのでパス。


トラブルシュート

どうやって調べるか

まずlogを見てください。一般常識です。
エラーメッセージをみても意味がわからないのであれば、その文字列をcopy and pasteして検索エンジンで調べてください。なんかわかるでしょう。
メタデータの異常を疑うならdbdコマンドを試します。

netatalkに繋がらない

疑いは4段階あるので順にクリアしてください。

  1. そもそもnetatalkが起動してない
  2. AFPプロトコルで通信できていない
  3. ユーザ認証が通っていない
  4. ボリュームにアクセスできていない

1の場合はpsコマンドとかで確認してください。起動直後に異常終了しているケースもあります。
2の場合はまずファイアウォールのチェックでしょう。単に接続先を間違っているケースもあります。実はSMBに繋ごうとしていたり、アドレスを間違っているケースもあります。
3の場合はUAMとかパスワードを調べてください。
4の場合はそのディレクトリのパーミッション等を調べてください。

クライアント側で変なウィンドウが開く

Something wrong with the volume's CNID DB, using temporary CNID DB instead. Check server messages for details!

書いてある通り、CNID DBの何かがおかしいです。netatalkのログを確認してください。
原因としては、以下のようなものが考えられます。

CNIDデータベースの問題の場合はdbdコマンドで修復してください。それでも修復できない場合は.AppleDB/ディレクトリを削除してください。
CNIDデーモンと通信できてない場合は、IPv4とIPv6の取り違えとか、ファイアウォールの設定が考えられます。

これ以外にもnetatalk 3.0及び3.0.1のバグにより、上記ウィンドウが開くことがあります。詳しくは以下のページをご覧ください。

netatalk 3の設定でパスの扱いが変:HAT blog

不可解なログが出る

afpd[XXXX]: Failed to add service: Local name collision

netatalkがAvahiに登録しようとしたとき、Avahiが「Local name collision」というエラーを返しています。既に登録されているのに二重登録しようとしたためです。netatalk 3はAvahi対応しているのでafpdが自動登録します。静的登録のファイルがあるとこのような問題が発生します。Avahi用の静的登録ファイルafp.serviceadisk.servicedevice-info.serviceなどがある場合は、消してください。

ホームディレクトリが見えない

[Homes]セクションにはbasedir regex =の設定が必須です。
更に3.0と3.0.1の場合、そのパスがシンボリックリンクを含んでいると正常動作しないバグがあります。3.0.2では改善されており、シンボリックリンクを展開したパスを書けば動作します。

設定したボリュームが見えない

3.0と3.0.1の場合、path =で設定したパスがシンボリックリンクを含んでいると正常動作しないバグがあります。その場合はシンボリックリンクを展開したパスを書けば動作します。3.0.3以降では問題ありません。

Mac OS X 10.1以前からサーバを発見できない

Mac OS X 10.1以前、つまりMac OS 9等がサーバを発見する方法は、SLPとAppleTalk(NBP)の2種類です。netatalk 3はどちらもサポートしないのでサーバ発見は不可能です。
IPアドレスやhostnameを直接指定して接続してください。一度接続したあとにエイリアスを作っておけば次回以降は便利だと思います。
別解としては、OpenSLPをインストールして設定ファイルslp.regに次のように記述し、静的に宣伝してやる方法があります。Mac OS 9だとセレクタではなくネットワークブラウザの方で発見できるようになります。

afp://IPアドレス/?NAME=サーバ名&ZONE=,en,65535
または
afp://FQDN/?NAME=サーバ名&ZONE=,en,65535

残る問題

ボリューム直下の隠しファイルやディレクトリが邪魔

マウントディレクトリ直下に以下のようなファイルやディレクトリが作られますが、これらはMac側が作るものなので、netatalk側では対処できません。気にしないのが一番でしょう。

Network Trash Folder
TheFindByContentFolder
TheVolumeSettingsFolder
Temporary Items
.TemporaryItems
.VolumeIcon.icns
Icon?
.FBCIndex
.FBCLockFolder

これらをWindowsから見えないようにするには、上の「sambaのsmb.confの設定」を読んでください。

各ディレクトリの.DS_Storeが邪魔

netatalk3は隠しファイルをほとんど作らなくなりスッキリしましたが、.DS_Storeが邪魔です。これはMac側が作るファイルなのでnetatalk側では対処できません。
Mac側で.DS_Storeを作らなくする方法ならあります。

参考: Mac OS X v10.4 and later:ネットワーク接続時に .DS_Store ファイルの作成を抑制する方法

ただし、Finderでフォルダを表示するための情報が記録されなくなります。

パーミッションが変

AFPにおけるパーミッションの扱いは昔から変です。まず、Finderから実行属性を操作できません。他にも色々問題があります。Mac OS X 10.4 Tiger迄はものすごく変でした。10.5 Leopard以降で仕様変更されましたが、やっぱり変です。

10.4 Tiger迄の場合、Terminall.appからls -lで見た場合と、Finderの「情報を見る」で確認出来るパーミッションが異なります。
10.5 Leopard以降ではACL管理になりました。これは仕様追加ではなく仕様変更なので、それまでのAFPと互換性がありません。よって、Mac OS X 10.5と10.6からACL管理していないAFPサーバにアクセスすると確実に問題が発生します。具体的にいうと、「情報を見る」でアクセス権をゴニョゴニョいじっている間にパーミッションが「0000」になりファイルにアクセス出来なくなります。こうなるとchmodコマンドで直すしかありません。

このとんでもない問題を緩和するには、file permdirectory permの設定を行います。これはクライアントが要求してきた属性とORを取るものです。例えば、file perm = 0600directory perm = 0700を設定しておけば、少なくとも所有者は確実に読み書き出来ます。

根本的な対策は、netatalk側でACL及びOpenLDAPの設定を行うことです(未確認)。

なお、Windowsからsambaにコピーしたファイルに実行属性がついてしまうのは別の現象なので混同しないで下さい。FATやNTFSにあるアーカイブ属性がUnixのファイルシステムにはないので、代わりに実行属性に割り当てているのが原因です。アーカイブ属性を継承する必要がないのならsmb.confmap archive = noを使うとよいです。

BSD flagsが使えない

OS X上のHFS+ではBSD由来のflag (chflagsコマンドで変更可能) が使えますが、AFPボリューム上では使えません。これはAFPプロトコルの仕様にBSD flagが含まれてないからです。だからOS X同士のAFP接続でも使えません。netatalkの責任じゃないってことです。
例外としてはhiddenフラグがあります。これはFinder情報のinVisibleフラグに置き換えられるので、扱うことができます。

manpageの表示がズレる

manコマンドでnetatalk関連のmanpageをみると、SYNOPSISの部分の表示がズレることがあります。
manpageの生成に使っているツールDocbook XSLのバグが疑われていますが、もしかすると元になるxmlの記述ミスかもしれません。解決法を知っている人がいたら教えてください。

AFPクライアントの機能はあるか

sambaにはsmbclientコマンドが付いてきますが、netatalkにAFPクライアント機能はありません。
GNOMEにGVfsという仮想ファイルシステムの機能があり、最近のバージョンだとZeroconfで発見してAFPサーバに接続できます。拡張属性やリソースフォークは扱えません。パーミッションはuserだけ扱えてgroupとotherは無視されるようです。シンボリックリンクも正常に扱えません。AFP 3.0以降に対応なので、Mac OS 9以前には繋がりません。
あと、afpfs-ngというのがありますが、かなり不安定なまま開発が止まっているのでおすすめしません。

AFP 3.xなのに極めて長いファイル名を扱えない

Mac OS X 10.4 Tiger迄のバージョンでは、AFP 3.xクライアントとして動作しているとき、decomposed UTF-8で255バイトを越えるファイル名を正常に扱えません。
これはnetatalkではなくMac OS X側の問題です。ちなみにMac OS XでSMB (CIFS)を使ったときも同様の現象が起きます。
この仕様(バグ)にあわせて、netatalkはファイル名を255バイト内にmangleしてクライアントに報告します。
Mac OS X 10.5 Leopardでは直っているのですが、netatalkは古いMac OS Xにあわせた仕様なので、255バイトを越えたファイル名がmangleされてしまいます。

Mac OS X 10.4迄の場合、例えばローカルのHFS+に「ああああ…」という風に「あ」が86個以上あるファイルがあったとして、これをAFP 3.xのサーバにコピーしようとするとエラーになります。このとき、サーバに対して全くリクエストを送っていません。つまりが自分でエラーを出しているのです。相手のサーバがnetatalkだろうとMac OS Xだろうと結果は同じです。

逆に、Mac OS XがAFP 3.xサーバとして動作しているときは、バージョンに関わらず255バイトを越えるファイル名でもちゃんと報告してきます。これを受け取った側のMac OS X 10.4迄のバージョンは、妙な動作をします。Finderからはファイル名が変なところでちぎれて見えるし、ターミナルで$ ls -wしてみると、エラーが出ます。これはDarwin(UNIX)の制限が255バイトであることに関係しているでしょう。

AFP 3の仕様書上は、pathnameの長さは0xFFFF=65535バイトです。そんなものすごいファイルシステムはないけどね。


雑談

なんでAppleはNFD (UTF8-MAC, decomposed UTF-8)なんてマイナーなものを使うんだ

Appleのページに説明があります。

HFS Plus Volume Format

To reduce complexity in the B-tree key comparison routines (which have to compare Unicode strings), HFS Plus defines that Unicode strings will be stored in fully decomposed form, with composing characters stored in canonical order.

正規化処理は超メンドーなので、NFCよりも速いNFDを使うよってことです。

NFDの手順
decompose → order
NFCの手順
decompose → order → precompose

しかしだねえ、そもそもファイル名を正規化する必要性はあるのか? 正規化ってのは、文書内での問題を解決する目的ではないのか?


参考

Netatalk - Networking Apple Macintosh through Open Source
netatalkのホームページ
SourceForge.net: netatalk
sourceforge projectのnetatalkのページ
NetAFP | The Netatalk OS Company
事実上、netatalkの唯一の開発者であるFrank Lahmの会社のページ
SerNet -Home
sambaベンダ。上記NetAFPと協力してnetatalkとsambaをマージする計画がある。
OS X Mavericks Core Technologies Overview
OS X MavericksではAFPよりもSMB2を優先するという情報がある
SourceForge.jp: Project Info - Netatalk 日本語化プロジェクト
2003年からあるプロジェクトのようですが、活動の形跡が全くないので読む価値なし
Netatalk - Wikipedia
WikipediaのNetatalkの項
拡張ファイル属性 - Wikipedia
Wikipediaの拡張ファイル属性 (EA)の項
AppleTalk - Wikipedia
WikipediaのAppleTalkの項
Apple Filing Protocol - Wikipedia
WikipediaのApple Filing Protocol (AFP)の項
AppleShare - Wikipedia
WikipediaのAppleShareの項
フォーク (ファイルシステム) - Wikipedia
Wikipediaのフォークの項
リソースフォーク - Wikipedia
Wikipediaのリソースフォークの項
AppleSingle - Wikipedia
WikipediaのAppleSingleの項。AppleSingleとAppleDoubleの両方を説明している。
Applesingle and AppleDouble format internals
AppleSingleとAppleDoubleの仕様書 (Version1)
AppleSingle/AppleDouble Formats for Foreign Files Developer’s Note
AppleSingleとAppleDoubleの仕様書 (Version2)
Finder情報 - Wikipedia
WikipediaのFinder情報 (Finder Information)の項。
Bonjour - Wikipedia
WikipediaのBonjourの項。
Avahi - Wikipedia
WikipediaのAvahiの項。
Zeroconf - Wikipedia
WikipediaのZeroconfの項。
Transport Layer Security - Wikipedia
WikipediaのTransport Layer Security (TLS, SSL)の項
使いこなそうユニコード
ちょっと内容が古いけど、正規化の概念の説明などがわかりやすい
Inside AppleTalk Second Edition
AppleTalkの仕様。AFP 1.1/2.0の仕様を含む。
AppleTalk Filing Protocol Version 2.1 and 2.2 (pdf)
AFP 2.1/2.2の仕様
Apple Filing Protocol Programming Guide
Apple Filing Protocol Reference
AFP 3.xの仕様。
Time Machine Network Interface Specification (TMNIS)
Time Machineのサーバとしての要求事項。
Technical Note TN1150 HFS Plus Volume Format
HFS Plusの資料
Samba - opening windows to a wider world
sambaのホームページ
Samba-JP
sambaの日本語情報

履歴


↑ Upper Page