NetatalkとSambaの共存[追記あり]

2014年7月16日Mac,NAS,netatalk,パソコン・インターネット

(追記 2014-07-10 22:04 前提条件を書くのを忘れました。サーバは、FreeBSD 10.0を使っており、Netatalk 3.1.2を使っています。ファイルシステムはZFSです。)

(追記 2014-07-10 22:04 記事の参照元を書くのを忘れました。次のウェブページを参考にしています。

)

FreeBSDをNASとして使っています。SMBサーバとしても使える様に、sambaをインストールしたのですが、その設定方法はあまり賢いやり方ではない様です。と言うか、勘違いしていました。

HATさんからご連絡をいただきました。

次のページに、「やらないほうがいいこと」として「OS Xから同じ場所にsamba経由とnetatalk経由で接続するな」と書かれています。

私は「AFPとSMBで使うディスクは完全に分けた方が良い」と勘違いしてしまいました。

実は、この真意は、OS Xから、AFPとSMBの両方が動いているサーバの"/export/disk"と言うディレクトリに接続する時に、ある時はAFP、ある時はSMBと言う様に、切り替えて使うなと言う事です。OS Xから"/export/disk"につなぐ時は、必ずAFPでつなぐ様にします。SMB以外のプロトコル、WebDAVやNFSなどでつなぐ事もしない方が懸命です。

Windowsから"/export/disk"につなぐ時は、当然SMBを使います。

afp.confとsmb.confが次の様になっているとします。

まずは、afp.confです。

;
; Netatalk 3.x configuration file
;

[Global]
    mac charset = MAC_JAPANESE
    afpstats = yes
    log file = /var/log/netatalk.log
    vol dbpath = /export/netatalk/CNID
    vol preset = my_default_values

[my_default_values]
    file perm = 0660
    directory perm = 0770

[Homes]
    basedir regex = /usr/home

[disk]
    path = /export/disk

(追記 2014-07-16 23:12 vol presetを追加しました)

次は、smb.confです。

#======================= Global Settings =====================================
[global]
   workgroup = WORKGROUP
   security = user
   load printers = no
   printing = bsd
   guest account = nobody
   map to guest = Bad User
   max log size = 50
   unix charset = UTF-8
   dos charset = CP932

#============================ Share Definitions ==============================
[homes]
   comment = Home Directories
   browseable = no
   writable = yes
   public = no
   printable = no
   veto files = /.DS_Store/Network Trash Folder/TheFindByContentFolder/TheVolumeSettingsFolder/Temporary Items/.TemporaryItems/.VolumeIcon.icns/Icon?/.FBCIndex/.FBCLockFolder/
   delete veto files = Yes

[disk]
   comment = Public Stuff
   path = /export/disk
   writable = yes
   public = no
   printable = no
   veto files = /.DS_Store/Network Trash Folder/TheFindByContentFolder/TheVolumeSettingsFolder/Temporary Items/.TemporaryItems/.VolumeIcon.icns/Icon?/.FBCIndex/.FBCLockFolder/
   delete veto files = Yes

図を描いてみました。

AFPとSMBの切り替えはしない方がよい

AFPで/export/diskにつなぐと、メタデータ部分は拡張属性として保存されます。次の図では、"A.png"と言うファイルをコピーしており、"A.png"のメタデータが、EA(拡張属性)として保存されます。

AFP経由でA.pngをコピー

% ls -l@ A.png
-rw-r--r--@ 1 oichi   wheel  181287  7  8 22:10 A.png
        com.apple.FinderInfo    32
        com.apple.metadata:kMDItemScreenCaptureType    51
        com.apple.metadata:kMDItemIsScreenCapture    42

一方、SMBで/export/diskにつなぐとメタデータ部分が「._」で始まるファイルに保存されます。つまり、"B.png"のメタデータが、"._B.png"と言うファイルに保存されるのです。

SMB経由でB.pngをコピー

% ls -l@ B.png
-rw-r--r--@ 1 oichi   wheel  1851757  8 22:12 B.png
        com.apple.FinderInfo    32
        com.apple.metadata:kMDItemScreenCaptureType    51
        com.apple.metadata:kMDItemIsScreenCapture    42

一見、問題ない様に思えますが、SMBで接続している状態で"A.png"を調べてみると…。

SMBでA.pngにアクセスすると

% ls -l@ A.png
-rw-r--r--  1 oichi   wheel  181287  7  8 22:10 A.png

“A.png"のメタデータが見えなくなってしまいました。

(追記 2014-07-10 22:04 Netatalk 3.1.2のバグだそうです。)

今度は逆に、AFPで接続し直して、"B.png"を調べてみると…。

AFPでB.pngにアクセスすると

% ls -l@ B.png
-rw-r--r--  1 oichi   wheel  1851757  8 22:12 B.png

“B.png"のメタデータが見えなくなってしまいました。

この様な困った状態になるので、AFPとSMBを切り替えて、同じサーバの同じディスクにつないではいけないと言う事です。

この場合、netatalkのdbdコマンドで、"-c"オプションを付けると"convert from adouble:v2 to adouble:ea"をすると書かれているのでメタデータの形式が変換されると思ったのですが、この機能とは違う様です。

# dbd -vc /export/disk | egrep png
CNID from .AppleDouble file for '/export/disk/A.png': 663
Jul 09 23:37:33.191311 dbd[94507] {cnid_dbd.c:572} (D5:CNID): cnid_dbd_add: CNID: 273, name: 'A.png', dev: 0x247a1500, inode: 0x16c0, type: file
Bad AppleDouble "/export/disk/._B.png"
File without meta EA: "/export/disk/B.png"
Jul 09 23:37:33.192787 dbd[94507] {cnid_dbd.c:572} (D5:CNID): cnid_dbd_add: CNID: 273, name: 'B.png', dev: 0x247a1500, inode: 0x16c5, type: file

エラーになってしまいます。

(追記 2014-07-10 22:04 Netatalk 3.1.2のバグだそうです。)

ちなみに、Mavericks同士では、ファイル共有にSMB2を使っているそうです。HATさんが、色々調べて下さっています。

その実装方法は、次の通りだそうです。

その結果、メタデータは、次の様に保存されるとの事です。

(追記 2014-07-11 00:02)

ご指摘を受けましたので、追加記事を掲載しました。併せてご覧ください。

Posted by お市のかた