書いて覚えるSwift入門

第32回 APFSの研究

この記事を読むのに必要な時間:およそ 5 分

スナップショットが作成されていることを確認したら,Macをリカバリーモードで再起動してみましょう。起動時に[Command][R]です図2,図3,図4,図5⁠。

図2 macOS UtilitiesでTime Machineからリストア

図2 macOS UtilitiesでTime Machineからリストア

図3 リストア開始

図3 リストア開始

図4 リストア元の選択

図4 リストア元の選択

図5 スナップショットを選択

図5 スナップショットを選択

あとはここからTime Machineを選択し,バックアップの代わりにスナップショットされたディスクを選択すれば,スナップショットのリストが表示されます。リストアはやはり一瞬で完了します。

ファイルシステム全体をスナップショットでundoする場合はリカバリーモードでの再起動が必要ですが,特定のファイルだけを元に戻したい場合は普通にTime Machineに入れば,バックアップストレージが接続されていなくてもスナップショット上のファイルを元に戻せます図6⁠。

図6 バックアップがなくてもローカルのスナップショットでリストア可能

図6 バックアップがなくてもローカルのスナップショットでリストア可能

なんだか良いことづくめのように思えるCoWですが,重大な欠点が1つあります。ファイルに上書きをしないということは,その分ストレージを食うということにもなります。実際,APFS上のゴミ箱を空にしても空き容量はすぐには減りません。ゴミ箱の中のファイルがスナップショットにあったら当然そうなります。また,Finderが申告する空き容量とdfコマンドの出力結果は食い違います。前者は「削除可能(purgeable)なスナップショットを削除した後の空き容量」を,後者は本当にどこにも使われていない空きブロックの容量をそれぞれ表示します。

macOSの実装は,なるべくスナップショットは残しておき,空き容量が本当に足りなくなって初めて古いスナップショットを消すという仕様になっているようです。常時バックアップ用のSSDが接続されている筆者のiMacでも,ほぼ24時間分のスナップショットが残っています。

ちなみに,これらのスナップショットはtmutilコマンドで削除することもできます。tmutil deletelocalsnapshot YYYY-MM-DDhhmmssで日付を指定して1つずつ消すこともできますし,tmutil thinlocalsnapshots「十分」な空き容量が確保されるまで古いスナップショットを消すこともできます。このあたりを手動でできるところも,ほかのApple製品とMacの違いですね。

なお大事なことなのであらためて申し上げると,スナップショットというのはバックアップを置き換えるものではありません。ハードウェアが壊れてしまえばスナップショットも一蓮托生。というわけでバックアップも相変わらず必要なのですが,そのバックアップを取る手法もスナップショットのおかげで変わります。

CoWではないHFS+では,ファイルシステムへの変更を常時監視して,書き込みがあったファイルをマークしてそれをバックアップするという方法をとっていました。しかしAPFSのバックアップでは,スナップショットどうしを比較するという手法になりました。常時監視しなくてもいい分,ずっとシンプルになったのです。

残念ながら,Time Machineのバックアップディスクは現時点ではHFS+なので,ZFSのsend/recvのようにスナップショットの差分そのものをまとめてブロック転送という手法は使えないのですが,近い将来には必ずそうなるのではないかと筆者は考えています。

著者プロフィール

小飼弾(こがいだん)

1969年生まれ,東京都出身。元ライブドア取締役の肩書きよりも,最近はPokemon GOのガチトレーナーのほうが有名になりつつある……かもしれない永遠のエンジニアオヤジ。

活躍の場はIT業界だけでなく,サブカルからアカデミックまで多方面にわたり,ネットからの情報発信は気の向くまま毎日毎秒! https://twitter.com/dankogai,ニコニコチャンネルは,http://ch.nicovideo.jp/dankogai,blogはhttp://blog.livedoor.jp/dankogai/

当社刊行書籍は『小飼弾のアルファギークに逢ってきた』『小飼弾のコードなエッセイ』など。他にも著書多数。