AFP Server

[華語, cmn-Hant-TW]

據說 Mac 連 AFP 還是比 SMB 順,所以就想架看看用起來的感覺如何,伺服器是 FreeBSD 8.2,要安裝的 ports 有

  • /usr/ports/net/netatalk
  • /usr/ports/net/avahi-app (選用)
  • /usr/ports/net/howl (選用)

avahi 跟 howl 挑一個來裝即可。又為了要用 LDAP 做為登入認證,在編 netatalk 時記得要打開 PAM 的選項,這樣在安裝的時候會自動在 /etc/pam.d/ 裡面產生一個叫 netatalk 的檔案,這個檔案的內容預設是引用 /etc/pam.d/system 的設定,以 LDAP 來講,只要之前在 system 檔裡面有設定好 pam_ldap 的話,什麼都不用改就直接可以用了,接著就是要設一堆的設定檔

/etc/rc.conf
netatalk_enable="YES"
afpd_enable="YES"
cnid_metad_enable="YES"
 
# avahi 用這個
avahi_daemon_enable="YES" 
 
# howl 用這個
mdnsresponder_enable="YES"
mdnsresponder_flags="-f /usr/local/etc/mDNSResponder.conf"

個人的習慣是把這些設定值通通丟到 /etc/rc.conf.local 裡就是。

/usr/local/etc/avahi/services/afp.services (avahi)
<?xml version="1.0" standalone='no'?><!--*-nxml-*-->
<!DOCTYPE service-group SYSTEM "avahi-service.dtd">
<service-group>
 
<name replace-wildcards="yes">%h</name>
 
<service>
<type>_afpovertcp._tcp</type>
<port>548</port>
</service>
 
<service>
<type>_device-info._tcp</type><port>0</port>
<txt-record>model=Xserve</txt-record>
</service>
 
</service-group>

afp.services 檔名可以自訂,只要內容長得一樣即可。
其中 %h 是 server name,是顯示在用戶端 Finder 上的機器名稱,然後 model 則是決定顯示的圖形,詳情後述。

/usr/local/etc/mDNSResponder.conf (howl)
"ServerName" _device-info._tcp local. 1 "TXTVersion=1.0" "model=Xserve"
"ServerName" _afpovertcp._tcp  local. 548

這個檔案似乎安裝的時候不會自動產生,要自行建立。其中 ServerName 是用戶端的 Finder 看到的顯示名稱,model 後面的 Xserve 是指定顯示圖形,詳請看下一段。

Model Name

不管是 avahi 或是 howl 都可以丟 device-info,在 Finder 上會根據 device-info 決定顯示的圖形。像是指定成 Macmini 的話就會顯示成 Mac Mini 的樣子,很有趣。在用戶端 (Mac OS X) 上的 /System/Library/CoreServices/CoreTypes.bundle/Contents/Info.plist 檔案裡可挖出所有可用的值,常見的有:

  • Xserve
  • PowerBook
  • PowerMac
  • Macmini
  • iMac
  • MacBook
  • MacBookPro
  • MacBookAir
  • MacPro
  • AppleTV1,1
  • AirPort
  • iPhone
/usr/local/etc/netatalk.conf
ATALK_MAC_CHARSET='UTF8-MAC'
ATALK_UNIX_CHARSET='UTF8'

把他通通設成 UTF8 比較不會有問題,有需要用別的編碼就自己改即可。

/usr/local/etc/AppleVolumes.default
~
/share             "Share"    allow:whsyu,grass

檔案裡面的說明很詳細,大致上就是 “目錄名 – 顯示名稱 – 選項” 這樣的格式,要分享幾個目錄就寫幾行,以這個例子來看,就是各人的家目錄,以及只分享給 whsyu 跟 grass 的 /share 目錄,在 Finder 上會顯示成 Share 資料夾,要注意的是這邊的 allow 只是給不給看的設定而已,權限還是會跟系統走,如果該使用者在系統上本來就沒有存取該目錄的權限,那就算他看得到那個分享出來的目錄也是沒有用的。

手動執行

/usr/local/etc/rc.d/netatalk start
/usr/local/etc/rc.d/avahi-daemon start (avahi用這個)
/usr/local/etc/rc.d/mdnsresponder start (howl用這個)

通通設定完之後,要直接用的話就手動去打開服務即可,然後就可以去用戶端玩看看了。

特別注意:ZFS 目錄

分享 zfs 的目錄有可能會吃到「無法完成此項操作,因為找不到〇〇〇〇的原項目。」這樣的錯誤訊息,在用戶端的 Console 會看到這樣:

NetworkNode::handleMountCallBack returned 2
NetworkNode::handleMountCallBack returned -50

通常來講,netatalk 會把設定檔裡面權限不足或是名字打錯的目錄過濾掉,並不會分享給用戶端,因此用戶端看得到理論上應該是一定會找得到。那這個錯誤是怎麼產生的呢? zfs 的 volume 用 set mountpoint 直接指定掛載點時,zfs 建立的目錄是只有 root 有存取權限,但是隨後掛載上去的就會蓋掉了原先的權限,於是一般使用者在本機上也就能存取了。netatalk (現在版本 2.1.5) 不知為何會被卡在這邊,不過解決方法也不難,就先暫時改掉 mountpoint,把目錄改成 755 之類的權限後再把 mountpoint 改回去即可。

參考資料

http://linuxnet.ch/groups/linuxnet/wiki/f8a83/FreeBSD_Setup_Netatalk_Server_for_OSX_with_Bonjour.html

http://thomas.pelletier.im/2010/01/time-machine-freebsd-and-afp-are-on-a-little-boat/

UPDATE 2013-07-07:
  • netatalk 預設是用 avahi,如果要用 howl 要先把 ZEROCONF 選項取消掉
  • avahi-daemon 需要 dbus,要用 avahi 的話 dbus 要先跑起來

2 thoughts on “AFP Server

  1. gugod

    感謝您整理得很好,不過 mDNSResponder.conf 設定出現兩次,好像是筆誤,看起來第二個應該是指 AppleVolumes.default。

Leave a Reply

Your email address will not be published. Required fields are marked *