iCloudに拡張ファイル属性を保存する方法 | AppleInsider

iCloudに拡張ファイル属性を保存する方法 | AppleInsider

AppleのiCloudファイルストレージサービスは、ファイルを保存・共有するのに便利ですが、同期中に重要なファイル属性が削除されることがあります。その修正方法をご紹介します。

AppleのmacOSやその他の一部のオペレーティングシステムでは、ストレージボリューム上のメタデータと呼ばれるファイルに関する説明情報が拡張属性(xattr)に保存されます。拡張属性には、オペレーティングシステムが使用するファイルに関する追加情報が含まれています。

拡張属性を保存および取得することにより、オペレーティング システムはファイルの内容を直接変更することなく、ファイルに関する情報を変更できます。

たとえば、macOS Finder では、ファイルを選択してキーボードのCommand-I キーを押すと、Finder は「情報を見る」ウィンドウを開き、ファイルの拡張属性の一部を読み取って表示します。

一部の拡張属性はmacOS自体によって作成・管理されますが、アプリケーションは独自の拡張属性を作成して保存することもできます。拡張属性をどのように管理するかは、各アプリケーションが決定します。

NFSなど、一部のファイルシステムは拡張属性を全くサポートしていません。拡張属性をサポートしていないファイルシステムにファイルをコピーすると、それらの属性は永久に失われます。

一般的な現代のファイルシステムのほとんどは拡張属性をサポートしていますが、データの管理方法は異なる場合があります。ほとんどのオペレーティングシステムでは、拡張属性はファイル自体ではなく、ボリュームメタデータカタログに保存されます。ボリュームメタデータカタログには、各ファイルの追加属性がリストまたはデータベース形式で保存されます。

ファイルがコピーされると、メタデータも一緒にコピーされ、コピー先ボリュームのメタデータカタログに挿入されます。これにより、追加属性が保持されます。この動作を利用して、オペレーティングシステムはコピー時にファイル自体と共にファイルメタデータをあるボリュームから別のボリュームに移動します。

Appleは、macOSのメタデータシステムとその仕組みに関する開発者向け情報を限定的に公開していますが、すべてではありません。現在、macOSまたはiOSでメタデータを管理するためのユーザー向けのAppleドキュメントは存在しません。

xattrsと逆ドメイン名構成

macOSでは、拡張属性とメタデータは、アプリバンドル名や会社組織と同様に、逆ドメイン表記に基づいて整理されることが分かっています。メタデータに使用されているAppleの逆ドメインには、以下のようなものがあります。

  1. com.apple.FinderInfo
  2. com.apple.メタデータ
  3. com.apple.TextEncoding

すべての拡張属性がすべてのファイルに必要なわけではありません。一部のファイルでは、特定の逆ドメインからの xattr が完全に欠落している可能性があります。

iCloudのxattrs

Appleがクラウドへのファイルコピーと保存手段としてiCloud Driveをリリースした際、ファイルのメタデータの一部が失われていることにユーザーは気づき始めました。しかし、すべてのメタデータが失われているわけではありませんでした。さらに悪いことに、この動作はMac OS X Mojaveのリリース頃から、macOSの異なるバージョン間で一貫性が失われるようになりました。

ユーザーは、ファイルを iCloud に移動してからコピーし直すと、一部の(すべてではない)拡張属性がファイルから削除されることに気付きました。

少なくとも、ファイルが iCloud に移動されると、com.apple.FinderInfo のすべての拡張属性と、com.apple.metadata ドメインの「情報を見る」コメントを含むすべてのユーザーが追加したメタデータが削除されることはわかっています。

com.apple.TextEncodingドメインやその他の特定のドメインにあるような拡張属性は保持されます。これはある意味理にかなっています。なぜなら、すべてのアプリケーション、さらにはFinderでさえ、各ファイル内のテキストデータを正しく表示するために、そのエンコード方法を把握する必要があるからです。

一方、com.apple.FinderInfo などの一部の属性は各ユーザーの Mac の Finder 表示設定に固有のものである可能性があるため、iCloud でそれらの属性を保存することは Apple にとって意味がない可能性があります。

それでも、ファイルの「情報を見る」ユーザーコメントを削除することは明らかにデータ損失です。さらに悪いことに、iCloud Drive が、iCloud 上の同じファイルにアクセスする際に、異なるバージョンの macOS 間でサードパーティの拡張属性を削除するという報告があります。これは明らかに問題です。

今のところ、Apple はこの問題について公に対処したりコメントしたりしていないため、これが意図された動作なのか、未対処の問題なのかはわかりません。

ぎこちない修正(ある意味)

Apple が 2013 年頃から行ってきたのは、拡張属性タグと呼ばれる一種の開発者ハックをファイル メタデータにひっそりと追加することです。

Appleのxattrsタグシステムは、各xattrの末尾に#'文字を先頭に付けて、4つの文字(C、P、N、S)のいずれかを付加することで構成されます。#'はxattr名で禁止されている文字の1つであるため、xattrを扱うほとんどのアプリケーションコードではflagsは無視されます。

4つのフラグ文字はそれぞれ、Appleのプログラミングインターフェースにおけるxattrメタデータ保存レベルに対応しています。ここでは詳細は割愛しますが、P、N、Sフラグは、おおよそ以下の属性保存レベルに対応しています。

  1. C - ファイルデータが変更されたときに保存します。
  2. P - コピー中に保存します。
  3. N - コピー時でも常に xattr を削除します。
  4. S - 同期時に常に xattr を保持します。

したがって、ファイルを iCloud Drive にコピーする場合、末尾に「#S」フラグが追加されたファイル xattr はすべて保持されます。

現時点では、ターミナルを使用せずに、どのような変更を加えるべきかを正確に理解せずに、ファイルにこれらの変更を加える簡単な方法はありません。

拡張属性の変更はリスクを伴う場合があることをご承知おきください。拡張属性にエラーがあると、Finderや「情報を見る」ウィンドウにおけるファイルの表示方法、ファイルの作成日時や更新日時が変わってしまう可能性があり、場合によってはファイルが破損したり、使用できなくなったりすることもあります。

macOS Venturaの時点では、Spotlightのインデックス作成は追加のxattrフラグを混乱やデータ損失なく処理できることが分かっていますが、Finderの「情報を見る」ウィンドウは必ずしもそうではありません。通常、Finderの「情報を見る」で使用されるxattrにxattrフラグを追加すると、ファイルが読み取れなくなり、Finderから開けなくなる可能性もあります。

また、Finder はコピー中に常にxattr フラグを尊重することに注意してください。たとえば、ローカルFinder コピー中に任意のファイルの xattr に '#N' フラグが存在する場合、それらの属性はすべてのケースでコピーされたファイルから常に削除されます。

一方、ターミナル ファイル コピー コマンド (cp) は、すべてのケースですべての xattr フラグを常に保持します。つまり、どのような場合でも、コピーされたすべてのファイルのすべての xattr をコピーします。

次のように入力すると、ターミナルで xattr フラグに関するかなりまばらな開発者情報を表示できます。

man xattr_name_with_flagsと入力して、Return キーを押します。

しかし、開発者でない限り、提供される情報は、Cヘッダーファイルに含まれる標準Cライブラリプログラミング情報であるため、理解するのが難しいかもしれません。xattr_flags.h

ターミナルのxattrs

macOS ターミナルで xattr コマンドを使用してファイルの xattr を表示および変更できますが、これを行うときは十分に注意してください。

ターミナルの標準ディレクトリリストを使って、特定のファイルにxattrがあるかどうかを確認することもできます。これを行うには、ターミナルで「cd」コマンドを使って、表示したいファイルがあるディレクトリに移動し、次のように入力します。

ls -l

そしてReturnを押します。

次のようなディレクトリのリストが表示されます。

ディレクトリ一覧の左側には、各ファイルのUNIXパーミッションが表示されます。「@」または「+」で終わるファイルパーミッションは、拡張属性が付与されているファイルを示します。

各ファイルの属性がどの逆ドメインに属しているかを確認するには、次のように入力します。

ls -l@

そしてReturnを押します。

リストは「ls -l」を使用した場合と同じですが、ファイルで使用されている xattr 逆ドメインもリストされます。

UNIXコマンドのxattr、ファイルのxattrを表示および変更する方法ですが、前述の通り、使用には細心の注意が必要です。このコマンドは強力であるため、ファイルの使い勝手が簡単に損なわれる可能性があります。

次のように入力すると、ターミナルですべての xattr コマンド オプションを表示できます。

man xattrと入力してReturn キーを押します。

man システムを終了させるには、 Ctrl + Zを押します。

要約すると、iCloud との間でファイルをコピーするときに xattr を処理するシンプルで簡単な方法はありません。

iCloud との間で同期するときに、特定の xattr のフラグが '#S' に設定されている限り、その xattr は常に保持されます。

Apple は macOS Finder と iOS でこれを修正する必要がありますが、そうすると問題が発生します。同期時にすべてのファイル xattr に '#S' タグを追加する必要があり、そうすると、xattr の読み取りと書き込みを行うもののタグの処理方法をまだ知らないサードパーティ製アプリの少なくとも一部が動作しなくなる可能性があります。

xattr リソース

開発者の Howard Oakley 氏は、xattr の処理に役立ついくつかのアプリとツールを作成しました。その中には、 xattred (「scattered」と韻を踏む) と呼ばれるエディターや、 2 つのファイル間のすべての xattr の違いを比較して表示する コマンド ライン ツールcmpxatなどがあります。

彼はまた、 iCloud ブラウザ ツールであるCirrusも作成しており、彼のブログには iCloud xattr の問題に関する議論がいくつか掲載されています。

Cirrus1.0b4でiCloudのファイルとフォルダを直接見る

彼はまた、Apple Silicon Mac 上で macOS および Linux 仮想マシンを実行する、Viable と Liviable という 2 つの非常に興味深い仮想化アプリも開発しています。

Michael Tsai は、xattr フラグと iCloud Drive に関する短いページで同様の議論をしています。

Apple にはファイル メタデータ属性リファレンスがありますが、Spotlight、iCloud、および Core Data 属性のみがカバーされています。

開発者の場合は、公開されている Swift または Objective-C Apple ファイル メタデータ API ドキュメントも利用できます。

C コードを読むことができる場合、Apple のオープン ソース ファイルで、xattr_flags.cApple が 2013 年に追加した xattr タグ コードの内部動作を確認できます。

StackExchange には xattr がどのように保存されるかについての古い技術的な議論がありますが、これはかなり技術的であり、BSD ファイルシステムの内部動作を詳しく調べており、macOS よりも Linux ext3 ファイルシステムに特有のものです。

Apple の File System Programming Guide は開発者向けですが、非常に技術的で長く、より一般的な内容になっています。

近い将来、Apple が上記の iCloud の問題をすべて解決し、すべての iCloud ファイル同期にわたって xattr メタデータをシームレスに保持するソリューションに到達することを期待します。