Netatalk and Samba

2017.03.20


Unix系OSをWindowsのファイルサーバとする場合、SambaというSMB (CIFS)用のソフトウェアがあります。
一方、現在のmacOSはAFPを縮小し、SMBに移行しつつあります。
このページでは、MacからはNetatalkWindowsからはSambaへ接続しつつ、Sambaのみに移行する方法を述べます。

注: Time Machine機能はAFPのみなのでNetatalkが必要です。

このページはNetatalk 3.1.xについて説明しています。
古いバージョンは仕様が異なるので、以下のページをご覧ください。
Netatalk 2.xから3.xへ移行する人のための情報 - 仕様が大幅に変更。
Netatalk 2.2.x and Samba - Spotlight対応なし。設定が複雑。メタデータを隠しディレクトリに保存。
Netatalk 3.0.x and Samba - Spotlight対応なし。設定が簡潔。メタデータを可能な限り拡張属性に保存。無理なら隠しファイルに保存。

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


各ファイルシステム/プロトコルの差異

以下のように、MacとWindowsは仕様が異なるので、20年以上NetatalkとSambaを併用するしかありませんでした。
しかしながら、近年になってAppleはSMBを独自拡張し、Macの要件を満たすようにしました。
現在のSambaはvfs_fruitというvfsモジュールを導入し、このSMB独自拡張を使えるようにしています。

MacのファイルシステムHFS+及びファイル共有プロトコルAFPは、以下のような特徴を持ちます。

macOSで開発中のファイルシステムAPFSは、以下のような特徴を持ちます。

WindowsのファイルシステムNTFS及びファイル共有プロトコルSMBは、以下のような特徴を持ちます。

ところで、Unix系の一般的なファイルシステムは以下のような特徴を持ちます。

ファイル本体のみ正常に扱うことが出来れば他のメタデータは必要ないという考え方もありますが、メタデータはOSやアプリケーションが何らかの理由で扱うため、これを喪失すると思わぬトラブルに遭遇します。
Mac/Winファイルサーバ管理者は、これらを理解して運用しなければならない苦痛を強いられているのが現状です。

Mavericks以降同士のファイル共有はSMBが優先:HAT blog
NetatalkとSambaの統合:HAT blogsy


Netatalkのインストール手順

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

参考: NetatalkとSambaの近状:HAT blog

地道に自分でインストールする場合は、まずライブラリ類のインストールから開始します。これらのライブラリは大抵のOSでパッケージが配布されています。

参考: Netatalk 3.1 Manual - Chapter 2. Installation

Berkeley DB (絶対必要)

CNIDを扱うためにBerkeley DB 4.6以上が必須です。
パッケージの名前は、Debian系の場合libdb4.8-dev、RedHat系の場合libdb-develdb4-develというように、見落としやすいので注意してください。

Berkeley DBのありか: Oracle Berkeley DB

MySQLまたはMariaDB (大規模サーバ向け)

CNIDを扱う方法として、MySQLサーバを使う方法も用意されています。大規模サーバ(Clustering/HA)向けだそうです。
あまり調べてないので詳しい話はパス。

Libgcrypt (絶対必要)

下の「ユーザ認証」のところで説明するように、暗号化パスワードDHX2を使う為にLibgcryptが必要です。これがないとビルドできません。

Libgcryptのホームページ: Libgcrypt - Free Software Directory

OpenSSLまたはLibreSSL (古いMacに必要)

下の「ユーザ認証」のところで説明するように、古いMacは暗号化パスワードDHX2に対応していないので、DHXを使う為にOpenSSLまたはLibreSSLが必要です。

OpenSSLのホームページ: OpenSSL: The Open Source toolkit for SSL/TLS
LibreSSLのホームページ: LibreSSL

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

Tracker (使う人だけ)

通常のファイル検索は遅いしファイル名でしか検索できません。
Trackerを使うとSpotlight検索が使えるので、検索速度が劇的に速くなり、ファイルの中身も検索してくれます。
Time Machine専用で使っている人には不要でしょう。

最近の環境だとTrackerパッケージが用意されていますが、古い環境にはありません。自分でTrackerをソースからビルドするのは困難だそうです。
TrackerはGnome TrackerとかMeta Trackerと表記されている場合もあるので注意してください。

ビルド及び設定にはコツがいるのでNetatalkのドキュメントを読んでください。
Tracker自身のバージョン番号と、pkg-configにおけるバージョン番号は別なので注意してください。少なくともTracker自身のバージョンは0.7以上が必要とされますが、最近のバージョンでなければ正常動作しないという情報もあります。

ビルド方法: Chapter 2. Installation - Compiling Netatalk
設定方法: Chapter 3. Setting up Netatalk - Spotlight
Trackerのホームページ: Projects/Tracker - GNOME Wiki!

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

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

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

Kerberos (使う人だけ)

ケルベロス認証を使う環境のみ必要。
よく知らないのでパス。

libevent (まあまあ重要)

netatalkという名前のデーモンは、libeventライブラリ(バージョン2以降)を使って他のデーモン(afpd、cnid_metad等)を操ります。
configureオプションでは--with-libeventがデフォルトになっており、この場合Netatalkにバンドルされているlibevent2が使われます。
ただし、OS側がlibevent2を用意している場合は--without-libeventオプションを指定してOS側のものを使うことをお勧めします。もし将来libeventのセキュリティホールが発見されたとき、迅速に対策版にアップデートされるでしょうから安心です。
OS側のlibeventがバージョン1だったり、そもそも用意されていない場合はバンドル版を使ってください。

libeventのホームページ: libevent

tdb (意外と重要)

NetatalkはBerkeley DBを使ってCNIDを管理しますが、もしこれのデータベースファイルが壊れた場合、「Something wrong with the volume's CNID DB, using temporary CNID DB instead.」という警告を出してリードオンリーに変更し、メモリ上でCNIDを管理します。このとき使われるのがtdbライブラリです。
configureオプションでは--with-tdbがデフォルトになっており、この場合Netatalkにバンドルされているlibtdbが使われます。
ただし、OS側がlibtdbを用意している場合は--without-tdbオプションを指定してOS側のものを使ってください。そうでないと2つのlibtdbがコンフリクトしてafpdが落ちる場合があります。

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

CrackLib (使う人だけ)

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

D-Bus (使う人だけ)

afpstatsコマンドを使ってユーザの接続状態を確認できますが、そのためにD-Busの機能を使います。
同様のコマンドにmacusersがあるので必要性は少ないです。

また、AvahiやTrackerもD-Busの機能を利用します。

DTrace (使う人だけ)

SolarisやBSD系のDtraceの機能を使って動的なトレースをとることができます。つまり解析用です。
Linuxの場合はSystemTapのDTrace互換機能を使うことができます。Debian系の場合systemtap-sdt-devパッケージ、RedHat系やSUSE系の場合systemtap-sdt-develパッケージによって有効になります。

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

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

$ iconv -l

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

最近の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-systemd \
        --without-libevent \
        --without-tdb \
        --with-cracklib \
        --enable-krbV-uam \
        --with-pam-confdir=/etc/pam.d \
        --with-dbus-daemon=/usr/bin/dbus-daemon \
        --with-dbus-sysconf-dir=/etc/dbus-1/system.d \
        --with-tracker-pkgconfig-version=1.0

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

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

Compilation summary:
    CPPFLAGS       = -I$(top_srcdir)/include -I$(top_builddir)/include -I$(top_srcdir) 
    CFLAGS         = -D_U_="__attribute__((unused))" -g -O2
    LIBS           =  -lcrack
    PTHREADS:
        LIBS   = 
        CFLAGS = -pthread
    TRACKER:
        LIBS   = -ltracker-sparql-1.0 -lgio-2.0 -lgobject-2.0 -Wl,--export-dynamic -lgmodule-2.0 -pthread -lglib-2.0
        CFLAGS = -pthread -I/usr/include/tracker-1.0 -I/usr/include/tracker-1.0/libtracker-sparql -I/usr/include/glib-2.0 -I/usr/lib/x86_64-linux-gnu/glib-2.0/include
    SSL:
        LIBS   =  -L/usr/lib64 -lcrypto
        CFLAGS =  -I/usr/include/openssl
    LIBGCRYPT:
        LIBS   = -lgcrypt
        CFLAGS = 
    PAM:
        LIBS   =  -lpam
        CFLAGS = 
    WRAP:
        LIBS   = -lwrap
        CFLAGS = 
    BDB:
        LIBS   =  -L/usr/lib64 -ldb-5.3
        CFLAGS = 
    GSSAPI:
        LIBS   = -L/usr/lib/x86_64-linux-gnu/mit-krb5 -Wl,-Bsymbolic-functions -Wl,-z,relro -lgssapi_krb5 -lkrb5 -lk5crypto -lcom_err
        CFLAGS = -isystem /usr/include/mit-krb5
    ZEROCONF:
        LIBS   =  -lavahi-common -lavahi-client
        CFLAGS =  -D_REENTRANT
    LDAP:
        LIBS   =  -lldap
        CFLAGS = 
    LIBEVENT:
        LIBS   = 
        CFLAGS = 
    TDB:
        LIBS   = -ltdb
        CFLAGS = 
    MySQL:
        LIBS   = -L/usr/lib/x86_64-linux-gnu -lmysqlclient -lpthread -lz -lm -lrt -latomic -ldl
        CFLAGS = -I/usr/include/mysql -fdebug-prefix-map=/build/mysql-5.7-p7XPK2/mysql-5.7-5.7.17=. -fabi-version=2 -fno-omit-frame-pointer
Configure summary:
    INIT STYLE:
         debian-systemd
    AFP:
         Extended Attributes: ad | sys
         ACL support: yes
         Spotlight: yes
    CNID:
         backends:  dbd last tdb mysql
    UAMS:
         DHX     (PAM SHADOW)
         DHX2    (PAM SHADOW)
         RANDNUM (afppasswd)
         Kerberos V
         clrtxt  (PAM SHADOW)
         guest
    Options:
         Zeroconf support:        yes
         tcp wrapper support:     yes
         quota support:           yes
         valid shell check:       yes
         cracklib support:        yes
         ACL support:             auto
         Kerberos support:        yes
         LDAP support:            yes
         AFP stats via dbus:      yes
         dtrace probes:           yes
    Paths:
         Netatalk lockfile:       /var/lock/netatalk
         init directory:          /lib/systemd/system
         dbus system directory:   /etc/dbus-1/system.d
         dbus daemon path:        /usr/bin/dbus-daemon
         tracker prefix:          /usr
         tracker install prefix:  /usr
         tracker manager:         /usr/bin/tracker daemon
         pam config directory:    /etc/pam.d
    Documentation:
         Docbook:                 no

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

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

$ make
# make install

netatalk -Vafpd -Vで機能や設定ファイルの場所が確認できます。

$ netatalk -V
netatalk 3.1.11 - Netatalk AFP server service controller daemon

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version. Please see the file COPYING for further information and details.

netatalk has been compiled with support for these features:

      Zeroconf support: Avahi
     Spotlight support: Yes

                  afpd: /usr/local/sbin/afpd
            cnid_metad: /usr/local/sbin/cnid_metad
       tracker manager: /usr/bin/tracker daemon
           dbus-daemon: /usr/bin/dbus-daemon
              afp.conf: /usr/local/etc/afp.conf
     dbus-session.conf: /usr/local/etc/dbus-session.conf
    netatalk lock file: /var/lock/netatalk
$ afpd -V
afpd 3.1.11 - Apple Filing Protocol (AFP) daemon of Netatalk

This program is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free Software
Foundation; either version 2 of the License, or (at your option) any later
version. Please see the file COPYING for further information and details.

afpd has been compiled with support for these features:

          AFP versions: 2.2 3.0 3.1 3.2 3.3 3.4 
         CNID backends: dbd last tdb mysql 
      Zeroconf support: Avahi
  TCP wrappers support: Yes
         Quota support: Yes
   Admin group support: Yes
    Valid shell checks: Yes
      cracklib support: Yes
            EA support: ad | sys
           ACL support: Yes
          LDAP support: Yes
         D-Bus support: Yes
     Spotlight support: Yes
         DTrace probes: Yes

              afp.conf: /usr/local/etc/afp.conf
           extmap.conf: /usr/local/etc/extmap.conf
       state directory: /usr/local/var/netatalk/
    afp_signature.conf: /usr/local/var/netatalk/afp_signature.conf
      afp_voluuid.conf: /usr/local/var/netatalk/afp_voluuid.conf
       UAM search path: /usr/local/lib/netatalk//
  Server messages path: /usr/local/var/netatalk/msg/

Sambaのインストール手順

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


Netatalkのafp.confの設定

参考: Netatalk 3.1 Manual - afp.conf

基本的な設定例

[Global]
    spotlight = yes
    vol preset = my default values

[my default values]
    ea = samba

[Homes]
    basedir regex = /home

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

[私のタイムマシーン]
    path = /where/my/backup
    time machine = yes
    spotlight = no

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

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

vol presetで設定したセクションの内容は、全ボリューム共通のデフォルト値を設定できます。
ea = sambaは、拡張属性(EA)の保存方法をSambaに合わせるものです

[Homes]セクションはホームディレクトリの設定です。サーバ側の/etc/passwdファイルで指定されたホームディレクトリを扱えるようになります。basedir regexを必ず設定してください。このパラメータを廃止すべく検討が行われていますが、今のところ設定しないと機能しません。afp.confのmanpageで(H)になっているパラメータは[Homes]専用です。basedir regexhome nameがあります。あと(V)のパラメータも一通り使えますが、pathだけは通常ボリュームと使い方が違うので注意が必要です。

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

time machine = yesを使うことで、Time Machine用のボリュームを「私のタイムマシーン」という名前で公開しています。
タイムマシーン用のボリュームでSpotlight検索のインデックスを作っても意味がないので、無効にしています。

かなり古いMacがあるよ

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

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

[Global]
    mac charset = MAC_JAPANESE

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

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

最近のMacならばuams_dhx2.soがあれば十分です。
しかし、クライアントが古ければ古いほど旧式の認証方法が必要です。Mac OS X 10.1以前はユーザ認証にDHX2が使えないので、DHX (DHCAST128)を使うことになります。
更に古い場合はクリアテキストを使う必要があるでしょう。詳しくは下の「ユーザ認証」を読んでください。

漢字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エンコーディングを廃止したからです。

ログファイルの設定

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

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

デバッグ用にログをとる

[Global]
    log level = default:maxdebug

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


Sambaのsmb.confの設定

基本的な設定例

[global]
    vfs objects = catia fruit streams_xattr
;   fruit:locking = netatalk
    fruit:encoding = native
    streams_xattr:prefix = user.
    streams_xattr:store_stream_type = no
    ea support = yes

    hide files = /.DS_Store/Network Trash Folder/TheFindByContentFolder/TheVolumeSettingsFolder/Temporary Items/.TemporaryItems/.VolumeIcon.icns/Icon?/.FBCIndex/.FBCLockFolder/
    veto files = /lost+found/
    delete veto files = Yes

    read only = No

[homes]

[みんなの共有はここ]
    path = /where/all/users
    force create mode = 0660
    force directory mode = 0770

[global]セクションはサーバの設定を行います。smb.confのmanpageで(G)になっているパラメータを書くことができます。
(S)になっているパラメータ書くと、全ての共有に共通のデフォルト値を設定できます。ここでは、Netatalkとファイルの保存方法を共通にする設定を紹介しています。
vfs objects = catia fruit streams_xattrは、AppleによるSMBの拡張機能を使えるようにするためのvfsモジュールを読み込む設定です。必ずこの順序で書いてください。
fruit:locking = netatalkは、ファイルの排他処理をNetatalkに合わせるものです。NetatalkとSambaで同じファイルを同時に開いたときの問題をなくすものです。しかしながら、Macからファイルが削除ができなくなるバグがあるので、ここでは先頭に「;」を付けてコメントアウトしています。
fruit:encoding = nativestreams_xattr:prefix = user.streams_xattr:store_stream_type = noは、ファイル名や拡張属性名の扱いをNetatalkと共通にするものです。Linuxではこの設定で正常動作します。FreeBSDではバグがあるので以下のパッチを当てる必要がありましたが、現在はports/pkgのsamba44に取り込まれているので正常動作します。Samba 4.6.0では正式に直っています。

パッチ: [Samba] [PATCH] vfs_fruit: FreeBSD: attrname is wrong

ea support = yesを付けないと、最近のMacから拡張属性が見えません。
hide files = は、Macが作る隠しファイルにHidden属性を付けるものです。veto filesではなくhide filesを使ってください。Macが必要だから作っているわけですから、veto filesで完全に見えなくすると問題が発生するのは容易に想像できます。

[homes]セクションはホームディレクトリをクライアントから見えるようにするものです。

[みんなの共有はここ]という共有では、パーミッションの設定を緩くしています。force create modeforce directory modeはそれぞれファイルとディレクトリのパーミッションとORを取って保存するものです。

かなり古い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で廃止になったので設定する必要はありません。

排他処理問題を軽減する

Netatalk経由とSamba経由で同じファイルを開いた場合、ファイルロックの方法が異なるためファイルが壊れる可能性があります。そこで、fruit:locking = netatalkを使って、ファイルロックの方法を統一します。しかしながらこのオプションはバグっていて使えません。

そこで、かわりに「軽減する」方法を説明します。
先に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側から同じファイルをいじったときにロックが外れる事を確認することをお勧めします。

しかし、streams_xattrを使っている場合、kernel oplocksと共存出来ないので次のようにします。

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

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


Netatalkの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を共有する場合等に使うもの。
cnid scheme = mysql大規模サーバ(Clustering/HA)向け

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

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

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

一方、SMBにはCNIDの概念がないので、Sambaではこのような問題を考える必要はありません。


Time Machine対応

MacにはTime Machineというバックアップ機能があり、ローカル接続ドライブだけでなく、ネットワーク上のファイルサーバにもバックアップできます。これにはAFPプロトコルが使われます。かつてSMBプロトコルで無理矢理バックアップする方法もありましたが、お勧めできません。従ってNetatalkを使ってください。Sambaはダメです。

Bonjourで発見できる場合

Time Machineを使う人は、Netatalkを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ボリュームをマウントして復旧する練習をしておいてください。かなり煩雑な作業になります。


Spotlight対応

NetatalkをSpotlight対応にするにはコツがいるので、本家のドキュメントを読んでください。

ビルド方法: Chapter 2. Installation - Compiling Netatalk
設定方法: Chapter 3. Setting up Netatalk - Spotlight

Spotlight機能は問題解決に時間がかかっているので、以下のページを参考にしてください。

参考: Netatalk 3.1.xのSpotlight検索の問題:HAT blog

SambaのSpotlight対応はかなり面倒なので、SambaのWikiを読んでください。

参考: Spotlight - SambaWiki


ユーザ認証

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ライブラリが必要です。

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じゃないとダメだが、普通のファイル共有なら別のポート番号でも動く。
4700 - CNIDサーバがafpdとの通信に使う。IANAには登録されてない。通常はlocalhost内での通信なので外部に開く必要はない。
5353 mdns Multicast DNS。AvahiやmDNSResponderが使う。AFPサーバやTime Machineボリュームを宣伝する。UDP。

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

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


やらないほうがいいこと

HFS+, FAT, exFAT, NTFS等をサーバ側にマウントしてNetatalk/Samba経由で使うな

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

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

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

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を使う方法は不便なので、vol dbnestというオプションが用意されています。
これを使うと、CNIDデータベース(.AppleDB)がボリュームパスの下に作られるので、競合問題が発生しません。

[Global]
     vol dbnest = yes

一方、Sambaでボリュームをネストしても問題ありません。CNIDを扱わないからです。


Netatalkの起動/停止

Netatalkのデーモンは4つ。

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

Debian系

DebianやUbuntuの場合、sysvinit互換のupstartを採用しているので、configure optionは--with-init-style=debian-sysvです。
Debian 8 jessieやUbuntu 15.04 vividはsystemdに移行したので--with-init-style=debian-systemdを使います。

RedHat系

RedHat系(CentOSやScientific Linux)はかつてsysvinit互換のupstartを採用していたので、--with-init-style=redhat-sysvを使います。serviceコマンドで制御できます。
現在のFedora 15以降、EL7以降はsystemdなので、--with-init-style=redhat-systemdを使います。systemctlコマンドで制御できます。

Gentoo

GentooはOpenRCを採用しており、--with-init-style=gentoo-openrcを使います。
systemdを利用している場合は--with-init-style=gentoo-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起動スクリプトを用意しています。

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はこれを参照しません。Netatalk 3.xでは拡張属性に時刻を格納して対応しています。Samba側、Unix側から作成したファイルにはこの拡張属性がないわけですから、作成時刻と変更時刻が同じになります。
HFS+やAFPは1s単位で時間を刻みます。APFSは1ns単位です。
NTFSは100ns単位、、exFATは10μs単位、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 hoge:548 via IPv4
Flags: 1  Cmd: 3  ID: 57005
Reply: DSIGetStatus
Request ID: 57005
Machine type: Netatalk3.1.9
AFP versions: AFP2.2,AFPX03,AFP3.1,AFP3.2,AFP3.3,AFP3.4
UAMs: DHX2,DHCAST128
Volume Icon & Mask: Yes
Flags: 
    SupportsCopyFile
    SupportsServerMessages
    SupportsServerSignature
    SupportsTCP/IP
    SupportsSrvrNotifications
    SupportsOpenDirectory
    SupportsUTF8Servername
    SupportsUUIDs
    SupportsExtSleep
    SupportsSuperClient
Server name: hoge
Signature:
ca eb 2d 4a fa 06 b0 5c ae da 13 af f4 0b c4 f5  ..-J...\........
                                                  
Network address: 192.168.1.141 (IPv4 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に繋がらない

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

  1. そもそもNetatalkが起動してない
  2. Zeroconf (Bonjour)で宣伝できていないので見つからない
  3. AFPプロトコルで通信できていない
  4. ユーザ認証が通っていない
  5. ボリュームにアクセスできていない

1の場合はpsコマンドとかで確認してください。起動直後に異常終了しているケースもあります。
2の場合はafpd -VでZeroconf有効でビルドされていることを確認してください。Netatalkよりも先にAvahiやmDNSResponderが起動されていることを確認してください。ファイアウォールを使っている場合は5353番ポートを確認してください。Linuxの場合、SELinuxが有効になっているとD-Bus機能を封じて宣伝できないケースもあります。
3の場合はまずファイアウォールのチェックでしょう。548番ポートが開いていることを確認してください。単に接続先を間違っているケースもあります。実はSMBに繋ごうとしていたり、アドレスを間違っているケースもあります。
4の場合はUAMとかパスワードを調べてください。
5の場合はそのディレクトリのパーミッション等を調べてください。

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

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のホームディレクトリが見えない

[Homes]セクションにはbasedir regex =の設定が必須です。
このパスがシンボリックリンクを含んでいる場合は、シンボリックリンクを展開したパスを書けば動作します。

あと、[Homes]セクションでvalid users =を設定すると異常になるバグがあります。このバグはまだ直っていません。

Mac OS X 10.1以前からNetatalkを発見できない

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

クライアントからSambaを発見できない

nmbdを起動してないとか、ありませんかね。
このnmbdによる宣伝方法(WINS)は非常に古い仕様なので、しばらく待たないと情報が更新されません。気長に動作確認してください。


残る問題

各ディレクトリの.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の設定を行うことです(未確認)。

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

BSD flagsが使えない

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

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の問い合わせや開発への参加

Netatalkはユーザ数が少なく、開発者は3人しかいません。他の人がパッチを提供するのは極めて稀です。従って、問題を発見した本人が報告しないと永久に直らない可能性が大です。

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

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

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

Netatalk-announce Info Page - 新バージョンリリース時にアナウンスが流れるメーリングリスト

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

netatalk-ja 案内ページ

Web上にも情報交換の場があります。アカウントを作らないと書き込みできません。

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

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

参考: Netatalk 3.1 Manual - Chapter 2. Installation

git版はGitHubにて管理されています (もはやSourceForgeでは管理していません)。

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

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

master

新しいパッチは、まずmasterにコミットされます。

branch-netatalk-3-1

現行安定版のnetatalk 3.1.xを保守するブランチです。上記masterから、現行安定版のために必要なものが、このブランチにcherry-pickされます。


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

Sambaのvfs_fruitの開発を行っているのは、Ralph Böhme (Frank Lahm, slowfranklin)です。この人はNetatalkのメインの開発者でもあります。

本家のメーリングリストの一覧は以下の場所にあります。辿ればアーカイブも読めます。沢山のメーリングリストがありますが、一般的な話題はsambaメーリングリスト、技術的な話題はsamba-technicalメーリングリストがよいと思います。vfs_fruitに関する質問をすると、まず間違いなくRalph Böhmeが返答します。

lists.samba.org Mailing Lists - Sambaの本家のメーリングリスト一覧

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

samba-jp 案内ページ

Web上にバグを登録/閲覧するサイトがあります。アカウントを作らないと書き込みできません。

The Samba-Bugzilla Main Page


参考

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ベンダ。上記Frank Lahmがこの会社に入社してvfs_fruitを実装した。
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の項。
MetaTracker - Wikipedia
WikipediaのMetaTrackerの項。別名Tracker, Gnome Tracker。
Transport Layer Security - Wikipedia
WikipediaのTransport Layer Security (TLS, SSL)の項
使いこなそうユニコード
ちょっと内容が古いけど、正規化の概念の説明などがわかりやすい
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の仕様。
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