Mac OS X の Time Machine で毎回フルバックアップされてしまう→差分に戻せた

Mac OS X の Time Machine は, ファイルシステムのハードリンクを利用して自動的に(最短1時間に1回)差分バックアップ(incremental backup)を行い, バックアップ時間とディスクを節約する.

ところが, ある時を境に, 毎時のバックアップがすべてフルバックアップになってしまう事象が発生した. その問題と解決について.

問題発生の状況

Mac Pro running Mac OS X Server 10.6.6 Snow Leopard.
Bay 1のHDDのSystemとBay2のHDDの/Volumes/homeを, Bay4のHDDにTime Machineでバックアップ. サーバ環境設定下にあるユーザTime Machineでなく, システム環境設定下にあるローカルのTime Machine.

ある時, homeの毎時のバックアップのみがフルバックアップになっていることに気づく. (毎時のバックアップ先の容量減少が, homeの容量にほぼ等しい)

解決

Robert Fischer のAppleのSupport Discussionsへの投稿

Apple - Support - Discussions - Always full backup - no longer incremental

がよい情報を与えていた.

HDD Bay2 の/Volumes/homeに対して

hostname:~ % sudo ls -l /Volumes/home
drwxrwxr-t@ 32 root admin 1156 Sep 17 11:37 .
drwxrwxr-t@ 32 root admin 1156 Sep 17 11:37 ..

のように@ がつくので, extended attirbutes が設定されていることに気づく. 実際,

hostname:~ % sudo xattr -l /Volumes/home
com.apple.backupd.SnapshotVolumeUUID:
00000000  32 45 37 34 31 34 35 45 2D 41 42 39 43 2D 33 34  |2E74145E-AB9C-34|
00000010  32 32 2D 42 45 38 43 2D 35 38 46 33 44 46 46 39  |22-BE8C-58F3DFF9|
00000020  30 30 43 42 00                                   |00CB.|
# 他にもいくつかのbackupd関係のattributesが存在

これはディスクユーティリティで見られる, バックアップ元, バックアップ先いずれのディスクのUUIDとも異なる. 一方, バックアップ先の /Volumes/BAY4/Backups.backupdb/hostname/Latest/home には, これと全く同じ com.apple.backupd.SnapshotVolumeUUID extended attribute が存在する.

Time Machine を一時的に止めて, バックアップ元のextended attributeを消去する.

hostname:~ % sudo  xattr -d com.apple.backupd.SnapshotVolumeUUID /Volumes/home

Time Machine を再開. これで再び差分バックアップに戻った.

補足

これ以外にもbackupd関係のいくつかのextended attributesが設定されていたが放置した.

Time Machine再開後, さらに, /Volumes/home を除外バックアップ元に一時的にいれてまたもとに戻したが, これが必要だったかどうかは不明.

問題発生までの経緯

実は, /Volume/home がクラッシュしたのでそのHDDを換装し, Time Machineからフルリストアしていた. その直後から, 毎回フルバックアップするようになっていた可能性が高い. 換装の際に, Time Machine を止めたり, /Volume/home を一時的に除外したりはしなかった(それがいけなかったのか?)

差分にもどす試行錯誤の中で, backupが壊れているのかも, と疑い, バックアップ先をBay3からBay4の空のHDDに(Time Machineの設定で)変更し, バックアップを再構築してみていた. が, フルバックアップは止まらなかった. この試みは, たぶん状況にあまり変化を与えていない.

解釈

このextended atributeの意味については, Mac OS X 10.5 の場合ではあるが

10.5: Reconnect Time Machine backup after drive swap - Mac OS X Hints

に解説されている.

本来はバックアップ先に存在し, バックアップ元のディスクのUUIDを記録しているものだという. 上の記事では, バックアップ元のディスクを換装した際に(そういうときはTime Machineはフルバックアップを行い, 履歴が連続しなくなる), バックアップ先のcom.apple.backupd.SnapshotVolumeUUID extended atttibute を手動で強制的に書き換えて新しいディスクと同一にすることによって, Time Machine を騙して, フルバックアップを起らない(ディスク換装を差分で記録する)ようにする, というものである.

今回の事例では, バックアップ元にこのextended attibuteが設定されている時点で, この記事の状況を越えている. 何の目的で設定されるものなのかわからない. しかし,

バックアップ元のcom.apple.backupd.SnapshotVolumeUUID == バックアップ先のcom.apple.backupd.SnapshotVolumeUUID != バックアップ元の実際のUUID

であるので, 左辺のUUIDはどこから来たのか, という疑問がでる. これはおそらく, クラッシュした元の/Volumes/homeのUUIDが残っているのではないだろうか. ディスク換装後もTime MachineがそのUUIDを覚えていて, ディスクが替わったからバックアップをリセットして一度だけフルバックアップすればいいのに, 何かが間違って(バックアップ履歴を継承しようとして?)com.apple.backupd.SnapshotVolumeUUIDがバックアップ元に設定されておかしくなったのかもしれない. そうだとすれば, Time Machineのバックアップ元になっているHDDの換装には要注意, ということになる.

extended attributes や xattr コマンド, Time Machineの仕組みの日本語の解説としては

Time Machineは過去をどのように記憶しているのか? - ザリガニが見ていた...。

がたいへん勉強になった.