Time Machine のスナップショットをコマンドラインで削除する
Time Machine のスナップショット、つまり /Volume/Time Machine/Backups.backupdb/[Machine Name]/2016-05-05-002654/ みたいなやつを手動で削除したいとします。
これを Finder 経由で、ごみ箱に入れてごみ箱を空にするという手順でやると、時間がかかるうえに、途中で「ロックされている項目を削除してもいいか?」と一度確認まで入ります。さっさと削除してくれよという感じがします。
ということで、めんどいなので rm -rf するかと思いきや、これは削除するパーミッションがあっても、 operation not permitted となって失敗します。どうしてかというと Time Machine のスナップショットは専用のカーネル拡張で守られているからです。守られているにはそれなりの理由があるので rm -rf は素直に諦めましょう。
ということで、tmutil delete を使います。
$ cd /Volumes/Time Machine/Backups.backupdb/Alice $ sudo tmutil delete 2016-05-05-002654/ Password: Deleting: /Volumes/Time Machine/Backups.backupdb/Alice/2016-05-05-002654
こんな感じで使えます。スナップショット1つ消すのに結構な時間がかかりますが、特に確認は入らないので放置すれば終わります。
余談:なぜ rm -rf がダメか
Time Machine は差分バックアップのためハードリンクを活用します。これはディレクトリに対してもそうで、内容に変化のないディレクトリはハードリンクになります。 (ちなみにディレクトリのハードリンクは標準 ln では作れないので、brew install hardlink-osx で入る hln で試すことができます)
このとき、違うスナップショット間でも同じディレクトリエントリとなるわけなので、このディレクトリエントリ中のファイルエントリを削除 (unlink) してしまうと、このディレクトリにハードリンクしているスナップショット間でもファイルが消えてしまいます。なので rm -rf が禁止されています。
$ mkdir foo bar $ touch foo/a.txt $ ls foo/ bar/ $ ls foo a.txt $ hln foo bar/foo $ ls bar/foo a.txt $ rm -rf foo $ ls bar/ $ ls bar/foo # a.txt が消える
関連エントリー
- Mac の Time Machine が今何をバックアップしているのか? を知る Time Machine はかなり気にせずに使えるのがいいというものですが、バックアップ実行中に環境設定を開いても今何をコピーしているのが全...
- perl 5.19.9 の signatures 構文 (普通に引数を書ける構文) を試す Perl 5.19.9 で実装された signatures の構文をためしてみる - tokuhirom blog を見てそんなのできたのか...
- nginx の rewrite ルールっぽく h2o の mruby でリクエストの rewrite を行う このサイトのHTTPS化にあたって nginx で書いていた rewrite のルールを h2o の mruby で処理するように変える必要...
- Ruby でスコープをはずれたときに自動で何かをする Guard オブジェクト Perl だと Guard オブジェクトとかいうハックがあって、スコープを出るタイミングで必ず呼ばれるファイナライ...
- LPC11U35 の mbed ローカル開発環境構築 秋月でLPC11U35 が乗っているボードを買った。うっかり3枚買っていた。EA LPC11U35 QuickStart Board と互換...