2006年09月06日

2006年09月06日

 リンクとか備忘録とか日記とかさん経由、Mac Backup Software Harmful。実は少し前に "rsync hfs" で検索してこのページにたどりついていた。要は、Mac 用のバックアップソフトがなっとらん、というお話。問題はファイルの「メタデータ」なのだが、有名なリソースフォークと Finder 情報の他にも、BSD の chflags、HFS+ Extended Attribute、ACL (Access Control List) などがあって、全部をきちんとコピーできるツールがとても少ない、という調査結果である。

 Rsync が気になるわけだが、こんなページがある:Mini-HOWTO: Fixing rsync on Tiger (Mac OS 10.4.x)。上記でバグだらけと酷評された Tiger 付属の rsync を修正している。メタデータの扱いをどうやっているのか興味があったので、ソースを見てみたところ、AppleDouble を使っているらしい。Rsync はファイルの「送り手」と「受け手」が別々に動作してその間でファイルリストと中身の受け渡しをするのだが、メタデータは AppleDouble 形式で "._ファイル名" という名前のファイルとして本体とは別に送り、受け手の方が本体と合わせて元のファイルを再現する仕様になっている。UFS 上のメタデータの実装と同じ。ただ、本体よりメタデータの方を後で送らないとまずいので、ちょっと手のこんだ処理をしている。拙作 CocoaRsync でもこの方式を考えたのだが、ファイルを送る順序を正しく指定できる自信がなくて断念したのだった。

 メタデータを AppleDouble に変換するには copyfile() というライブラリ関数を使っている。Tiger から Libc に追加された。Darwin ソース10.4.x/Libc-x.x.x/darwin/ディレクトリに入っている。Tiger の「新機能」として謳われていた「一般的なUNIXユーティリティからのHFS+リソースフォークのハンドリングも可能になります。」というのはこのことだったんだな。まあ、今まででも "ファイル名/..namedfork/rsrc" という「ファイル」をアクセスすればリソースフォークの読み書きはできたし、Finder 情報は get/setattrlist() でアクセスはできたので、画期的な新機能というわけではない。重要なのは、Tiger で導入された ACL 等を含めて(今後の拡張も含めて)1行でメタデータの処理ができてしまうことだ。

 CocoaRsync も 10.4 に対応させたい。10.4 だけで使うのなら上で修正した rsync を使えばよいのだが、うちのファイルサーバは 10.2 なので(苦笑)、10.2 でも使えないと困る。10.2〜3 ではリソースフォークと Finder 情報だけ扱うようにして、ACL などを無視する copyfile の簡易版を作ってリンクすればいいかな、と思う。10.4 と 10.3 以下で2種類のバイナリを使い分けることになって面倒だが、やむを得ないだろう。(1つのバイナリで共用する方法あるのかな? 不勉強でわかりませんが)

タグ:
Posted at 2006年09月06日 00:00:00
email.png