Netatalkでファイルサーバー

1998.12.4 発表
2000.5.26 改訂

はじめに

 このページは私がTurbo Linux上で実際にNetatalkを動かした経験に基づき、これからNetatalkを動かそうとする人にとって為になるであろう情報をまとめたものです。すでにJFLinux Netatalk-HOWTOが翻訳されていますから、そちらと重複する部分はなるべく避けるようにしています。


インストールなど

 Turbo Linuxでは、NetatalkがRPM化されていますので、Turbo LinuxをインストールすればNetatalkはインストールされます。カスタムインストールした場合には組み込まれない場合もありますが、付属CD-ROMからRPMを取ってきてインストールしてしまえばOKです。とても簡単です。

 どちらかと言うと、Turbo Linuxそのもののインストールで苦労する事の方が多いと思います。そうは言っても今のインストーラーは優秀ですから、にっちもさっちも行かなくなることはまずないと思いますが、PnPには気を付けましょう(特にISAのPnP対応ネットワークインタフェースカードは曲者のようです)。私の場合、ISAのカードは使っていなかったので特に問題はなかったのですが、インストーラーが何故かEISAのWD8013 Ethernetカード用にWD-7000 SCSIカード用モジュールを割り当ててしまったので、全くネットワークに繋がらず、原因が判るまで苦労しました(該当しそうなHOWTO文書を読みまくって解決出来ました。お陰でいい勉強になりましたf(^^; )。安全を期すなら、インストールする前にTurbo Linuxのサポート情報を見て自分がインストールするマシンに障害が報告されていないかどうか確認しておくことと、本体カバーを明けてマシンに使われているチップやカードを把握しておくと良いでしょう。ちなみに、私のマシン構成は以下のようなものです(あんまりなさそうな構成です)。

本体:DELL OmniPlex 590
CPU:Pentium 90 MHz
HDD:内蔵SCSI 1GB、外部UW-SCSI 9GB
RAM:63MB!(元々の16MBにMacintosh用の余っていた16MB SIMM x 2と8MB SIMM x 2を追加)
その他:オンボードビデオ(ATI 68800AX、VRAM 2MB)、PS/2マウス(2ボタン)&キーボード
CRT:三菱 RD 15M
NIC:EISA WD8013
SCSI:
オンボード NCR53C810(現在は使用していません)
PCI SC-PCI(I/O DATA、チップはNCR53C815) ← DATが繋がっています
PCI SC-UWPCI(I/O DATA、チップはNCR53C875) ←HDDが両方繋がっています

設定作業など

通信出来なきゃ始まらない

 まず、TCP/IPの設定をしましょう。TCP/IPがきちんと設定されていれば、LILOから「Linux 3」で起動すればNetatalkが動きます。起動時のメッセージを読むか、起動後に ps aux | grep afpd 等のコマンドで確認してみましょう。Turbo Linuxのインストール時に正しく質問に答えていればTCP/IPで通信できるようになっているでしょう。不幸にして通信できない時(私のように(^_^;;)は、以下の事を疑ってみましょう。

NICに注意

 TCP/IPで通信できるようになったら一安心ですが、NICによってはmulticastをうまく扱えないのがありますので注意が必要です。Intelのチップを使ったものが動かないのは有名ですね。/sbin/lsmod でNICがどんなモジュールを使っているのか確認してみて下さい。私が知っている範囲では、eepro100 と via-rhine は要注意! 以下、対策です。

eepro100
 /etc/conf.modules に「options eepro100 multicast_filter_limit=3」を付け加えます。編集後、忘れずに initrd を作り直し、/sbin/lilo を実行して設定を反映させて下さい。
 これで直らない場合はeepro100ドライバが古いのではないでしょうか? http://cesdis.gsfc.nasa.gov/linux/drivers/eepro100.htmlからv1.02以降のものを入手して下さい。
via-rhine
 TurboLinux Users Mailing Listの情報(users:00323)によれば、Laneed (エレコム) LD-10/100ALなんかが該当するようです。root になって ifconfig eth0 allmulti (eth0の部分はお使いの環境に合わせて下さい)を実行して下さい。

いよいよデーモンのお出まし

 ネットワークの設定が終わったら、Xログイン(linux 5)でも起動時に Netatalk が立ち上がるようにします。kterm 上で tksysv を実行し、Run Level 5 にatalk.initを追加してください。番号は91がいいみたいです(/etc/rc.d/rc3.d/ では91になっていますから)。

 次にNetatalk自体の設定です。家庭内LANだったら特に何もしなくても済みますが、企業や学校で使う場合にはパラメータをいじる必要が出てくるかもしれません。大抵の場合、いじる必要がある設定ファイルは /etc/rc.d/init.d/atalk.init の afpd に渡す引き数だけです。/etc/atalk.conf の方は、Ether Talk Phase 1を使っているとか、2枚のEthernet Cardを挿してAppleTalk Gatewayにしたいとか、特殊な目的の場合にのみいじる必要がありますが、そうでなければ最後の行に「eth0」とだけ書いてさえいれば自動で設定してくれます。afpd に渡す引き数を以下に示します。

-c 最大同時接続ユーザー数
 デフォルトでは5ユーザーになっています。企業や学校で使う場合は足りないでしょから、適宜増やしてください。但し増やした分メモリを消費します。64MB以上積んでいるマシンなら問題ないでしょうが....
-n @"ゾーン名"
 EtherTalk Phase 2を使っていて、Ethernetにゾーンが複数ある場合、この引き数でLinuxの所属するゾーンを決めることが出来ます。デフォルトでは最初に見つけたゾーンになります。
-n "マシン名"
 セレクタに現われるマシン名をホスト名と別の名前にしたい場合に設定します。デフォルトではホスト名と同じです。
-K -A
 Kerberos暗号化をサポートさせなくします。Kerberos暗号は合衆国/カナダ以外への輸出には米国政府の許可を必要としますので、日本ではまず使えないでしょう。Turbo Linuxでは最初からこのパラメータが付いている筈なので、消さないようにしてください(消してもほとんど実害はないように思いますが...)。

 設定が終わったら、再起動(デーモンを殺してもう一度呼び出しただけではNetatalkは起動しません! これはAppleTalkサポートがモジュールではなく、カーネル内に組み込まれているからです。これば嫌な人は、カーネルを再構築してAppleTalkサポートをモジュールに追い出してください)して、Netatalkの起動を確認(LANの規模にもよりますが、結構な時間が掛かります!)した後、Macintoshでセレクタを覗いてみましょう。AppleShareでちゃんと認識できましたか?

ちょっとしたノウハウ

 ここは主としてNetatalk Admins Mailing Listから仕入れた情報です。

quotaを有効にしたい
 netatalkは特にいじらなくてもquotaに対応するようです。筆者はまだ試したことがありませんが、quotaを普通に設定するだけでOKです。
ファイル/フォルダのパーミッション
 netatalkは、上位ディレクトリのパーミッションを引き継ぎます。
今誰が接続してるの?
 nuというperlスクリプトがあります。http://thehamptons.com/anders/netatalk/nu.htmlからダウンロード出来ます。以下のような改良版がMailing List紹介されています。
#!/usr/bin/perl

# nu - by Anders Brownworth   anders@thehamptons.com
#      modified by Ambrose Li 
#      modified by Ove Ruben R Olsen 
#
# shows netatalk users logged on and their remote address
# this assumes the netstat -p and ps uax of linux usage
#
# usage: nu

open (NS, "/bin/netstat -p 2>&1|");
while () {
  last if (/^Active UNIX domain/);
  ($junk, $remote, $morejunk, $pid) = unpack("A44 A23 A13 A10", $_);

  if ( ($junk =‾ /afpovertcp/) && ($morejunk != /ESTABLISHED/) ) {
    ($pid) = split(/¥//,$pid,2);
    $PID{$pid} = $remote;
  }
}
close(NS);

print pack("A10 A6 A24 A20 A20", "USER", "SINCE", "FROM", "NAME"), "¥n";

open(USERS, "/bin/ps -uax|") ;

while () {
  ($uid, $pid, $junk, $since) = unpack("A8 A6 a36 A5", $_);

  $pid =‾ tr/ //d;
  if ($PID{$pid} ne "") {
    ($name,$office) = split(/,/,(getpwnam($uid))[6], 3);
    print pack("A10 A6 A24 A40", $uid, $since, $PID{$pid},  $name,$office), "¥n";
  }
}
 またnetatalk-admins Mailing Listでは以下のようなスクリプトも紹介されました。
#!/bin/bash
# written by Thomas Riewe
echo
echo "                          NetATalk"
echo "                          --------"
ps axuw|grep atalkd|grep root|grep -v grep|sort|cut -c 1-15,42-51,59,70-160
ps axuw|grep afp|grep root|grep -v grep|sort|cut -c 1-15,42-51,59,70-160
ps axuw|grep papd|grep root|grep -v grep|sort|cut -c 1-15,42-51,59,70-160
echo "                "
echo "Clients    PID Sta. Start Binary"
echo "---------------------------------------------------------------------"
ps axuw|grep afp|grep -v root|sort|cut -c 1-15,42-51,59,70-160
echo
 あるいは
#!/bin/sh
# Must be run as superuser.
#
# set up the raw work files
#
# afpstat
# written by Jim Hart
#
ps aux |
  grep afpd |
  grep -v grep |
  awk '$1 != "root" {print $2, $1}' |
  sort -k 1 > /tmp/afpstat1
grep 'afpd¥[' /var/log/messages |
 awk '{match($5,/¥[.*¥]/);print substr($5,RSTART + 1, RLENGTH - 2), $0}' |
 sort -k 1 > /tmp/afpstat2
# now, join the results together by process id
join /tmp/afpstat1 /tmp/afpstat2|
 awk '
BEGIN{ OFS = "¥t"
    printf "%-9s%-16s%-16s%-13s%8s%8s¥n", "username", "loginDT", "IPAddr", "ATAddr", "userID", "groupID"
    printf "%-9s%-16s%-16s%-13s%8s%8s¥n", "--------", "-------", "------", "------", "------", "-------"
}
procid != $1 {
  if( procid != "" ) {
    printf "%-9s%-16s%-16s%-13s%8d%8d¥n",username, loginDT, IPAddr, ATAddr, userID, groupID
  }
}
/session.*from/ {
  username = $2
  loginDT = $3 " " $4 " " $5
  if( $8 == "ASIP") {
    IPAddr = substr($11,1,index($11,":") - 1)
    ATAddr = "-"
  } else {
    ATAddr = $10
    IPAddr = "-"
  }
  procid = $1
}
$8 == "login" {
  userID = substr($11,1,length($11) - 1)
  groupID = substr($13,1,length($13) - 1)
  procid = $1
}
END {
    printf "%-9s%-16s%-16s%-13s%8d%8d¥n",username, loginDT, IPAddr, ATAddr, userID, groupID
}'
# get rid of the work files
rm /tmp/afpstat*

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: PGPfreeware 5.0 for non-commercial use 

mQBvAzOe/64AAAEDAM2s9O/EPXKlnvPOnJDH0f1KWg0iIM4i5tT7aywHcbW2Acgr
b7aaTMe0eEMu+aSDjAto9+nYSHGOG/8ni/V7aW60W2zF1AQ8dPcyLZ9l1FaoWcr2
CP8uL2bZNGZvghpEdQARAQABtCBKaW0gSGFydCA8amhhcnRAbWFpbC5hdmNuZXQu
b3JnPg==
=ymPR
-----END PGP PUBLIC KEY BLOCK-----
 これは接続しているマシンのアドレス(AppleTalk又はIP)も出力してくれますが、root権限が必要です。最新版は、http://www.avcnet.org/users/jhart/programs/afpstat.txthttp://www.avcnet.org/users/jhart/programs/afpstatm.txtをご覧下さい。afpstatmは、ユーザーID、グループIDの代わりにマシン名を表示してくれます。またJt "The Squeegy" Chiodi氏によるperl版がhttp://squeegy.org/programs/afpstatm.plxにあります。
 さらに
#!/usr/local/bin/perl
# written by Tom Fitzgerald

use Socket;

%ip = ();               # indexed by pid: IP address of client
%user = ();             # and user logged in on that client

open (LOG, "/var/log/syslog") || die "Can't open syslog: $!";
while () {
    next unless / afpd¥[.*( login | logout | session| server_child)/;
    @a = split (' ');
    ($pid = $a[4]) =‾ s/^afpd¥[(.*)¥]:$/$1/;
    if ($a[6] =‾ /^session:/) {
        ($ip = $a[8]) =‾ s/:.*//;
        $ip {$pid} = $ip;
    } elsif ($a[5] eq "login") {
        $user {$pid} = $a[6];
    } elsif ($a[5] eq "logout") {
        delete $ip {$pid};
        delete $user {$pid};
    } elsif ($a[5] =‾ /^server_child/) {
        $pid = $a[6];
        delete $ip {$pid};
        delete $user {$pid};
    }
}
close LOG;

open (PS, "ps -ae -o user,group,pid,rss,stime,time,fname|")
   || die "Can't fork ps: $!";

$_ = ;
chop;
printf "%-57s %s¥n", $_, "HOST";
while () {
    next if /^    root / || !/afpd$/;
    chop;
    @a = split(' ');
    $pid = $a[2];
    $packip = pack ('C4', split (/¥./, $ip{$pid}));
    ($name, $rest) = gethostbyaddr ($packip, AF_INET);
    printf "%-57s %s¥n", $_, $name;
}
close PS;
 こちらもroot権限が必要です。
ファイル/フォルダを消そうとすると-50エラーが出る
 ファイル/フォルダを消すユーザ権限はあっても.AppleDouble等のファイル/フォルダを消すユーザー権限がないとこうなります。シェルで作業(chmod 777 -R .AppleDouble 等)してからファイル/フォルダを消して下さい。
NISに対応させたい
 残念ながら設定では駄目で、コンパイル時に細工をする必要があります。sys/linux/Makefile の ADDLIBS=... (多分、-lcrypt なんかが指定されている)に -lnss_nis を追加してからコンパイル/インストールします。
ファイルサーバーを落としたいので接続しているユーザーにメッセージを送る
 kill -SIGHUP (afpdのPID) とやれば「サーバーは5分後に停止します」という旨のメッセージが接続しているユーザーに送られます。afpdはきっかり5分後に停止します。メンテナンスをしたい時に便利では?

SAMBAと同時に使う

 SAMBAと同時に使いたい、という方は少なからずいると思います。ここではNetatalkと一緒に使うためのsmb.confファイルで設定するためのパラメータを列挙します。Sambaは1.9.18p5以降を想定しています。

coding system = cap
2バイト文字をどう扱うかを決めます。capにしないと(例えばeucなどにすると)漢字を使ったファイルにはアクセスできなくなります。
hide dot files = yes
「.」で始まるファイル名を表示させないようにします。
veto files = /.AppleDouble/.bin/.AppleDesktop/Network Trash Flder/ICON?/
Netatalkが作る特殊なフォルダ/ファイル名を表示させないようにします。hide dot files = yesにしているので最初の3つは指定しなくても構いませんが、Network Trash Folderだけはきちんと指定して下さい。
delete veto files = yes
フォルダを削除する際に不可視ファイル/フォルダを一緒に削除するようにします。

 Windows 95/98だけのネットワークでしたら暗号化パスワードに気を付ければSAMBAは動いてくれると思いますが、NTがドメインマスターをしているような場合は以下のように設定した方が良いでしょう。

 ここで注意! SambaとNetatalkはお互い相手がどのファイルを使っているのかを知る術を持ちませんので、アクセスが競合した場合はファイルが壊れてしまうこともあり得ます。運用には十分注意して下さい。Samba2.0ではこの辺が改良されて来ると期待していましたが、--with-netatalkオプションをつけてビルドしてもnetatalk.cはコンパイルされませんね。netatalk.c自体も、ファイル/フォルダの削除や移動の際にリソースフォークを一緒に操作する程度のものでしかなさそうなので、ちょっとがっかりです。



改訂履歴

2000.3.21

2000.3.25

2000.5.26

2000.6.3


COPYRIGHT 1998-2000 のむさん, All Rights Reserved.
←Mac Pathfinderホーム