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

HAT hat @ fa2.so-net.ne.jp
2014年 9月 29日 (月) 23:49:46 JST


HATです。
Fedora 21 alphaでのnetatalk 3.1.6の問題を発見して、こっちを優先しています。
申し訳ないですが、rsync -E問題に関しては雑なテストしかしていません。

Mon, 29 Sep 2014 15:54:07 +0900, Taiki Kimura <taikimura8182 @ gmail.com>:
> HATさん
> 
> おつかれさまです 木村です。
> 
>> 別の作業をしてるので追試験してないのですが、私の勘では、
>> com.apple.FinderInfoアリ、com.apple.ResourceForkナシのファイルであれば、
>> FinderInfoがうまくコピーされないですかね?
> 
> 
> 当方が試したことがHATさんが推察されていることと一致しているのか確証ないのですが、
> 以下に記したような状況でテストしてみたところ、FinderInfoがうまくコピーされました。
> 
> 
> ◆Marvericsで作成したファイルからcom.apple.ResourceForkを削除
> $ ls -ltra@ test_a
> -rw-r--r--@  1 kimura  staff  11  9 29 14:51 test_a
> com.apple.FinderInfo       32
> com.apple.ResourceFork     1338
> com.apple.TextEncoding       15
> 
> $ xattr -d com.apple.ResourceFork test_a
> 
> $ ls -ltra@ test_a
> -rw-r--r--@ 1 kimura  staff  11  9 29 14:52 test_a
> com.apple.FinderInfo 32
> com.apple.TextEncoding 15
> 
> ◆com.apple.ResourceForkを削除したファイルを次の流れでコピー
> 
> ・Marverics → Netatalk3.0.4(拡張属性無効):finderからコピー
> ・Netatalk3.0.4(拡張属性無効) →
> Macmini:MacminiからNetatalk3.0.4(拡張属性無効)をafpマウントしてrsync -Eでコピー
> ・Macmini → Netatalk3.1.6(拡張属性有効):MacminiからNetatalk3.1.6(拡張属性有効)をafpマウントしてrsync
> -Eでコピー
> 
> 
> ◆MacminiからNetatalk3.1.6(拡張属性有効)をafpマウントしls -ltra@した結果
> $ ls -ltra@ test_a
> -rwxrwxrwx@ 1 aid-dcc  staff  11 Sep 29 14:52 test_a
> com.apple.FinderInfo 32
> com.apple.TextEncoding 15
> 
> ※com.apple.FinderInfoがコピーされています。
> 
> 
> という結果となりました。
> 
> が、やはり、本日も数回試しましたが、
> Marvericsで作成したファイルからcom.apple.ResourceForkを削除せず、
> そのままの状態(com.apple.FinderInfoあり、com.apple.ResourceForkあり、com.apple.TextEncodingあり)で
> Macminiを経由させてrsync -EでNetatalk3.1.6(拡張属性有効)にコピーすると、
> com.apple.FinderInfoが無いファイルとしてコピーされます。
> 
> 
> 試したのはtxtファイルだけなのですが、
> com.apple.FinderInfoが無くても、ファイル自体は編集したり閲覧したりすることは可能なようです。
> 
> 
> これは、どういった状態なのでしょうか。どのように判断したらよいのでしょうか。。。

私の勘が当たっているような気がします。
私の実験では以下のように表示されていました。
$ /usr/bin/rsync -avE -8 --cache --delete /Users/hat/Desktop/rsync_test/ /Volumes/hat/test
building file list ... done
./
._.DS_Store
ICONandEA.txt
._ICONandEA.txt

これは、OS X上のHFS+からAFP経由でNetatalkに転送する実験です。
ここで、「._ICONandEA.txt」が表示されているのが気持ち悪いと思いませんか?
HFS+上には「._」で始まるファイル名は存在しないのに「._ICONandEA.txt」を
転送するのは、何かおかしいです。

AFPプロトコルには、
・FinderInfoを転送する機能
・ResourceForkを転送する機能
・本物の拡張属性を転送する機能
があります。まあ、アタリマエの機能ですね。
だからこそ、Finderで転送した場合は、これらの機能が実行されて、正常に
転送できていると思われます。

ここで、私の仮定です。
rsync -Eをしたとき、FinderInfo、ResourceFork、本物の拡張属性を転送する
機能を使っていないのではないでしょうか。
OS XのUnix系コマンドは、Mac特有のメタデータをマトモに扱えないのでは?
これらが存在した場合、「._」で始まるファイル名に変換して転送し、
受取側のサーバが、「._」で始まるファイルの中身をFinderInfo、ResourceFork、
本物の拡張属性に戻すことを期待しているのではないでしょうか。

この仮定をもとにした実験。

----------------------------------------------------------------------
実験1: FinderInfoもResourceForkも本物の拡張属性もないファイルを転送
$ /usr/bin/rsync -avE -8 --cache --delete /Users/hat/Desktop/rsync_test/ /Volumes/hat/test
building file list ... done
./
.DS_Store
._.DS_Store
ICONandEA.txt

どれも付いてないファイルを転送する場合は、「._ICONandEA.txt」を転送して
いません。
メタデータがないから、そういうファイルを転送する必要がない。
メタデータがないから、何も問題は発生しない。

----------------------------------------------------------------------
実験2: FinderInfoアリ、ResourceForkナシ、本物の拡張属性ナシを転送
$ /usr/bin/rsync -avE -8 --cache --delete /Users/hat/Desktop/rsync_test/ /Volumes/hat/test
building file list ... done
./
.DS_Store
._.DS_Store
ICONandEA.txt
._ICONandEA.txt

FinderInfoがあるので、「._ICONandEA.txt」を転送している。
FinderInfoは壊れていない。

----------------------------------------------------------------------
実験3: FinderInfoナシ、ResourceForkアリ、本物の拡張属性ナシを転送
$ /usr/bin/rsync -avE -8 --cache --delete /Users/hat/Desktop/rsync_test/ /Volumes/hat/test
building file list ... done
./
.DS_Store
._.DS_Store
ICONandEA.txt
._ICONandEA.txt

ResourceForkがあるので、「._ICONandEA.txt」を転送している。
FinderInfoが最初からないので、問題は発生しない。

----------------------------------------------------------------------
実験4: FinderInfoアリ、ResourceForkナシ、本物の拡張属性アリを転送
$ /usr/bin/rsync -avE -8 --cache --delete /Users/hat/Desktop/rsync_test/ /Volumes/hat/test
building file list ... done
./
.DS_Store
._.DS_Store
ICONandEA.txt
._ICONandEA.txt

FinderInfoと本物の拡張属性があるので、「._ICONandEA.txt」を転送している。
FinderInfoは壊れていない。

----------------------------------------------------------------------
実験5: FinderInfoアリ、ResourceForkアリ、本物の拡張属性ナシを転送
$ /usr/bin/rsync -avE -8 --cache --delete /Users/hat/Desktop/rsync_test/ /Volumes/hat/test
building file list ... done
./
.DS_Store
._.DS_Store
ICONandEA.txt
._ICONandEA.txt

FinderInfoとResourceForkがあるので、「._ICONandEA.txt」を転送している。
FinderInfoが壊れた!!!!!!!

----------------------------------------------------------------------
以上の実験により、FinderInfoが壊れる条件は、
FinderInfoとResourceForkの両方が付いているとき、
だけです。

rsync -Eはファイルに何らかのメタデータが付いているとき「._」で
始まるファイルを転送します。
一方、拡張属性が有効なNetatalk 3.xは、ファイルにResource Forkが
付いている場合のみ「._」で始まるファイル名を作ります。
OX Xのrsync -Eが送ってくる「._」と、Netatalkが自分で作る「._」が
コンフリクトした結果、FinderInfoが壊れるのではないでしょうか。

すなわち、Netatalk 3.xの「仕様」に問題がある。
「仕様上のバグ」っていうんですかねぇ。

この仮説を立証するには、AFPのパケットをダンプする必要がありますが、
この作業はチョーめんどくさいので、今日はパスします。

> →拡張属性を有効にしたNetatalk3.1.6に正式に移行するにあたり、Macminiに保存されているバックアップデータを
>  rsync -Eでコピーしていってもよい状態なのでしょうか???

いまのところ、現状のまま運用すべきですね。
もし「仕様上のバグ」であるならば、仕様変更しなければ解決しません。
仕様変更はかなりの作業量だと思うし、そもそも変更可能なのか???

-- 
HAT


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