Time Machineは僕がMac OS Xの中で一番気に入っている機能の一つだが、一つだけ難点がある。それはすべてのファイルをバックアップするわけではないことだ。
よくあるトラブルとして、Time Machineからのフルリストアをやった後にApacheが起動できなくなるというものがあった。これは「/private/var/log」ディレクトリがバックアップ対象となっていないために、access_logなどのログファイルが作成不能になることが問題だ1。
Coffee and Ashtray: Mac Timemachine復元後 Apache起動しない
http://coffeeash.blogspot.com/2009/04/mac-timemachine-apache.html
何がバックアップされないか
バックアップされないものには次のようなものがある。
- キャッシュディレクトリ(
~/Library/Cachesなど) - テンポラリディレクトリ(
/tmpなど) - マウント用のディレクトリ(
/Volumes) - スワップファイル(
/var/vm) - ログファイル(
/var/log)
最後のログファイルが問題である。大規模なサイトを構築してものすごい量のログファイルが作成される環境なら、Time Machineの対象にしないのもわかる(代わりにDVDなどに焼くだろう)。でもうちみたいな小規模な鯖じゃそこまでする気にはなれない。それに、マシンに障害が起こってTime Machineから復旧したとしても、ログファイルが残ってなければ原因の調べようもないではないか。
というわけで、Time Machineにバックアップされないファイル・ディレクトリの完全なリストはどこにあるのか調べていたら、次のような情報があった。
10.5: Show files that Time Machine does not back up – Mac OS X Hints
http://www.macosxhints.com/article.php?story=20080328025026826« shiftedbits » Time Machine Exclusions
http://shiftedbits.org/2007/10/31/time-machine-exclusions/
どうやらファイル・ディレクトリをTime Machineにバックアップさせないためには2つの方法があるらしい。
ファイル・ディレクトリのメタデータに値を設定する
これはおそらくアプリケーションが独自に設定したものだろう。次のようにして確認できる。
$ sudo mdfind "com_apple_backup_excludeItem = 'com.apple.backupd'" Password: /Users/delphinus/Pictures/iPhoto Library/iPod Photo Cache /Users/delphinus/Music/iTunes/iTunes Music Library.xml /Users/delphinus/Music/iTunes/Album Artwork/Cache
僕の環境では合計3つのファイル・ディレクトリがバックアップされないようだ。
専用のプロパティリストに項目を羅列する
次のプロパティリストを開いてみると、Time Machineが予めバックアップしないものを羅列している。
$ cd /System/Library/CoreServices/backupd.bundle/Contents/Resources $ cat StdExclusions.plist
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<!-- paths we do not want to include in a system backup -->
<!-- システムバックアップに含みたくないもの -->
<key>PathsExcluded</key>
<array>
<string>/.Spotlight-V100</string>
<string>/.Trashes</string>
~省略~
</array>
<!-- paths where we need to capture top level folder to restore disk structure, but don't want to backup any contents -->
<!-- ディレクトリ自体はバックアップするけど、中にあるディレクトリ及びファイルはバックアップしたくないもの -->
<key>ContentsExcluded</key>
<array>
<string>/Volumes</string>
<string>/Network</string>
~省略~
</array>
<!-- paths where we need to capture entire subtree folder layout to restore disk structure, but don't want to backup contained files -->
<!-- サブディレクトリを含めてディレクトリ構造をバックアップするけれども、ファイル自体はバックアップしたくないもの -->
<key>FileContentsExcluded</key>
<array>
<string>/private/var/log</string>
<string>/private/var/spool/cups</string>
<string>/private/var/spool/fax</string>
<string>/private/var/spool/uucp</string>
</array>
<!-- standard user paths we want to skip for each user (subpath relative to root of home directory) -->
<!-- 各々のユーザーのホームディレクトリの中でバックアップしたくないもの -->
<key>UserPathsExcluded</key>
<array>
<string>Library/Application Support/SyncServices/data.version</string>
<string>Library/Caches</string>
~省略~
</array>
</dict>
</plist>
リストの29行目でApacheのログを含むディレクトリ自体はバックアップされている。このため、先に挙げたような問題はもはや起こらないのだろう。
除外設定から外して無理矢理バックアップ
いくらディレクトリは残ると言っても、ログファイル自体もバックアップしたい。リストの29行目をさくっと消したところ、きちんと全てのバックアップが取られるようになった。
| 変更前 | 変更後 |
|---|---|
