2012年6月29日金曜日

MacOS Xでls -lのパーミッションの末尾の"+"文字とは

TimeMachineにバックアップされているファイルを、ディスクをマウントして単純にコピーするといろいろ問題があるようだ。

そのひとつが、自分のディレクトリであって、しかも書き込み権限があるにも関わらず書き込みができないということ。

こうしたディレクトリや、内部に保存されているファイルを"ls -l"すると、
-rwxr-xr-x+
などのように、8番目のところに"+"がついていることが多い。場合によっては"@"になっているかもしれない。

"@"については、いろいろブログに書かれていて、Apple Double時代のリソースフォークに相当する内容がついているということで、xattrコマンドで削除できると書かれている。

TimeMachineの場合は、"ls -l@"オプションで見ると、以下のものがつくようだ。
com.apple.backup.SnapshotNumber
com.apple.backup.SnapshotVersion
com.apple.backupd.SnapshotStartDate
com.apple.backupd.SnapshotState
com.apple.backupd.SnapshotType
これを手元に直接コピーした場合には、僕の場合、以下の2つがついていた。
com.apple.metadata:_kTimeMachineOldestSnapshot
com.apple.metadata:_kTimeMachineNewestSnapshot
それぞれ、
$ xattr -dr com.appple.metadata:_kTimeMachineOldestSnapshot
$ xattr -dr com.appple.metadata:_kTimeMachineNewestSnapshot
とすることで外すことができる。しかし、それらを外したとしてもこんどは"@"が"+"に化けることになると思う。

この"+"は、わかりにくいのだがlsのマニュアルをよく読むと、アクセス制御リスト(ACL)がついていることを示すのだそうだ。"ls -le"すると、 ACLの内容が表示される。例えば、
0: group:everyone deny add_file,delete,add_subdirectory,delete_child,writeattr,writeextattr,chown
といったように、細かな設定がつけられていることがわかる。どうも、WindowsのNTFS相当のACLという説明が一般的なようだ。

ではこれをどう操作するか、ということになるとよくわからない。しかたがないので、Appleのテクニカルサポートに電話して問い合わせることにした。

最初に応対された方ではだめで、シニアアシスタントという肩書きの方に交代されたところで、関係するフォルダのFinderの「情報を見る」から、「共有とアクセス権」のいちばん右下の錠前を開いて(パスワード入力)、自分が読み書き権限があることを確かめ(いったん変更して戻すといいかもしれない)たあと、歯車アイコンのメニューで「内包する項目に適用」としてやると、フォルダ以下一括でACLを更新してくれるようだ。

電話ではこれでこちらの希望する用件が解決してしまったのでそこまでとしたが、コマンドラインがわからないのが納得いかないので調べてみた。

man aclすると、どうやらこのACLはPOSIX共通のものらしいということがわかる。そこから、See Alsoをみると、(1)としては、lsとchmodが書かれている。そこで、man chmodすると、ACLの操作もできると書かれていた。

chmodのマニュアルでは、項目を立てて「ACL MANIPULATION OPTIONS」として詳しく書かれている。ACLに指定できる項目の一覧と、操作のために指定するオプションからなる。要は、さきほどFinderの「情報を見る」のアクセス権の部分に相当することのようだ。ひとつ特記しておくなら、全部削除は"-N"オプションといったところだろうか。

DropboxやSkyDriveなど、クラウドと同期するディレクトリにも「書き込みのみ」などがついていたりする。したがって、同期するディレクトリを変えるつもりで中途半端な設定をしないよう、拡張属性やACLなどにも配慮する必要があるだろうと思う。正直な話、僕がはまったのもそれだからだ。

なお、Finderで隠し属性になっているフォルダ(ディレクトリ)を表示させるための説明として、コマンドラインで
$ chflags nohidden ディレクトリ名
とする、という説明がよくあるが、このhiddenがいわゆる拡張属性(extended property)だ。"ls -lO"(大文字のオー)すると、グループとサイズの間に現れる。ついていない場合には"-"となる。例えば/etcの下でこれをやると、"compressed"がついているものが意外に多いことに気づくかもしれない。

拡張属性については、Finderの「情報を見る」では、「一般情報」の下のほうに「共有ファイル」とか「ロック」とか「ひな形」などのチェックボックスがあると思うが、そのへんで操作できると思っていいのではないかと思う。