Netatalk and Samba

2012.02.13


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

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

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

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

このページはnetatalk 2.2系列について説明しています。
ここでは特に触れていないネタや速報は、blogの方に書いています。

netatalk:HAT blog

古いバージョンの情報は以下のページをどうぞ。
Netatalk 2.0.5 and Samba - Time Machine対応だが不完全なのでLionからバックアップできない。Bonjour対応なし。ACL/LDAP対応なし。EA対応なし。
Netatalk 2.1.x and Samba - Time Machine対応だが不完全なのでLionからバックアップできない。Bonjour対応なし。ACL/LDAP対応なし。EA対応あり。


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

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

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

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

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

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

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

日本語で情報交換する場は、ないに等しいです。
2ちゃんねるに「netatalkについて語るスレ」というのがあり、単純な問題が解決する可能性はありますが、込み入った問題が解決したケースはありません。mixiにもコミュニティがありますが、閑古鳥が鳴いています。

netatalkについて語るスレ
[mixi] netatalk

netatalkの開発はGitで行なわれています。開発中のソースの入手はgitコマンドを使います。
Git版はconfigureスクリプトが入ってないので、まず./bootstrapを実行してconfigureスクリプトを生成します。ただしautotools (autoconf, automake, libtoolなど)のバージョンが古いとmake中にコケます。大抵Makefileの文法がおかしいというエラーになります。

参考: Netatalk 2.2 Manual - Chapter 2. Installation - Source packages - Read-only Git

いくつかのブランチがありますが、ここでは3つ紹介します。

master

次の安定版を目指すものです。現在のバージョン表記は2.2.3devです。
http://netatalk.git.sourceforge.net/git/gitweb.cgi?p=netatalk/netatalk;a=shortlog;h=refs/heads/master

branch-allea

現在のnetatalkはFinder情報やリソースフォーク等をAppleDoubleフォーマットで別ファイルに保存しています。このAppleDoubleファイルを使わないで、代わりに拡張属性(EA)に保存してしまおうというブランチです。ただし、一般的なファイルシステムではEAは100kB程度しか保存できないので、リソースフォークを格納するには足りません。この場合は「._」で始まるファイル名で保存します。つまりsmb経由と同等です。
バージョン表記は3.0devです。そのうちこれがmasterになり、順調にいけば2012年中に正式にリリースされるでしょう。
http://netatalk.git.sourceforge.net/git/gitweb.cgi?p=netatalk/netatalk;a=shortlog;h=refs/heads/branch-allea

branch-iniconfig

branch-alleaから分岐してできたブランチです。まとまった時点で上のbranch-alleaにマージされるでしょう。これのバージョン表記も3.0devです。
現在のnetatalkの設定ファイルはわかりにくいので、netatalk.conf, afpd.conf, afp_ldap.conf, AppleVolumes.defaultを統合して一つにし、sambaみたいなiniフォーマットにするものです。
http://netatalk.git.sourceforge.net/git/gitweb.cgi?p=netatalk/netatalk;a=shortlog;h=refs/heads/branch-iniconfig


インストール手順

netatalk本体をインストールする前に、ライブラリ関係をインストールしておきます。これらのライブラリは大抵のOSで標準的に配布されています。ただし、Berkeley DBだけはバージョンを選ぶのでソースからビルドする必要があるかもしれません。

Berkeley DBのインストール

CNIDを扱うためにBerkeley DB 4.6以上が必須です。
バージョンが適切でないとconfigureの途中でエラーが出て止まるので、適切なバージョンのBerkeley DBをインストールしてください。バージョン番号付きのディレクトリにインストールされるので、既に入っているBerkeley DBを上書きするようなことはありません。

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

参考: Netatalk 2.2 Manual - Chapter 2. Installation

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やSLPのためデーモンのインストール

これらはAFPサーバの存在を宣伝するためのものです。

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

Avahiのホームページ: Avahi

SLPデーモンとしては、OpenSLPがあります。Solaris標準の/usr/lib/inet/slpd (SUNWslpr, SUNWslpu)も使えます。
これを使うと、Mac OS 8.5 〜 Mac OS X 10.4でサーバが見えるようになります。8.5 〜 9.2の場合はセレクタではなくネットワークブラウザで見えます。古いMacを持ってない人は入れなくていいです。なお、netatalk 3.0ではSLP対応は削除される予定です。

OpenSLPのホームページ: OpenSLP Home Page

ACL関連ライブラリやOpenLDAPのインストール

Mac OS X 10.5 Leopard以降、パーミッションの扱いがACLベースになりました。これに対応しないnetatalkの場合、パーミッションの異常を防ぐためにdperm及びfpermオプションを使います。
ばっちりパーミッションを扱うためには、ACL及びOpenLDAPに対応にする必要があります。
ACL関連ライブラリはOSによって異なるので、頑張って調べてインストールしてください。Debian系はlibacl1-devというパッケージです。RedHat系はlibacl-develというパッケージです。
OpenLDAPの設定はかなり面倒くさいので泣きたくなります。

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

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

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

$ cd netatalk-xxx/
$ sudo 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

では、configureしましょ。

$ cd netatalk-XXX/
$ ./configure \
    --enable-debian

オプションは./configure --helpで確認してください。
--enable-debianはDebian、Ubuntu等の場合の起動スクリプトをインストールするオプションです。他に--enable-redhat-sysv--enable-redhat-systemd--enable-suse-sysv--enable-suse-systemd--enable-gentoo--enable-netbsd等があります。Solarisでは何も指定しなくてもSYSV汎用がインストールされます。このあたりは下の「netatalkの起動」の項を参照してください。

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

Configure summary:
    Install style:
         debian
    AFP:
         Large file support (>2GB) for AFP3: yes
         Extended Attributes: ad | sys
    CNID:
         backends:  dbd last tdb
    UAMS:
         DHX     (PAM SHADOW)
         DHX2    (PAM SHADOW)
         RANDNUM (afppasswd)
         clrtxt  (PAM SHADOW)
         guest
    Options:
         DDP (AppleTalk) support: no
         SLP support:             yes
         Zeroconf support:        yes
         tcp wrapper support:     yes
         quota support:           yes
         admin group support:     yes
         valid shell check:       yes
         cracklib support:        no
         dropbox kludge:          no
         force volume uid/gid:    no
         ACL support:             yes
         LDAP support:            yes

このsummaryをよーく見て、必要なライブラリが全部有効になっていることを確認してください。ライブラリをうまく認識しない場合は、そもそもライブラリがインストールされているか確認してください。あと、--enable-srvloc--with-libgcrypt-dir--with-ssl-dir--with-bdb等の設定で認識するかもしれません。

古いバージョンでRANDNUM (PAM SHADOW)と表示していたのはバグです。RANDNUMはPAMもshadow passwdも使わず、afppasswdファイルを使います。また、passwdと表示していた部分も意味がわかりにくいので、現在はclrtxtと表示しています。

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

$ make
$ sudo mv /etc/netatalk /etc/netatalk.old
$ sudo make install

sambaのインストール

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


netatalkとsambaの設定はどうすべきか

netatalkの設定

netatalk.confの設定例

netatalk.confはnetatalk全体の設定を行ないます。
ただし、Debian系(Ubuntuとか)の場合はnetatalk.confではなく/etc/default/netatalkです。

ATALK_UNIX_CHARSET='UTF8'
ATALK_MAC_CHARSET='MAC_JAPANESE'

ATALK_UNIX_CHARSET=はUNIX側の設定ファイル内で使う文字コードです。デフォルトではLOCALEになっており、ロケールを元に自動設定されますが、うまく動作しない場合もあるので明示したほうがいいです。最近の環境だとUTF8に設定すべきです。古い環境の場合はEUC-JP等でしょう。
ATALK_MAC_CHARSET=はMac OS 9側の文字コードです。atalkdとpapdが扱う文字コードの指定なので、"AFP over TCP"によるファイル共有しか使わない人には、実は関係ない設定です。Mac OS Xからの接続はこの設定に左右されず、UTF8-MACに固定です。

CNID_METAD_RUN=yes  (CNID管理のサーバ)
AFPD_RUN=yes        (AFPファイルサーバ)

netatalkに含まれる各種デーモンのうち、どれを起動するか設定します。cnid_metadとafpdの両方を起動してください。

CNID_CONFIG="-l LOG_NOTE -f /var/log/netatalk.log" 

cnid_metadのログの設定です。ログレベル及び保存先を指定します。コメントアウトしておくとsyslogに渡されます。afpdのログ指定はafpd.confの方で行います。

参考: Netatalk 2.2 Manual - netatalk.conf

afpd.confの設定例

- -maccodepage MAC_JAPANESE -setuplog "default LOG_NOTE /var/log/netatalk.log"

afpd.confはファイルサーバafpdの設定を行ないます。
1行あたり1サーバの設定になります。だから普通は1行だけでしょう。
先頭の項目はサーバ名の設定ですが、「-」にしておくとhostnameと同じになります。
-maccodepageはMac OS 9側の文字コードです。Mac OS Xからの接続はこの設定に左右されず、UTF8-MACに固定です。
あと、-unixcodepageというのもありますが、これはUNIX側の設定ファイルで使う文字コードです。ボリューム名、サーバメッセージ、認証あたりが日本語のときに重要になります。UTF8がデフォルト値なので省略可能です。古い環境だとEUC-JP等を指定する必要があるかもしれません。
-setuplogはログレベル及び保存先を指定します。設定しないとsyslogに渡されます。cnid_metadと同じファイルに設定しておくと、読みやすいかもしれません。

参考: Netatalk 2.2 Manual - afpd.conf

AppleVolumesの設定例

AppleVolumesファイル群で設定するものは以下の2つ。

各ユーザ別の設定は~/AppleVolumes~/.AppleVolumesで行ない、これがない場合はAppleVolumes.defaultが読み込まれます。
全ユーザ共通の設定はAppleVolumes.systemで行ないます。
予め用意されている設定ファイルでは、AppleVolumes.defaultでボリューム設定、AppleVolumes.systemで拡張子の関連付けを行なっています。

:DEFAULT: options:upriv,usedots dperm:0700 fperm:0600 maccharset:MAC_JAPANESE ea:sys

:DEFAULT:の行は全ボリュームで共通の設定を行ないます。

usedotsを設定しないと、ドットで始まるファイル名があった場合、最初のドットを:2eに置き換えて保存します。例えば「.abc」は「:2eabc」になります。usedotsを設定すればそのまま保存しますが、netatalkが予約している「.Apple」で始まるファイル名及び「.Parent」がMac側から作成出来なくなります。これは、大昔のnetatalkの事情による弊害です。

uprivはUNIX風のパーミッションを有効にするオプションであり、クライアントがMac OS Xならば必ず設定すべきです。
dpermfpermはそれぞれディレクトリとファイルのパーミッションとORを取って保存するものです。Mac OS X 10.5以降はFinderからパーミッションをいじると「000」になってしまう場合があるという、とんでもない問題があるので、この設定を行ないます。この設定例だと、少なくともファイル所有者は確実に読み書き出来ます。みんなで仲良く使うボリュームならば、dperm:0775 fperm:0664というのもアリでしょう。なお、ACLとOpenLDAPが有効になっている場合は、パーミッションは正しく設定されるはずなので、dperm/fpermは必須ではありません。

maccharset:はMac OS 9側の文字コードです。afpd.confの方で設定しておけば、この設定は省略できます。Mac OS Xからの接続はこの設定に左右されず、UTF8-MACに固定です。
volcharset:というのもありますが、これはUNIX側のファイル名の文字コードであり、デフォルトはUTF8です。古い環境だとEUC-JP等を指定する必要があるかもしれません。

ea:は、拡張属性(EA)の保存方法の設定です。デフォルトはautoです。

ea:sysEAをEAとして保存します。つまりサーバ側のファイルシステムで拡張属性が有効になっている事を確認してください。
ea:ad.AppleDoubleディレクトリの中に沢山ファイルを作って、そこにEAを保存します。
ea:noneEAサポートなし。netatalk 2.0互換用。通常は使うべきでない。
ea:autosysが使えるかどうか試して、ダメだったらadにする。ただしoptions:roを指定してリードオンリーにしている場合はnoneになる(CD-ROMとかの対応)。

次期netatalk 3.0ではサーバ側の拡張属性を大胆に使うようになるので、今のうちに有効にしておいた方がいいと思います。

~

~」だけ書いた行は、ユーザのホームディレクトリをボリュームとして使えるようにする設定です。

/aaa/bbb "ccc"

サーバ側の/aaa/bbbというディレクトリをcccというボリューム名で公開する設定です。

/xxx/backup "Time Machine Vol" options:tm volsizelimit:1024

Time Machine用の設定です。サーバ側の/xxx/backupというディレクトリをTime Machine Volというボリューム名で公開します。tmでTime Machine対応であることをクライアントに通知します。volsizelimit:は、ボリュームのサイズをクライアントに知らせるときに、嘘をつく設定です。バックアップ容量を制限したいときに使います。単位はMiBなので、1024だと1GiBになります。

.lzh "LHA " "LARC"
.sit "SIT5" "SIT!"
.jpg "JPEG" "ogle"

ドットで始まる行は拡張子とType/Creatorの対応付けです。Mac OS 9以前から接続する場合は、必要に応じて設定してください。デフォルトでは全く設定されていません。全ての行がコメントアウトされています。netatalkが勝手にType/Creatorを付けるのは有害であるという判断です。この対応付けの機能はnetatalk 3.0で廃止される予定です。

参考: Netatalk 2.2 Manual - AppleVolumes.default

afp_ldap.confの設定例

わかんないのでパス。

sambaの設定

smb.confの設定例

[global]
dos charset = CP932
unix charset = UTF-8
display charset = UTF-8

dos charsetはDOS/Windows 3.1/95/98/MEからアクセスしたときのファイル名の文字コードです。Windows NT系 (NT/2000/XP/Vista/7)からの接続はこの設定に左右されず、UTF-16に固定です。
unix charsetはUNIX側のファイル名の文字コードです。samba.gr.jpにある文書によれば、LOCALEが日本語EUCになっているようなシステムではUTF-8ではなくEUCJP-MSというパラメータ値を設定することになっています。
display charsetはsmbclientコマンド等が使う文字コードです。古い環境ではEUCJP-MS等を設定する必要があるかもしれません。

参考: Samba 3.0で日本語を利用できるようにしたパッケージ集

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

oplocks = No

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

kernel oplocks = Yes
oplocks = Yes

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

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

kernel oplocks = No
oplocks = No
 
vfs objects = streams_xattr

ややこしい...

また、netatalk/Mac OS 9/Mac OS Xが作る隠しファイルをsamba経由のWindowsから見えないようにする事が出来ます。
options:usedotsを設定していない場合は、先頭のドットを:2eにする必要があります。

veto files = /.AppleDB/.AppleDouble/.AppleDesktop/Network Trash Folder/TheFindByContentFolder/TheVolumeSettingsFolder/Temporary Items/.TemporaryItems/.VolumeIcon.icns/Icon?/.FBCIndex/.FBCLockFolder/

この設定を行なうと、samba経由でフォルダを削除しようとしたときにエラーになる事があります。フォルダ内にveto filesで設定したファイルが隠れているからです。そこで次のように設定します。隠したファイルをまとめて削除してくれるようになります。

delete veto files = Yes

sambaのvfsモジュールにnetatalkというのがあります。

vfs objects = netatalk

これを使うと、samba経由でファイルを操作したときに孤立してしまう.AppleDoubleディレクトリ内のファイルを自動で消してくれます。が、UNIX側から直接rmした場合等は結局残ってしまうわけですから完璧な対処法とは言えないでしょう。 しかも、このモジュールはほとんどメンテされていないので、まともに動くかどうかわかりません。netatalkボリュームの整理はnetatalkに付属するdbdコマンドを使って下さい。単に孤立ファイルを消すだけならdbd -rcです。cronで定期的に実行するのが良いと思います。

参考: Chapter 23. Stackable VFS modules
参考: Netatalk 2.2 Manual - dbd


ポート番号

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

137 netbios-ns NetBIOS名前解決。nmbdが使う。UDP。
138 netbios-dgm NetBIOS Datagram Service。nmbdが使う。UDP。
139 netbios-ssn 古いSMB。smbdが使う。NetBIOS名を解決してから接続する。
427 svrloc SLP。slpdが使う。AFPサーバを宣伝する。現在のMac OS Xは使わない。
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が使う。AFPサーバやTime Machineボリュームを宣伝する。UDP。

これ以外にも、LDAPを使っている人は389とかも確認が必要でしょう。

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


やってはいけないこと

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

メタデータの扱い方が異なるので、正常動作しません。
更にNFSやらWebDAVやらsshfsを混ぜると、メタデータだけでなくファイル名の問題も絡んでひどいことになります。Macはnetatalk、WinはSambaという風に完全に分けることをお勧めします。
この問題は次期netatalk 3.0でマシになるかもしれません。

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

まあ、ご存知だとは思いますが、AppleDoubleファイルが孤立します。
Finder情報とかリソースフォークとかに大した情報が入っていない場合はこの限りではありません。私は結構移動してます。ゴミとして残ったAppleDoubleファイルはdbdコマンドで消してやってください。
この問題は次期netatalk 3.0でマシになるかもしれません。

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

可搬性があって便利に思えますが、実際はダメです。
メタデータの扱い方が異なるからです。OSにnativeなファイルシステムを使ってください。
更にLinuxのHFS+ドライバがバグってるそうで、正常動作しないそうです。

NFSマウントしたものをnetatalk経由で使う方法もおすすめはしませんが、やっている人はいます。この場合はdbpathをNFS側でなくnetatalk側においてください。拡張属性が使えるNFSじゃないとマズいと思います。

ボリュームをネストするな

次のようなAppleVolumesファイルを書いてボリュームをネストしてはいけません。
CNIDが二重管理になるので正常動作しません。

/some/where      "volume one"
/some/where/abc  "volume two"

AppleTalkは不要

Mac OSのクライアント機能

Mac OSがバージョンアップするにしたがってAppleTalkの機能は縮小し、Mac OS X 10.6 Snow Leopardで完全廃止になっています。
つまり、恐ろしく古いMacを持っていない限り、atalkdを起動する意味はありません。レトロな趣味の方はatalkdを御活用ください。最近でもSystem 6から接続している人がいます。Apple IIからだと問題があるという報告がありますが、いまさら直らないかもしれません。
次期netatalk 3.0では、AppleTalk機能自体が廃止されます。


拡張属性 (EA) 対応

拡張属性 (EA)って何? と思う方は以下のページを参照してください。Tiger以降でサポートされており、Snow Leopard以降で重要です

参考: 拡張ファイル属性 - Wikipedia

netatalk 2.0EA未対応です。
netatalk 2.1以降EA対応です。

EAの設定は上で説明しているAppleVolumes.defaultで行なってください。

書き込み可能なのにea:noneを設定すると、EA未サポートになるので面倒なことになります。
Leopard迄は、EA付きファイルをEA未対応サーバにコピーしたとき、EAが消えてなくなります。
Snow Leopardでは、例えばEA付きのabc.txtというファイルをEA未サポートnetatalkにコピーすると次のような4つのファイルが作成されます。

abc.txt
._abc.txt
.AppleDouble/abc.txt
.AppleDouble/._abc.txt

1つめは、ファイル本体。
2つめは、EAを保存するために、Snow Leopardが勝手に作りやがったAppleDoubleフォーマットのファイル。
3つめは、abc.txtに対応するリソースフォークとかタイムスタンプを保存するために、netatalkが作成したAppleDoubleフォーマットのファイル。
4つめは、._abc.txtに対応するnetatalkが作成したAppleDoubleフォーマットのファイル。

つまり、ea:noneのとき、EA付きファイルを1つ作ると、それに付随するAppleDoubleファイルが3つ出来ます
しかもこの動作のとき、Snow Leopardはパーミッションの設定を間違えるため以下のエラーが出るケースが非常に多いです。

一部の項目へのアクセス権がないため、操作は完了できません。

Snow Leopardは._abc.txtを作成した直後に、それのパーミッションを000に設定します。当然アクセス権がありません。明らかにSnow Leopardのバグです。 ea:noneはリードオンリーのボリュームにのみ使って下さい。

AppleDoubleファイルの内容は、apple_dumpコマンドで確認できます。


Time Machine対応

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

  1. netatalkの設定ファイルでボリュームのoptions:tmを追加。必要に応じてvolsizelimit:も設定。
  2. Time Machineでそのボリュームを選ぶ
  3. 初回バックアップを開始すると、ボリューム内に勝手にイメージバンドルが作られ、勝手にバックアップされる
  4. 2回目以降は勝手にマウントされ、勝手にバックアップされる

Lionの場合、netatalk 2.2beta3以降でなければTime Machineが使えません。


CNIDの管理

MacOSの為に作られたHFS+というファイルシステムでは、ファイルやフォルダにCNID (Catalog Node ID)と呼ばれる番号を付けて管理しています。File ID、Directory IDと呼ぶ場合もあります。これはAFPの場合も同様です。
CNIDはinode番号の概念に似ていますが同じではありません。netatalkでは、Berkeley DBを使って .AppleDB/というディレクトリでCNIDのデータベースを管理しています。 これに関する設定はAppleVolumesファイルで設定します。CNIDの管理方法は何種類か用意されており、netatalk 2.0ではcnidscheme:cdbがデフォルトでしたが、これは不安定でした。netatalk 2.1以降ではconfigure時に指定しない限りcdbは無効になっています。現在使えるcnidschemeは以下のとおり。

cnidscheme:dbdこれがデフォルト。cnid_metadデーモンがデータベースを一括管理し、.AppleDB/ディレクトリにデータを保存する。各afpdはcnid_metadと通信するだけ。
cnidscheme:tdb.AppleDB/ディレクトリが読み書き出来ないときに、代わりとしてメモリ上でCNID管理する。
cnidscheme:last推奨されない。afpdプロセス毎にその場限りの管理をする。書き込み可能のボリュームで使うと不安定。

通常はデフォルトのdbdを使うでしょう。cnid_metadデーモンが起動していることを確認してください。これが動いていないと、ボリュームにアクセス出来ません。tdblastの場合はcnid_metadは必要ありません。

.AppleDB/内のデータベースは滅多に壊れません。もし壊れた場合はメンテ用のdbdコマンドで修復します。それでも修復出来ないような状況ならば、netatalkを停止→.AppleDB/ディレクトリを削除→netatalkを再起動してください。勝手に新たな.AppleDB/ディレクトリが作られます。

.AppleDB/ディレクトリはマウントディレクトリ直下に作られます。これが邪魔だと思う場合は、AppleVolumesファイルでdbpath:オプションを使ってください。別のディレクトリに保存できます。例えば私はdbpath:/var/AppleDB/$vに設定しています。

参考: Netatalk 2.2 Manual - Choosing a CNID storage scheme
参考: Netatalk 2.2 Manual - cnid_metad
参考: Netatalk 2.2 Manual - cnid_dbd
参考: Netatalk 2.2 Manual - dbd


ユーザ認証

netatalkのユーザ認証

AFPのユーザ認証方法(UAM)は、afpd.conf-uamlistオプションで設定します。デフォルト値は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。更に強い暗号化。オススメ。
GSS なし 不明。Appleのドキュメントに載ってないので実装できない。OS X Lionで追加されたようだ。
Client Krb v2 uams_gss.so Kerberos V認証。
Recon1 なし 再接続。

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

uams_cleartxt.souams_dhx.souams_dhx2.soは、netatalkのコンパイル時のオプションにより、UNIXのpasswdファイル、shadow passwd、PAMのどれかを使うことになります。
uams_gss.soは使った事がなくわかりませんので、とりあえずリンクだけしておきます。

netatalk で Kerberos 認証

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を使えるようにするか、どちらかです。

あと、netatalk 2.2ではLDAPを使って云々... ですが、全く知識がないのでパス。

sambaのユーザ認証

最近ちゃんと調べてないので自信ないです。
smb.confsecurity =で色々と設定出来ます。user, share, server, domain, adsが選べますね。
他にも色々パラメータがあります。

encrypt passwords = yes/no
lanman auth = yes/no
ntlm auth = yes/no
client NTLMv2 auth = yes/no
client lanman auth = yes/no
client plaintext auth = yes/no

netatalkの起動

まず起動スクリプト(initscript)が実行され、その中でnetatalk.confが読み込まれてから各種daemonが起動されます。。ただし、OSやディストリビューションで微妙に方法が違います。特に、Debian系ではnetatalk.confの代わりに/etc/default/netatalkを使うので注意してください。
configureスクリプトには--enable-redhat-sysv--enable-redhat-systemd--enable-suse-sysv--enable-suse-systemd--enable-gentoo--enable-netbsd--enable-debian等のオプションがあるので、これをちゃんと選べば環境に応じた起動スクリプトがインストールされる筈です。

Debian系

DebianやUbuntuの場合、configure optionは--enable-debianです。
起動スクリプトは/etc/init.d/netatalkであり、この中で/etc/default/netatalkが読み込まれます。
netatalk.confは使いません。

RedHat系

RedHat系は元々sysvinit互換のupstartを採用しているので、netatalk 2.2.0迄は--enable-redhatというconfigure optionを用意していました。しかしFedora 15以降はsystemdになったので、netatalk 2.2.1では--enable-redhat-sysv--enable-redhat-systemdの2つになりました。

RedHat, Scientific Linux, CentOS, Fedora 14以前はsysvinit互換のupstartを使っているので、configure optionは--enable-redhat-sysvにします。
起動スクリプトは/etc/rc.d/init.d/netatalkであり、この中でnetatalk.confが読み込まれます。

Fedora 15以降はsystemdを使っているので、configure optionは--enable-redhat-systemdにします。
/lib/systemd/system/netatalk.serviceに書かれている起動スクリプトが起動され、その起動スクリプトの中でnetatalk.confが読み込まれます。

Gentoo

Gentooはbaselayout/OpenRC/sysvinitを採用しているので、--enable-gentooというconfigure optionを用意しています。netatalk.confは有効です。
しかし、Gentooのパッケージnetatalk-2.2.1-r2では独自のinitscriptがインストールされます。これはnetatalk.confを使いません。
私は各ディストリビューションを尊重して本家にマージする方針ですが、このinitscriptはあまりにもクセが強いので躊躇しています。

SUSE系

SUSE系は元々sysvinitを採用しているので、netatalk 2.2.1迄は--enable-suseというconfigure optionを用意していました。しかしopenSUSE 12.1はsystemdになったので、netatalk 2.2.2では--enable-suse-sysv--enable-suse-systemdの2つになりました。どちらもnetatalk.confを読み込みます。

なお、openSUSEのパッケージnetatalk-2.2.1-5.1.3は使い物になりません。このパッケージはnetatalk側で用意している最新のinitscriptを古いinitscriptで上書きしています。更にパッケージをアンインストールしようとするとエラーが発生するので、削除できません。

FreeBSD

FreeBSD 6.2と7.0のportsを確認したところ、rcスクリプトは/usr/local/etc/rc.d/netatalkでした。
各デーモンの起動は/etc/rc.confで以下のように設定します。

netatalk_enable="YES"
cnid_metad_enable="YES"
afpd_enable="YES"

/usr/local/etc/netatalk.confで最大クライアント数、 zone名、NBP名、ゲスト接続のユーザのマッピング等が設定出来ます。
最近portsの方で動きがあるので、この情報は既に古いかもしれません。最近ちゃんと調べてないです。

NetBSD

configure optionは--enable-netbsdです。NetBSD 3.1と4.0のpkgsrcを確認したところ、起動スクリプトは/usr/pkg/share/examples/rc.d/にサンプルがあるので/etc/rc.d/にコピーします。
各デーモンの起動は/etc/rc.confで以下のように設定します。

cnid_metad=YES
afpd=YES

Solaris系

Solarisはconfigureオプションにありませんが、ちゃんと動きます。
起動スクリプトは/etc/init.d/netatalkです。svcadmコマンドで制御できます。
netatalk.confは有効です。


動作確認

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

アクセス権の確認

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

ファイルネームの確認

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

メタデータの確認

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

タイムスタンプの確認

Macには作成時刻/変更時刻/最終アクセス時刻の3つがありますが、UNIXには作成時刻と変更時刻の区別がありません。netatalkではAppleDoubleファイルに時刻を格納して対応しています。samba側、UNIX側から作成したファイルにはAppleDoubleファイルがないわけですから、作成時刻と変更時刻が同じになります。
HFS+やAFPは1s単位で時間を刻みます。
NTFSは100ns単位で時間を刻みますが、FATでは2s間隔しか扱えません。sambaは設定次第でNTFS互換にもFAT互換にもなります。samba 3.5.0で、100ns単位で扱えるようになりました。
UNIX側はファイルシステムによって時間の解像度が異なります。例えばext3は1sですがext4は1nsです。
サーバとクライアントでタイムスタンプが完全に一致するとは思わない方がいいです。

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

サーバ側でシンボリックリンクを作ると、netatalk 2.0では問題が発生しました。CNIDに混乱が発生するからです。netatalk 2.1以降では、クライアントからちゃんとシンボリックリンクに見えます。サーバとクライアントの両方で、ls -lして確認してください。
sambaはfollow symlinksにてシンボリックリンクを追跡するかどうか設定できます。

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

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

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

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

# asip-status.pl サーバのIPアドレス
AFP reply from hoge:548
Flags: 1 Cmd: 3 ID: 57005
Reply: DSIGetStatus
Request ID: 57005
Machine type: Netatal2.2-beta4
AFP versions: AFP2.2,AFPX03,AFP3.1,AFP3.2,AFP3.3
UAMs: DHX2,DHCAST128
Volume Icon & Mask: exist
Flags: SupportsCopyFile,SupportsServerMessages,SupportsServerSignature,SupportsTCP/IP,SupportsSrvrNotifications,SupportsOpenDirectory,SupportsUTF8Servername,SupportsUUIDs,SupportsSuperClient
Server name: hoge
Signature:
d7 ce 23 49 d9 00 65 3e bf 48 7c 5f 38 e4 8a 0e ..#I..e>.H|_8...
Network address: 192.168.1.1 (TCP/IP address)
UTF8 Servername: hoge

Machine type:は単なる参考情報です。最近netatalkはバージョン情報も入っています。この例では"Netatal"となっており一文字足りないですが、これは16文字制限があるからです。

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

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

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

Server name:UTF8 Servername:はサーバ名です。前者はMacJapaneseであり、後者はUTF8-MACです。普通はASCIIの名前にするでしょうから、両者は同じでしょう。ここがlocalhostになっていると、問題が発生します

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

Network address:は接続するサーバのアドレスです。適切なアドレスになっている事を確認してください。ここがlocalhostとか127.0.0.1になっていると問題があります。この問題は/etc/hostsの記述に由来します。

悪い例 ×

127.0.0.1      myservername  localhost.localdomain  localhost

良い例 ○

127.0.0.1      localhost
192.168.1.130  myservername  myservername.example.org

この間違った/etc/hostsの記述は、sambaでも問題となります。

参考: 日本Sambaユーザ会 - Sambaが動作しないときの診断方法

以上の説明で、localhostとか127.0.0.1がヤバい事がおわかりでしょう。この現象に遭遇した場合は、サーバのhostnameや/etc/hostsが適切かどうか確認してくだい。

また、AppleTalkやAFP over SSHを有効にしている場合、それらに対応するNetwork address:が表示される事も確認してください。


安全な接続

AFP

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

-advertise_ssh -fqdn サーバ名

と書いておけば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

サーバ側でsshを使い、クライアント側はトンネリングする為のソフトを入手してWindowsにインストールし、SMB over SSHを実現する方法がありますが、結構手間がかかります。
samba 3.2以降で暗号化通信がサポートされたようですが、よく知らないのでパス。


トラブルシュート

どうやって調べるか

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

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

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_dbdが起動してない場合は設定ファイルや起動スクリプトを確認してください。
通信できてない場合は、IPv4とIPv6の取り違えとか、ファイアウォールの設定が考えられます。

makeの途中でコケる

ldap.c:56: error: array type has incomplete element type
ldap.c:72: error: array type has incomplete element type

ldap.c:56: error: 配列の型が不完全要素型を持っています
ldap.c:72: error: 配列の型が不完全要素型を持っています

makeの途中でこのようなエラーが出て止まるのは、netatalk 2.2.1迄のバグです。configureの段階で、ACL Support:NoなのにLDAP Support:Yesになっている場合に発生します。 両方No、または両方Yesになるようにconfigureしてからmakeしてください。このバグはのnetatalk 2.2.2で修正されましたが、そもそも両方No、または両方Yesじゃないと意味がありません。

不可解なログが出る 1

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

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

不可解なログが出る 2

volume "xxxx" does not support Extended Attributes, using ea:ad instead

ea:autoのとき上記のようなログが出ている場合、EAをEAとして保存できなかったので.AppleDoubleディレクトリに保存するということです。ファイルシステムの設定を確認してください。

Linuxのext2/ext3/ext4は正しく設定すればEAが使えます。btrfsは何も設定しなくても使えます。FreeBSDやSolarisでも使えます。NetBSD、OpenBSDはデフォルトで拡張属性が使えないようなのでadかもしれません。

Time Machineが不安定

netatalk 2.1.xの頃はTime Machine対応が不完全だったので不安定になるケースがありましたが、netatalk 2.2.xでは聞きません。
単にネットワークが不安定ということはないでしょうか。特に初回バックアップはデータが大量に流れるので、無線LANだと不安定になりがちです。
まず、安定した有線LANで試してください。


残る問題

パーミッションが変

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

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

このとんでもない問題を緩和するには、AppleVolumesファイルでuprivオプションを使い、更にdperm/fpermオプションを設定します。これはクライアントが要求してきた属性とORを取るものです。例えば、dperm:700 fperm:600と設定しておけば、少なくとも所有者は確実に読み書き出来ます。

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

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

BSD flagsが使えない

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

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

sambaにはsmbclientコマンドが付いてきますが、netatalkにafpclientコマンドはありません。
TCP/IPベースでAFPのボリュームをファイルシステムとしてマウントするafpfs-ngというのがあります。ftpコマンドのようなafpcmdも付属します。テストしてみましたが、まだまだ不完全です。AppleTalkは使えません。ファイル名はUnicodeのみでMacJapaneseは扱えません。Unicodeの合成(precompose)の処理に問題があり日本語ファイル名がまともに扱えないので開発者にパッチを送ってありますが、いつまで経ってもバージョンアップされません。まともに使えるのはせいぜいASCIIファイル名だけでしょう。リソースフォークは扱えないのでデータフォークのみです。
alexthepuffin - afpfs-ng 0.8 An open source client for Apple Filing Protocol
SourceForge.net: 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の長さは実質的に無制限となっています。パケットを解析してみると、pathname長さを示すところが2バイトあるので、0xFFFF=65535バイト迄表現出来る筈です。


雑談

「長い名前」という言葉の混乱

AFP 3の仕様書をみると、ファイル名の扱い(type)には三種類あります。

Type1short nameDOS互換/8.3形式
Type2long nameHFS互換/日本語環境ではMacJapanese/31バイト制限
Type3unicode name (AFPname)Unicode (decomposed UTF-8)/実質的に長さ制限なし (パケット解析すると65535バイト制限)

我々が普段「短い名前」と言っているのは、仕様書上では「long name」であり、「長い名前」と言っているのは「unicode name」或は「AFPname」と呼びます。

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

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

HFS Plus Volume Format

B ツリーキーの比較ルーチン(Unicode 文字列を比較する)の複雑さを緩和するために、HFS Plus では Unicode 文字を完全に分解した形式にして、合成文字を標準の順番で格納することを規定しています。

正規化処理を行なう場合、NFDの方がNFCよりも速いんです。

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

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


参考

Netatalk - Networking Apple Macintosh through Open Source
netatalkのホームページ
SourceForge.net: netatalk
sourceforge projectのnetatalkのページ
netafp - the netatalk company | The Netatalk OS Company
netatalk開発者の一人であるFrank Lahmのページ
SourceForge.jp: Project Info - Netatalk 日本語化プロジェクト
2003年からあるプロジェクトのようですが、活動の形跡が全くないので読む価値なし
Samba - opening windows to a wider world
sambaのホームページ
Samba-JP
sambaの日本語情報
Netatalk
拡張ファイル属性 (EA)
AppleTalk
Apple Filing Protocol (AFP)
AppleShare
フォーク
リソースフォーク
AppleSingle/AppleDouble
Finder情報
Bonjour
Avahi
Zeroconf
サービス・ロケーション・プロトコル (SLP)
Transport Layer Security (TLS, SSL)
Wikipediaの関連項目
使いこなそうユニコード
正規化の説明などがわかりやすい
Inside AppleTalk Second Edition (pdf)
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の仕様。
http://users.phg-online.de/tk/netatalk/doc/Apple/
AppleSingleとAppleDoubleの仕様書があります。(Version1とVersion2の両方)
Technical Note TN1150 HFS Plus Volume Format
HFS Plusの資料

履歴


↑ Upper Page