Netatalk and Samba

2011.07.28

netatalk 2.2.0 リリース

このページはnetatalk 2.2系列について説明しています。

古いバージョンの情報は以下のページをどうぞ。
Netatalk 2.0.4 and Samba - 安定しているがちょっとセキュリティ問題あり。Time Machine対応なし。EA対応なし。
Netatalk 2.0.5 and Samba - Time Machine対応だが不完全なのでLionからバックアップできない。EA対応なし。
Netatalk 2.1.x and Samba - Time Machine対応だが不完全なのでLionからバックアップできない。EA対応あり。Bonjour対応なし。ACL/LDAP対応なし。


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の組み合わせにすべきです。


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

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

netatalkの開発はSourceForgeで行なわれているので、これを使って情報交換してください。
メーリングリストは比較的活発なので、ここに問い合わせたりパッチを送るとすぐにでも反応があります。

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

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

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

SourceForge.net: netatalk: Bugs
SourceForge.net: netatalk: Feature Requests
SourceForge.net: netatalk: Patches
SourceForge.net: netatalk: Topics for Help

日本語で情報交換する場は、ないに等しいです。
2ちゃんねるに「netatalkについて語るスレ」というのがあり、単純な問題が解決する可能性はありますが、込み入った問題が解決したケースはありません。まともな議論はまず無理でしょう。mixiにもコミュニティがありますが、閑古鳥が鳴いています。Lion発売以降あちこちのblog等で大騒ぎになっていたにも関わらず、これらのサイトには全く書き込みがありませんでした。

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

netatalkの開発はGitで行なわれています。
開発版のソースの入手はgitコマンドを使いますが、snapshotのtarballを拾ってくる方法もお手軽です。
いくつかのブランチがありますが、ここではmasterのみ紹介します。

master

現在のバージョン表記は2.2.1dev
http://netatalk.git.sourceforge.net/git/gitweb.cgi?p=netatalk/netatalk;a=shortlog;h=refs/heads/master

2.2.系列には以下のような機能が追加されています。

Git版のソースにはconfigureスクリプトが含まれません。bootstrapスクリプトを動かすとconfigureスクリプトが生成されます。


インストール手順

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

Berkeley DBのインストール

CNIDを扱うためにBerkeley DB 4.6以上が必須です。
バージョンが適切でないとconfigureの途中にエラーが出て止まるので、適切なバージョンのBerkeley DBをインストールしてください。configure 時に--with-uniquenameオプションを使うと既にインストールされている別バージョンと共存出来ます。

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

参考: Netatalk 2.2 Manual - Chapter 2. Installation

OpenSSLやLibgcryptのインストール

下の「netatalkのユーザ認証」のところで説明するように、暗号化パスワードを使う為には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のためデーモンのインストール

BonjourのためのZeroconfデーモンとしては、Avahiが使えます。
これを使うと、Mac OS X 10.2以降で便利になります。Macからサーバアイコンが見える、そのサーバアイコンを変えることができる、Time Machineボリュームが見える等の効能があります。そんな機能は必要ないという人は、入れなくていいです。

Avahiのホームページ: Avahi

SLPデーモンとしては、OpenSLPがあります。Solaris標準の/usr/lib/inet/slpd (SUNWslpr, SUNWslpu)も使えます。
これを使うと、Mac OS 8.5 〜 Mac OS X 10.4でサーバが見えるようになります。8.5 〜 9.2の場合、セレクタではなくネットワークブラウザで見えるようになるだけなので、注意してください。こんなレガシーな機能はどうでもいいという人は、入れなくていいです。

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

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

Mac OS X 10.5 Leopard以降、パーミッションの扱いがACLベースになりました。これに対応しないnetatalkの場合、パーミッションが異常になるのを防ぐためにdperm/fpermオプションを使います。
ばっちりパーミッションを扱うためには、ACL及びOpenLDAP対応にする必要があります。ACL関連ライブラリはOSによって異なるので、頑張って調べてインストールしてください。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のインストールです。2.2.0のソースはこちら。
netatalk - Browse /netatalk/2.2 at SourceForge.net

ソースを展開。

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

では、configureしましょ。(Git版の場合はconfigureがないので予めbootstrapを実行します。)

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

オプションは古いバージョンとは結構違います。$ ./configure --helpで確認してください。
--enable-redhatはRedHat、Fedora、CentOS等の場合の起動スクリプトをインストールするオプションです。他に--enable-suse--enable-gentoo--enable-cobalt--enable-netbsd--enable-debianがあります。Solarisでは何も指定しなくてもSolaris用がインストールされます。

あと、ライブラリをうまく認識しない場合は、--enable-srvloc--with-libiconv--with-libgcrypt-dir--with-ssl-dir--with-bdb--with-gssapi等を設定してください。

以下のオプションは昔のものです。現在のnetatalkのconfigureにはありません。

×  --with-tags (netatalk 1.xの時代のもの)
×  --with-nls-dir (netatalk 1.xの時代のもの)
×  --with-did (netatalk 1.xの時代のもの)
×  --with-cdb (netatalk 1.xの時代のもの)
×  --with-mangling (netatalk 1.xの時代のもの)
×  --with-flock-locks (netatalk 1.xの時代のもの)
×  --with-logfile (ログファイルは設定ファイルで指定可能だから)
×  --with-cnid-dbd-txn (これがデフォルトだから)
×  --with-cnid-db3-backend (廃止)
×  --with-cnid-hash-backend (廃止)
×  --enable-sendfile (Linuxだとデフォルトで有効だから)

めでたく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_INFO /var/log/netatalk.log"

afpd.confはファイルサーバafpdの設定を行ないます。
先頭の項目はサーバ名の設定ですが、「-」にしておくと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とかの対応)。

ea:autoのときログに、

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

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

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

~

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

/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:は、ボリュームのサイズをクライアントに知らせるときに、嘘をつく設定です。Mac OS X 10.6.3のTime Machineはボリュームのサイズぎりぎりまで使い切るので、それだと困る人は設定してください。単位はMiBなので、1024だと1GiBになります。

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

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

参考: Netatalk 2.2 Manual - AppleVolumes.default

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経由で見えないようにする事が出来ます。
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 20. スタッカブルVFSモジュール
参考: Netatalk 2.2 Manual - dbd


やってはいけないこと

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

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

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

HFS+のパーティションをLinuxにマウントしてnetatalk経由で使うな

なんだかとってもエレガントに思えますが、実際はダメです。
LinuxのHFS+ドライバがバグってるそうで、正常動作しないそうです。もしバグがなくてもダメです。メタデータの扱い方が異なるからです。OSにnativeなファイルシステムを使ってください。

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

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

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

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


AppleTalkは不要

Mac OSのクライアント機能

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


拡張属性 (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の設定ファイルでボリュームのオプションにtmを追加。quotaを使っていないのであれば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の場合も同様です。
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/内のデータベースは滅多に壊れません。もし壊れても、大抵はnetatalkが自動修復します。自動修復がうまくいかない場合はメンテ用のdbdコマンドで修復します。それでも修復出来ないような状況ならば、netatalkを停止→.AppleDB/ディレクトリを削除→netatalkを再起動してください。勝手に新たな.AppleDB/ディレクトリが作られます。

書き込み可能なボリュームであってもlastを使えば動作が速くなるという情報が出回っていますが、これは信用しないでください。間違った認識を元にした情報です。

.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文字制限。今更誰も使わない。
2-Way Randnum uams_randnum.so 双方向乱数交換。56ビットDES。弱い暗号化。8文字制限。今更誰も使わない。
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 なし 不明。OS X Lionで追加されたのかな。

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

uams_randnum.soは、afppasswdファイルを使ってパスワードを管理します。AFPクライアント側からパスワード変更すると、このファイルが書き換えられる筈です。つまりUNIXパスワードとは別管理です。
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のユーザ認証

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の起動

netatalkの起動は、まず起動スクリプト(initscript)で有効にしておいて、netatalk.confでどのdaemonを動かすか決めるという事になっていますが、OSやディストリビューションで微妙に方法が違います。特に、Debian系ではnetatalk.confを使わず/etc/default/netatalkを使うので注意してください。
configureスクリプトには--enable-redhat--enable-suse--enable-gentoo--enable-cobalt--enable-netbsd--enable-debianといったオプションがあるので、これをちゃんと選べば環境に応じた起動スクリプトがインストールされる筈です。

RedHat系

RedHat, Fedora, CentOS等のRedHat系の場合、configure optionは--enable-redhatを使います。
起動スクリプトは/etc/rc.d/init.d/netatalkです。
netatalk.confは有効です。

Debian系

DebianやUbuntuの場合、configure optionは--enable-debianです。
netatalk.confを使わず、代わりに/etc/default/netatalkを使います。

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/atalkです。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以降で暗号化通信がサポートされたようですが、よく知らないのでパス。


トラブルシュート

なんか変なメッセージが出る

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の取り違えとか、ファイアウォールの設定が考えられます。


残る問題

パーミッションが変

そもそも、Mac OS Xのパーミッションの動作が変です。Terminall.appからls -lで見た場合と、Finderの「情報を見る」で確認出来るパーミッションが異なります。更にFinderからは実行属性が扱えません。
更にMac OS X 10.4 Tiger迄と10.5 Leopard以降で動作が違います。Leopard以降ではユーザひとりで使っているような場合は問題ありませんが、複数ユーザで使っている場合、同一groupの他ユーザがアクセス出来ないかもしれません。これはAppleVolumesファイルでuprivオプションを使うと緩和出来ます。UNIXパーミッションを継承するものです。Leopard以降の「情報を見る」でアクセス権を変更するとパーミッションが異常になりファイルにアクセス出来なくなるので注意してください。こうなるとchmodコマンドで直すしかありません。
netatalk 2.0.4以降では、dpermfpermというオプションが追加されています。これはクライアントが要求してきた属性とORを取るものです。例えば、dperm:700 fperm:600と設定しておけば、少なくとも所有者は確実に読み書き出来ます。
なお、この問題はnetatalk 2.2系にてACL及びOpenLDAPの設定を行うと解決するはずです。

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

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

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

AppleのTechnoteのテーブルがおかしい

AppleのTechnoteのページにUNICODE DECOMPOSITION TABLEがありますが、参考にしないでください。

AppleのTecknoteに載っているテーブル:
UNICODE DECOMPOSITION TABLE

Unicode 2.xベースのテーブルなので、ギリシャ拡張文字の順序等がおかしいです。Mac OS X 10.2以降はUnicode 3.2規格なのでこのテーブルと一致しません。じゃあMac OS X 10.1以前はどうかというと、バギーなので変換テーブルすら作れないです。


参考

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
サービス・ロケーション・プロトコル (SLP)
Secure Sockets Layer (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の資料

blog

このページでは特に触れていないようなネタや速報は、blogの方に書く事にしました。

netatalk:HAT blog


履歴


↑ Upper Page