Time Machine 使ってのバックアップは $HOME だけでいーんだけど、を tmutil で設定しようとしての、引っ掛け問題

引っ掛ったのは勿論情弱ゆえなのですがね(笑

とまぁ、今回も、っどーでも良いニッチな話です。

MacOS X に Time Machine ってあるじゃないですか?
あれ、使ってますか?

その Time Machine の設定てどうやってますか?
やっぱり GUI からですか?

アレ、かったるくないですか?

あたくし、
その設定もやっぱコマンドラインからやりたいのですが、どうやったらいいですかね...

と言う感じのお話です。

冒頭にて、
最終的に、この部分、こうしました、と言うのをしてしておきたいと思います。;

    sudo tmutil addexclusion \
      "/Applications" \
      "/Library" \
      "/opt" \
      "/usr" \
      "/bin" \
      "/private" \
      "/System" \
      "/cores" \
      "/sbin" \

    sudo tmutil removeexclusion "${HOME}"

    sudo tmutil addexclusion \
      "$HOME/Applications" \
      "$HOME/Desktop" \
      "$HOME/Downloads" \
      "$HOME/Library" \
      "$HOME/Public" \
      "$HOME/tmp" \

    #対象外の確認: mdfind "com_apple_backup_excludeItem = 'com.apple.backupd'"
    #対象外の確認: ls -l@

どうなんでしょうか。

さて、今回の作業で分かった事。;

  1. tmutil addexclusion item ... 使った除外設定は、これまで defaultsPlistBuddy でやってきたようなものと違う、と言う事。
  2. tmutil addexclusion item ... は、各 item がもつメタデータ拡張属性を制御している、と言う事。
  3. 除外対象は、StdExclusions.plist として、システム側デフォで予め決められたものがある、と言う事。
  4. 除外設定の確認方法いくつか。

何より 1 を知った時はアゴ外しました。

そして今回色々廻った中で、最も参考になったのはこちら。;

» Time Machine 10.8 – Part 3 – Advanced Features » Amsys
» osx - Where does Time Machine store its settings - Ask Different

これら見て一気に開けた。

あ今回、この事について一気にメモしておきたいと思っているので、長くなるかもしれません。

背景

マシンのバックアップは、夜な夜な launchd のスケジューリングで rsync を叩く、という方法を使って行っていましたが、
OS を 10.10 Yosemite にしてから、Time Machine "も" 使ってみることにしようかな、思い立ったのがキッカケ。

で、
個人的には、iTunes のライブラリ筆頭に、この個人的なデータがある $HOME がバックアップとれていれば心の平安が保たれるので、それなりの設定をしようと企んでいました。

ところが Time Machine の設定 ui 見ると、設定するのは「バックアップ "したい" アイテム」ではなく、「バックアップ "しない" アイテム」だと。

これは...かったるいっ。実にかったるい。*1

そこで、文字面しか知らなかった tmutil コマンドを使ってみよう、と言うことで、色々参考にしながらやったのですが、
何かイメージしていたのと違う。

と言うのがこの物語の始まりです。

tmutil addexclusion item ... するんだけど [バックアップ対象から除外する項目] に挙がってこない?

それで正解。

実は、"いつものこと" ゆえの思い込みで、完璧に勘違いしていました。

いつもやっているような、defaultPlistBuddy を使っての環境設定作業と同列で捉えていたので、
tmutil addexclusion すれば、その結果は "いつもの通り" [システム環境設定] の [Time Machine > オプション > バックアップ対象から除外する項目] に反映してくるものと思っていたのです。

んが。
当該 ui のリストは変わらない。

そりゃそうです。なぜならば...

tmutil addexclusion で制御しているのは、com.apple.TimeMachine.plist ではない

なので、上述 [システム環境設定] は [Time Machine] の当該 ui 上に挙がってくるわけない。

決め手は、冒頭にも挙げましたこちらのこんな記述でした。 ;

The tmutil addexclusion command excludes items in a slightly different way to using a plist file. ... , this behaviour does NOT occur when you exclude items from the Time Machine preference pane. Time Machine 10.8 – Part 3 – Advanced Features » Amsys

plist を使ってやるような方法と違うよと。
tmutil addexclusion ... でやっている設定は、/Library/Preferences/com.apple.TimeMachine.plist での話ではない。[システム環境設定 > Time Machine > オプション > バックアップ対象から除外する項目] のgui上でやっているようなこととは違うのですよ、と。

これを知った時は、膝を叩きそして膝から崩れ堕ちましたよ、えぇ。

じゃ何よ?

tmutil addexclusion で制御しているのは、拡張属性 com_apple_backup_excludeItem

なのだそうです。

ちょっと話逸れますが、
Time Machine の設定を考えるうえで参考したスクリプトの一つにこんな記述がありまして、;

# Setup Time Capsule exclusion Folders
# reminder : use the following command to check what's actually excluded from backups
# sudo mdfind "com_apple_backup_excludeItem = 'com.apple.backupd'"
tmutil addexclusion -p "/.Trashes"
:
via. [dotfiles osx-defaults.sh at master | dharFr dotfiles][20]

当初、exclusion の確認に sudo mdfind "com_apple_backup_excludeItem = 'com.apple.backupd'" を使う根拠が理解できなかったのですが、コレを知って合点がいったと。
このメタデータの拡張属性をキーとして使ってる、と。

と言うことで話は戻って。
具体的に見てもらった方が良いかと思います。

例として$HOME 直下に、こんな感じです。

まず素の状態。 ;

vimshell% ls -l@
total 1184
drwxr-xr-x   7 ooo   staff     238 10 31 06:54 Applications/
drwx------+  4 ooo   staff     136 10 31 18:51 Desktop/
drwx------+  4 ooo   staff     136 11  4 03:47 Documents/
drwx------+ 11 ooo   staff     374 11  4 20:57 Downloads/
: *snip*

ここで、例えば「Applications はバックアップしなくて良いや」、と言うことで。;

vimshell% tmutil addexclusion "$HOME/Applications" "$HOME/Desktop" "$HOME/Downloads"

そして見てみると、;

vimshell% ls -l@
total 1184
drwxr-xr-x@  7 koo   staff     238 10 31 06:54 Applications/
    com.apple.metadata:com_apple_backup_excludeItem     61
drwx------@  4 koo   staff     136 10 31 18:51 Desktop/
    com.apple.metadata:com_apple_backup_excludeItem     61
drwx------+  4 koo   staff     136 11  4 03:47 Documents/
drwx------@ 11 koo   staff     374 11  6 22:24 Downloads/
    com.apple.metadata:com_apple_backup_excludeItem     61
: *snip*

tmutil addexclusion ... した各アイテムの行の下に com.apple.metadata:com_apple_backup_excludeItem が追加されています。
文字列から何となく分かる通り、Applications、Desktop、そしてDownliad フォルダに対して "バックアップ対象からの除外" との属性が追加された、と。

と言うことで、tmutil addexclusion は、この com.apple.metadata:com_apple_backup_excludeItem の ON/OFF を制御している、と。

そして付け加えておくと、先の mdfind の行 (くだり)、
これは、バックアップの除外となっているアイテムは何か、を把握する目的の検索、となるわけなのでしょうね。

ls -l@ とか mdfind については、追って改めて。

ちなみに、それでも今までの感覚通り [バックアップ対象から除外する項目] に挙がるよう "な感じ" の設定をしたければ

-p オプションをつけると。

これもまた、ここ からの引用なのですが、それは 'Creating a ‘Traditional’ Exclusion' とタイトル打って以下のような記載をしております。
それは "トラディショナル" だそうですよ... ;

You can ‘unstick’ the exclusion by using the above addexlusion command with the -p flag added.
This exclusion will still not show up in Time Machine Preferences, but will be added to the /Library/Preferences/com.apple.TimeMachine.plist file along with traditional exclusions.

だけど、[バックアップ対象から除外する項目] の ui 上には上がって来ないそうです。

なので、"な感じ" と。

どうしてこんな仕様にしてんのか全く理解できないけど。

デフォルトでバックアップ除外のアイテムが決められている

このあたりは、どちらかと言うと「思い通りのバックアップがなされない」な感じでの筋書きで触れられることが多いようで、結構よく目する情報かと思います。

ユーザー自身の設定とは別に、と言うかそれ以前に、予めシステム側でバックアップから除外するよう決められたものがある、と言うのです。

StdExclusions.plist

それがココ。;

/System/Library/CoreServices/backupd.bundle/Contents/Resources/StdExclusions.plist

ここには、バックアップしないもの、バックアップはするけどフォルダーだけ(中身はしない)、とか色々あるようです。;

» Time Machine から除外されているもの - thyVikings iMac, iPad, iMat by aged engine
» Time Machineはどのようにしてバックアップを取得しているの?MacのTime Machineの疑問徹底解説 – OTTAN.XYZ

なので、tmutil addexclusion ... には "それ以外" を列挙すれば良い、と言うことでも

いいのかな、と考えました。アイテム、選択の根拠として。

実は、最初それこそ「$HOME 以外、全て書かなくちゃいけないのか..」と思っていたのですが、
どうもそこまでしなくても良いみたい。((勿論、StdExclusions.plist の内容気にせず、ガシガシ挙げてしまっても問題ないと思いますが。))

除外設定の確認方法として

普通に考えると help にあるよう tmutil isexcluded [-X] item ... を使うのでしょうが、と言うか実際それを使って確認作業をしていたのですが、item をいちいち指定しなくてはならず、何気に面倒。

ということで、前述もしましたが。

ls -l@

自身、今回の作業を通じて初めて -l@ オプションの存在を知ったのですが、きちんとマニュアルに、しかもオプションについての説明の一番最初にしっかと記述されていましたね。

-@ Display extended attribute keys and sizes in long (-l) output.

拡張属性の情報も出力してくれるんだそうです。

tmutil addexclusion ... を掛けたファイル/フォルダの場所まで移動し、そこで ls -l@ を叩く。

ただし、場合によっては、"その場所" まで移動するなりパスを指定しなくてはならない、と言うところが面倒だと思うことがあるかと。

そこで mdfind

mdfind "com_apple_backup_excludeItem = 'com.apple.backupd'"

こちらだと、場所の制限なく検索してくれるので、全てを一度に眺めたい場合は良いのではないかと思います。

もう説明は不要でしょうが、これはバックアップ対象から外されているアイテムを探して、出力してくれるものだと。;

This command queries Spotlight to tell you every file that has the metadata “ com_apple_backup_excludeItem ”, which means, “ Don't back this up.”

ドバっと出てきます。便利。
でも、sudo 要るのかな? 無くてもイケるような気も。

結果を確認するには

で、Time Machine は期待通りバックアップをしてくれているか、を確認するのは幾つかあるとは思うのですが、
こちらかと。;

tmutil compare

オプションを指定しないと最近 latest の情報を出力してくれるらしいです。

設定の変更が綺麗に反映されるような出力は、Time Machine の利用状況によるので、なかなか無いと思いますが、出力されたパスから、気になる箇所を任意でサンプリングし、上手く行っているかを確認する感じかと。

...しかないと思うのですが、どうでしょう。

もちろん、設定変更前のタイミングを把握しているのでしたら、変更前と後のスナップショットのファイルパスを引数に渡すと良いです。
これが理想ですが。

Time Machine を扱って思ったこと

ここで、バックアップをとる事の目的を考えると、やっぱり rsync の方が良いかなと(笑

Time Machine の「実際のとこ、ホントは何やっているか、はっきりわからない」と言う感覚が拭えなくて、どうしても性に合わない。これは実に気持ち悪い。
Time Machine については、未だに色々と何かスッキリしません。

まぁ一応、こういうのは "しないより、しておいた方が良い" ことは変わらないので、rsync とパラで使い続けますが、
今のところ、"どうしても Time Machine でなくてはいけない" というところが見えてこないのが正直なところです。

最後に、今回のように「実は plist じゃなかった」と言ったケースのように、
インタフェイスがコマンドラインであれ ui であれ「設定はしたけど、それはどこに?」を把握するための手続きについても、忘れないうちに別の機会に触れておきたいと思います。

おしまひ。

*1:これが今まで、TimeMachine を使わなかった理由だったりします。