Last Update: "2013/06/06 18:18:16 makoto"

TCP/IP と AppleTalk

Macintosh が初めて Network 機能を持った時にしゃべる言葉は AppleTalk でした。
並行して世の中には Internet 接続が TCP/IP で広く使われるようになりました
自然な流れとして Macintosh も TCP/IP もしゃべるようになります。 それでも、しばらくは AppleTalk も Mac の世界でも並行して使われていました。
そのうちに、AppleTalk 上で使われていた上位の通信を TCP/IP でも行なえる ようになります。例えば port 548 を使った File 共有の通信です。
AppleTalk は、自分(サーバ)の存在を広く放送します。このように放送を行なう場合に、 これは使う側からは (何が利用出来るかが分るので)便利ですが、二つ問題があります。常に放送が流れる ので通信量が大きいです。また安全上も何があるか教えてくれているので、攻撃しやすいです。 本来 TCP/IP と AppleTalk は対立(並立)する用語です。

netatalk

Netatalk (英語的には「ねらとーく」のように言うようです)。 は、Unix と Macintosh が仲良くなるためのソフトウェアです。 もう少し別の言い方をしますと、 Apple のプロトコルをしゃべるためのものです。

AppleTalk と TCP/IP

Apple のプロトコルは AppleTalk と呼ばれます。TCP/IP ではなくて AppleTalk、ということです。 ただし、最近の Mac は TCP/IP (port 548) を使ったファイルサーバも使える ので、その機能も内蔵しています (Netatalk への TCP/IP の追加は asun (Adrian Sun)のおかげです)。

ちなみに、ルータを介した通信は、特にルータに設定がない場合、TCP/IP だけが利用出来ます。ルータを自前で用意して設定しているような場合には、 そのルータに Netatalk のうちの atalkd を入れておけば、AppleTalk の中継が可能となります。つまり、 ルータ越にファイルサーバ機能を使う場合には、次の組合せがあります。
クライアントとサーバ が通信するプロトコルルータに必要な機能
純粋 Appletalk + atalkd
AppleTalk over TCP TCP/IP only
更に付加えると、純粋 AppleTalk の場合でも、 ネットワークをつないでいる箱が、ルータでなくブリッジであれば、その箱を越えて AppleTalk 通信 が(当然)可能です。 Mac OS X のファイルサーバ機能は、 サーバ側としても、クライアント側としても AppleTalk over TCP を話しますので、 ルータについては、あまり考えなくてもいいということになります。

話がそれますが、AppleTalk (だけ)をしゃべるプリンタを、AirMac を通じて使いたい、という時には AirMac のブリッジ機能を有効 にすれば可能になります (ただしブリッジは、二つのネットワークを一つに見えるように つないでしまう ものですから、単純に有効にすると、問題が起きてしまう場合 もあります)。

版と構成部品

以下の記述は、次の版の設置時点で加筆したものです。
ttyp6:makoto@st4200  10:14:24/050219(...powerpc/All)> pkg_info | grep netatalk
netatalk-2.0.2      Netatalk appletalk file and print services
netatalk はいくつかの部品から構成されています。
構成部品 機能 備考
atalkd AppleTalk デーモン Native AppleTalk の場合には必須
afpd ファイルサーバ AppleTalk over TCP であれば、これだけ動かすのも可
papd プリントサーバ
timelord 時刻サーバ

pkg_info -D

make install や、pkg_add netatalk した時、 また設置後であれば、
% pkg_info -D netatalk
を使うと、いくつかの情報が表示されます。 そこに書いてあることですが、起動用の 手続は次のように用意します。
/etc/rc.d/atalkd (m=0755)
/etc/rc.d/afpd (m=0755)
/etc/rc.d/papd (m=0755)
/etc/rc.d/timelord (m=0755)
これらの見本が /usr/pkg/share/examples/rc.d にありますので、例えば、次のように します。
% foreach i (atalkd afpd papd timelord) sudo cp /usr/pkg/share/examples/rc.d/$i /etc/rc.d end
これらは、置いただけでは有効にならないので、 /etc/rc.conf に次のように書くと、本当に起動時に有効になります。
atalkd=YES
afpd=YES
papd=YES
timelord=YES
この中で atalkd は必須ですが、他は必要に応じて設定します。 また、それぞれの設定は次のところに行ないます。
/usr/pkg/etc/netatalk/AppleVolumes.default
/usr/pkg/etc/netatalk/AppleVolumes.system
/usr/pkg/etc/netatalk/afpd.conf
/usr/pkg/etc/netatalk/atalkd.conf  (初期値は実質、空。通常、自動的に設定される)
/usr/pkg/etc/netatalk/netatalk.conf
/usr/pkg/etc/netatalk/papd.conf
設定例は /usr/pkg/share/examples/netatalk にありますが、これを上のところに写して使います。 設置時にこれらが存在しない時には、設定例が写されます。

afpd

設定
譜名 機能(どういう時に読まれるか)
1/usr/pkg/etc/netatalk/AppleVolumes.system 常に有効
2/usr/pkg/etc/netatalk/AppleVolumes.default 利用者の設定がない時に有効
3~/AppleVolumes利用者の設定
4~/.AppleVolumes利用者の設定 (先頭にピリオドが付いている)
これらのうちいくつかは make install で既に置かれています。 これらの見本は /usr/pkg/share/examples/netatalk にあるので、 実物の方を変更しても、元の見本と比較が可能です。 ここの四つの設定の文法は全て同じです。

良く行なわれる例としては、共通なものは 1 に書いておき、追加の設定を 4 に書いてもらいます。 また、もし 4 がない人のために 2 を用意しておきます。 便利な設定としては、良く使う path を

path    name
の形式で書いておくことです。これで画面には name が表示され、それを選ぶと、 path への読書き等が利用出来るようになります。

一時的に起動

再起動する前に、一時的に試すには、次のようにします。
/etc/rc.d/atalkd onestart
または
sudo env atalkd=YES /etc/rc.d/atalkd start
これは通常、結構時間がかかります。 次のようになることもあります。
> sudo env atalkd=YES /etc/rc.d/atalkd start
Starting atalkd.
Setting AppleTalk info with nbprgstr.
nbp_rgstr: Can't assign requested address
Can't register harry:Workstation@*
この時でも atalkd は起動している場合も多いです。 その場合には、次のように afpd を起動できます。
> sudo env afpd=YES /etc/rc.d/afpd start
Starting afpd.
ttyp1:makoto@harry  19:47:03/050218(...net/netatalk)> !ps
ps ax | grep atalk
11739 ?     S    0:00.02 /usr/pkg/libexec/netatalk/atalkd 
28818 ?     S    0:00.03 /usr/pkg/libexec/netatalk/afpd 
ttyp1:makoto@harry  19:47:23/050218(...net/netatalk)> 

認証

UAM は User Authentication Method とか User Access Management の略かと思います。 netatalk では、まず、どの認証方法を使うかを、 afpd.conf の -uamlist に設定します。afpd は /usr/pkg/etc/netatalk/afpd.conf を読みます。 その中に、次のような部分があります。
#     -uamlist <a,b,c> Comma-separated list of UAMs. 
# (default:  uams_guest.so,uams_clrtxt.so,uams_dhx.so)
#   
#        some commonly available UAMs:
#        uams_guest.so: Allow guest logins
#
#        uams_clrtxt.so: (uams_pam.so or uams_passwd.so)
#                       Allow logins with passwords
#                       transmitted in the clear.
#
#        uams_randnum.so: Allow Random Number and Two-Way
#                        Random Number exchange for
#                        authentication.
#
#        uams_dhx.so: (uams_dhx_pam.so or uams_dhx_passwd.so)
#                     Allow Diffie-Hellman eXchange
#                     (DHX) for authentication.
ここに書いてあることを整理すると、次のようになります。
-uamlist の引数 機能
uams_dhx_passwd.so Diffie-Hellman eXchange (DHX) を使ったログイン
uams_dhx.so
uams_guest.so ゲストログイン
uams_passwd.so 平文パスワードによるログインを許可する (vipw で設定)
uams_clrtxt.so
uams_randnum.so 乱数と双方向乱数通信による認証 (/etc/netatalk/afppaswd に設定)
-uaamlist の引数に挙げてある名前を -uamlist の次に、カンマでつない 上記 (default: の行に示してあるように で記述します。 色を変えてある部分は初期設定で有効になっているものです。 これらの実体は、/usr/pkg/libexec/netatalk/uams にありますので、 次のようにして存在を確認出来ます。(2.0.1 と 2.0.3 で一部文字が変更になっているようです)。
ttyp0:makoto@s900 18:38:06/051124(~)> cd /usr/pkg/libexec/netatalk/uams ttyp0:makoto@s900 18:38:07/051124(...netatalk/uams)> ls -l *so lrwxr-xr-x 1 root wheel 14 Oct 20 03:08 uams_clrtxt.so@ -> uams_passwd.so lrwxr-xr-x 1 root wheel 18 Oct 20 03:08 uams_dhx.so@ -> uams_dhx_passwd.so -rwxr-xr-x 1 root wheel 9999 Oct 20 03:08 uams_dhx_passwd.so* -rwxr-xr-x 1 root wheel 8421 Oct 20 03:08 uams_guest.so* -rwxr-xr-x 1 root wheel 9622 Oct 20 03:08 uams_passwd.so* -rwxr-xr-x 1 root wheel 13875 Oct 20 03:08 uams_randnum.so* ttyp0:makoto@s900 18:38:10/051124(...netatalk/uams)>
この設定を /usr/pkg/etc/netatalk/afpd.conf にします。設置例では、 その中身は実質空になっていますが、そのままでも、次のような設定 が生きています。# が付いていますが、そのままでも別途有効になっているという意味です。 もし、これを変更する時には、最初の # を消して、必要な文字を 記述します。
# - -transall -uamlist uams_clrtxt.so,uams_dhx.so -nosavepassword
参考 http://www.linux.or.jp/JM/html/netatalk/man5/afpd.conf.5.html

password の設定は適切に行なっているはずなのに、 「パスワードが合っていない」と言われる時があります。 /var/log/messages を見れば書いてあるかも知れませんが、その ID に設定されている shell が /etc/shells に入っていない時にもそうなります。

動作確認

Mac OS X の場合、Finder の画面で command + k をすると、

..のような画面になります。

そこで、afp://server.example.com

のように入力します。

誤り

Database environment version mismatch
版を新しくした時に、
Nov 29 08:16:38 u afpd[16432]: cnid_open: dbenv->open of 
                      /home/username/hoge/.AppleDB failed: 
DB_VERSION_MISMATCH: Database environment version mismatch
というような字を見ることがあります。これは
% mv /home/username/hoge/.AppleDB /home/username/hoge/.AppleDB-old
のようにすれば、取敢えずは、回避出来るはずです。 あるいは、消してしまっても大丈夫だと思います。
fopen: No such file or directory
debug (standalong) モードで起動したり、起動直後に /var/log/messages に fopen: No such file or directory と出るのは
/usr/pkg/etc/netatalk/afp_ldap.conf
がないためかと思います。重要ではないのですが、重要ではないと判断するのに時間がかかる気がするので、 書いておきます。
modena@makoto 14:24:06/120417(..net/netatalk)% \
sudo ktrace -t n /usr/pkg/libexec/netatalk/afpd -d -P  /var/run/afpd.pid 

fopen: No such file or directory