[netatalk-ja:0375] Re: rsync -Eでもコピーされない._ファイルについて

HAT hat @ fa2.so-net.ne.jp
2014年 9月 13日 (土) 01:56:27 JST


HATです。

Netatalkによるサーバを管理しているのであれば、Netatalkがどのように
メタデータを保存しているかを理解しておかないと、色々とマズいです。
まず、「._」で始まるファイルが何かを理解してください。

-----------------------------------------------------------------------

「._」で始まるファイルはAppleDouble header fileといい、Appleが考案した
フォーマットのファイルです。
https://ja.wikipedia.org/wiki/AppleSingle

これはMac特有のメタデータを保存するためのものです。
Mac特有のメータデータには、
    FinderInfo    (32バイト固定)
    Resource Fork (巨大)
    拡張属性      (あまり大きくない)
などがあります。(ほかにもあるけど省略)

FinderInfoとResource Forkは大昔のMac OSからあり、現在のOS Xでは
com.apple.FinderInfoとcom.apple.ResourceForkという名前の拡張属性として
扱うことができますが、これらは本当の拡張属性ではありません。
見かけ上、拡張属性として扱いやすくしているだけです。

本物の拡張属性は最近のMac OS Xで追加されたものです。

OS Xの場合、HFS+上にファイルを作る場合は「._」で始まるファイルは作られ
ません。HFS+はMac特有のメタデータを保存できるので、あたりまえです。
しかしながら、それ以外のファイルシステムをOS X上にマウントした場合は、
Mac特有のメタデータの保存場所がないので「._」で始まるファイルを作って
そこに保存します。
例えば、OS XにFATフォーマットのUSBメモリを接続してファイルを保存すると
「._」で始まるファイルが作られます。
また、代替データストリームに対応しないように設定されたsambaに接続した場合も
「._」で始まるファイルが作られます。

Linux上のNetatalk 3.xの場合、FinderInfoと本物の拡張属性はサイズが
小さいので、Linux側の拡張属性に保存できます。
具体的には、FinderInfoはuser.org.netatalk.Metadataという名前の拡張属性
の中にAppleDoubleフォーマットで保存されます。
ABCという名前の本物の拡張属性はuser.ABCという名前の拡張属性にそのまんま
保存されます。
問題はResource Forkです。これはサイズが巨大なのでLinuxの拡張属性に保存
できません。そこでNetatalkは「._」で始まるファイルを作ってその中に保存
します。つまり、Linux上に「._」で始まるファイルがあった場合、Resource 
Forkが付いている証拠になります。
Netatalkはクライアント側に「._」で始まるファイルを*見せません*。
Resource Forkがあるように見せます。

-----------------------------------------------------------------------

現在のOS Xでファイルに「タグ」を付けると、
    FinderInfo内のcolor属性
    本物の拡張属性
の二ヶ所に保存されます。
FinderInfoのcolor属性は、古いMac OS Xの「ラベル」との互換性のために
あります。

OS Xでファイルにカスタムアイコンを付けると、これはリソースフォークに
保存されます。

従って、OS X上のファイルに「タグ」と「カスタムアイコン」を付けると、
FinderInfo、Resource Fork、本物の拡張属性の3つができます。
そういうファイルを作って動作確認してください。

Netatalkにオマケで付いてくるapple_dumpコマンドを使うと、AppleDoubleの
内容を確認することができます。

OS XがUSBメモリやsambaに保存したファイルをapple_dumpで確認してください。
そしてFinderInfo、Resource Fork、拡張属性がどのように保存されているか
をチェックしてください。

次にAFP経由でNetatalkが作ったファイルをapple_dumpで確認してください。
OS Xが直接USBメモリに作ったものとは微妙な違いがあります。

-----------------------------------------------------------------------

> そこで、とりあえずの案として次のように、Macmini(OS X10.8.5)からNetatalk
> ボリュームをafpマウントした状態で、
> 
> $ diff -r hoge(Netatalk上のフォルダ)  hoge(Macmini OS X10.8.5上のフォルダ)
> 
> とディレクトリの比較を行ってみました。
> 
> すると、「._fuga.png」といったような名前のリソースフォーク??が、
> なぜか、Netatalk上のフォルダ内にだけ存在しMacmini(OS X10.8.5)上の
> フォルダには存在していない、ということがdiff -rの結果としてでてきました。

ここが何かおかしいです。
たとえLinux上に「._fuga.png」というファイルがあったとしても、AFP経由で
Macからみた場合、そのファイルは隠蔽されて見えない筈です。
Mac上のdiff -rでそれが発見できたのは異常です。
本来ならば、その内容はFinderInfo、Resource Fork、拡張属性としてMac側に
見せる筈です。
MacのHFS+上に「._fuga.png」が存在しないのはアタリマエです。そんなファイルを
作る必要はありません。HFS+に保存できるのですから。

その「._fuga.png」に守秘義務がないのであれば、メールに添付して送ってください。
私が解析します。
守秘義務があるのであれば、apple_dumpコマンドを使って自力で解析し、どこに異常
があるか発見してください。

> fuga.pngの実態は、正常にMacmini(OS X10.8.5)上のフォルダに保存(バックアップ)
> されていて閲覧編集など問題無いのですが、
> この当方の環境で発生しているNetatalk上のフォルダ内にだけ「._fuga.png」
> が存在しているという状態は正しいのでしょうか?

私に想像では、そのファイルにはResource Fork付いており、「._fuga.png」が
存在するのは正常です。
しかしながら、Macから「._fuga.png」が見えるのは異常です。

> なんとなく、当方の浅はかな知識では、Macmini(OS X10.8.5)から
> CentOS+Netatalkのボリュームをafpマウントし、
> その状態でrsync -E すれば、「._」のようなOSX特有のファイル?拡張属性?
> などは全て漏れなく同期される、
> と理解していたのですが、それは違うのでしょうか?

はい。その筈です。

> また、仮に「._」の無いMacmini(OS X10.8.5)上のバックアップデータをそっくり
> そのまま、
> rsync -Eで新しいCentOS+Netatalkのボリュームなどへ同期したとします。
> 
> この場合、MacOSのクライアントPCから新しいCentOS+Netatalkへafp接続し、
> 正常なファイルとして扱うことはできるのでしょうか?

それができないとしたら、Netatalkの存在意義がないですよね。
NetatalkはMacのファイルサーバとして設計されているので、Macのファイルを
正常に扱えなかったとしたら、使い物になりません。
もしそうならば、Netatalkを捨てて別のファイルサーバを検討する必要があります。

-- 
HAT


netatalk-ja メーリングリストの案内