APFSの復元|スナップショットから戻せる範囲を知る
APFSの復元と一口に言っても、中身は難易度の違う3つの作業に分かれています。ボリュームに残っているスナップショットから戻す作業、Time Machineのバックアップから戻す作業、そして消えた痕跡を拾う作業です。前の2つは標準機能で完結し、最後の1つだけが運に左右されます。順番を取り違えて最後から始めてしまう人が多いので、どこに自分がいるのかを先に見極める形で整理します。
復元の見込みは、スナップショットが残っているかで決まる
APFSはmacOS 10.13以降のMacの既定のファイルシステムで、Appleはその特徴として強力な暗号化、領域共有、スナップショット、高速なディレクトリのサイズ調整を挙げています。復元の話で効くのは3つ目です。スナップショットは、ある時点のボリュームの状態を読み出し専用の写しとして残す仕組みで、これが残っているなら復元は探索ではなく参照になります。
現場で起きている状況は、だいたい次のような形をとります。
MacのAPFSドライブから重要なファイルを誤って削除してしまい、Time Machineのバックアップもありません。何かを上書きしたりデータ損失を悪化させたりせずに、削除されたAPFSファイルを復元する最も安全な方法を知りたいです。実際に有効なツールや手順は何ですか? 出典: forum.dvdrw.com
この問いに対する順番は決まっています。道具を探す前に、スナップショットの一覧を見ます。Time Machineを一度も設定していない場合は確かに空ですが、設定してあった時期がある、あるいは外付けを繋いだことがあるなら、本体の中に控えが残っていることがあります。一覧を見る作業は数秒で終わり、何も書き込みません。
スナップショットは、その時点の読み出し専用の写し
diskutil のマニュアルは、APFSスナップショットを親ボリュームの読み出し専用の写しで、作成された瞬間に凍結されたものと定義しています。1つのボリュームは0個以上のスナップショットを持てます。識別はUUIDが推奨で、ボリュームの中では数値の識別子か名前でも指せます。名前の重複はボリューム内では許されません。
見落としやすい性質が1つあります。同じマニュアルには、スナップショットは通常、元のボリュームかスナップショットのどれかがマウントされていないと見つけられないと書かれています。ディスクを外した状態で残数を調べようとしても出てきません。復元の可否を判断するときは、対象のボリュームをマウントした状態で一覧を取る必要があります。
もう1つの性質が復元の幅を決めます。スナップショットはマウントできます。マウントすると、元のボリュームとは別の場所に、作成時点の内容を読み出し専用で見せるマウントポイントができます。つまりボリューム全体を巻き戻さずに、必要なファイルだけを取り出す道があります。ここを知らないまま巻き戻しの手順を探すと、必要のない大きな操作に進んでしまいます。
残っているスナップショットを一覧する
見る方法は2系統あります。1つはAPFSの側から見る diskutil で、diskutil apfs listSnapshots は指定したボリュームに紐づくすべてのスナップショットを、UUID、名前、数値の識別子とともに並べます。マニュアルによれば、コンテナのサイズ変更を妨げているスナップショットがある場合はそれも示されます。外付けを縮められない原因を探すときにも使える出力です。
もう1つはTime Machineの側から見る tmutil です。tmutil listlocalsnapshots は指定したボリュームのローカルスナップショットを並べ、tmutil listlocalsnapshotdates は作成日時だけを YYYY-MM-DD-HHMMSS の形で並べます。Time Machineが作る控えは com.apple.TimeMachine.2011-07-03-123456.local のような名前を持つと定義されており、日付の形を見れば目的の時点が残っているかを判断できます。
一覧を読むときは、最古の日時に注目します。ローカルスナップショットは空き容量のために間引かれます。マニュアルの thinlocalsnapshots は、指定したバイト数を回収するために緊急度1から4の段階でスナップショットを間引くと説明されています。残りが少ないディスクで作業を続けると、戻りたかった時点が先に消えます。失敗に気づいた直後に大掃除を始める行為は、この点で逆に働きます。
1ファイルだけ戻すなら、ボリューム全体を巻き戻さない
必要なのが数個のファイルなら、スナップショットを読み出し専用でマウントして中身をコピーするのが最も影響の小さい方法です。mount_apfs のマニュアルには、-s オプションでスナップショットの名前を指定する形式が載っています。この使い方では、元のボリュームがマウントされているディレクトリをパス名として渡し、マウント先のディレクトリを指定します。
読み出し専用という性質が効くのは、作業の安全性です。マウントしたスナップショットの側からは書き込めないため、操作を間違えても控えが壊れません。取り出したファイルの置き場所は、元のボリュームではなく別の場所にしておくと、現在の作業版と控えの版を見比べてから入れ替えられます。
Finderの復元画面から過去を辿る操作も、内部ではこの控えを見ています。外付けのバックアップディスクを繋いでいなくても過去の日付が並ぶのは、本体の中のローカルスナップショットが見えているためです。ただし表示される期間は、外付けに並んでいる控えより短いのが普通です。1か月前の状態を探しているなら、本体の中ではなくバックアップディスク側を確かめることになります。
巻き戻しは、前に戻れない操作
ボリューム全体をスナップショットの状態に戻す操作もあります。ただしこれは片道です。diskutil のマニュアルは、この操作を破壊的なリセットまたはリストアだと明記し、一度ボリュームを巻き戻すと前へ進められないと書いています。さらに、巻き戻した時点と現在の間にあるスナップショットも失われます。
この性質は、順番の設計を変えます。巻き戻す前に、現在のボリュームから救い出しておきたいファイルを別のストレージへコピーします。巻き戻したい時点より後に作ったファイルは、巻き戻しによって現在の状態から消えます。設定ファイルを壊した直後のように、後から作ったものが何も無い状況でだけ、巻き戻しは素直な手になります。
スナップショットを消す操作にも注意点があります。diskutil apfs deleteSnapshot はUUID、数値の識別子、名前のいずれかで対象を指定し、削除は背景で進むため -wait を付けない限りコマンドが終わった時点で完了していない場合があると書かれています。マニュアルは、削除によってその時点へ戻す可能性は失われるが、ボリュームの現在の内容には影響しないと整理しています。容量を空けたいときに消す対象として選びやすい一方、戻り道を1つ捨てる操作でもあります。
スナップショットでは救えない場面を見分ける
スナップショットは同じコンテナの中に置かれます。APFSはコンテナ内の空き領域を必要に応じて各ボリュームへ割り当てる作りで、コンテナ全体のサイズから各ボリュームのサイズを引いたものが利用可能領域になります。この構造は便利ですが、復元の観点では1つの弱点を持ちます。ディスクそのものが読めなくなった場合、スナップショットも一緒に読めなくなります。
論理的な破損が疑われる場合の窓口は別にあります。diskutil verifyVolume はファイルシステムの管理情報を検証し、diskutil repairVolume は修復します。マニュアルは、修復では多くの場合で対象のボリュームをマウント解除できる状態にする必要があり、下層の媒体が書き込み可能でなければならないと書いています。動作中のボリュームに対する修復は対応していません。ここで直らないと出た場合は、消去して作り直すか、痕跡を拾う経路へ移る判断になります。
削除や誤操作が主な原因という整理は、一般向けの解説でも共通しています。
信頼性と安全性が高いAPFSなので、削除やフォーマットの誤操作などは、APFSでのデータ紛失の主な原因となります。 出典: jp.easeus.com
機械の故障ではなく操作が原因である場合、スナップショットが残っている確率は高くなります。故障を疑う症状、たとえば認識されない、異音がする、書き込みが途中で止まるといった状態では、読み続ける操作自体が状態を悪くしうるため、扱いを分けて考えます。
暗号化していると、復元の前提が1つ増える
APFSには暗号化のフォーマットがあります。Appleのディスクユーティリティの案内では、選べる形として通常のAPFS、APFS(暗号化)、APFS(大文字/小文字を区別)、APFS(大文字/小文字を区別、暗号化)の4つが挙げられています。同じコンテナの中で、ボリュームごとに別の形を選べます。
暗号化したボリュームでは、復元の手前に鍵の話が入ります。スナップショットの一覧を取るにも、マウントして中身を読むにも、そのボリュームがロック解除されている必要があります。パスワードが分からない状態では、痕跡を拾う経路も実質的に閉じます。Time Machineのバックアップを暗号化している場合も同じで、Appleはバックアップのパスワードが後でファイルを復元する際に必要になると書いています。控えを暗号化するかどうかを決めるときは、鍵の保管も同じ判断の中に入れておくことになります。
暗号化の判断には、消去の側の事情も関わります。ディスクユーティリティの案内は、ソリッドステートドライブでは確実な消去のオプションを使えないため、使い始めるときにFileVault暗号化を有効にすることを検討するよう勧めています。譲渡や売却を前提にするなら、後から確実に消す手段が限られる分、最初から暗号化しておく選択に意味が出ます。
一覧と判断が別の窓に散る
ここまでの作業を並べると、実際に打つコマンドは数本しかないのに、確かめる場所が散っていることが分かります。ボリュームの構成は diskutil の出力で見て、控えの日時は tmutil の出力で見て、取り出したファイルの中身はフォルダの一覧で見て、どちらが新しいかは更新日時で比べます。
工程を数えると、手を動かす回数より窓を切り替える回数のほうが多くなります。出力に並んだUUIDや日時をもう一方の窓に持ち込むだけで数秒かかり、しかも打ち間違えると別のスナップショットを指します。AIに手順を確かめる場合は窓が1つ増えます。フォルダとターミナルとAIが同じ窓にある状態なら、一覧で選んだフォルダのパスをそのままコマンドへ渡し、返ってきた一覧を同じ画面で読み、取り出したファイルをその場で見比べられます。
ターミナルを内蔵したファイル管理で何がどこまでできるのかはできることに一覧があり、標準のFinderや他のアプリとの違いは他のファイル管理との比較に整理されています。出先から自宅のMacの状態を確かめる使い方はiPhone・iPadから続きをが該当し、費用の考え方は料金、導入前に迷いやすい点はよくある質問にまとめられています。
APFSの復元で結果を分けるのは、道具の性能より最初の5分の使い方です。書き込みを止めて、マウントした状態で一覧を取り、残っている時点を確かめる。この3つを先にやるかどうかで、参照で済む話と探索になる話が分かれます。
よくある質問
APFSのスナップショットは、いつ作られているのですか?
Time Machineがバックアップの対象に含めているAPFSボリュームについて、本体の中に作られます。tmutil localsnapshot で手動でも作れます。Time Machineを設定していない場合は作られないため、復元の見込みを判断するには tmutil listlocalsnapshotdates で残っている日時を先に確かめます。空き容量が少ないと古いものから間引かれます。
ボリューム全体を巻き戻すのと、ファイルを取り出すのはどちらがよいですか?
必要なのが数個のファイルなら取り出すほうが安全です。巻き戻しは片道の操作で、巻き戻した時点と現在の間にあるスナップショットも失われ、後で前に進めることはできません。スナップショットは読み出し専用でマウントできるため、そこから必要なファイルだけを別の場所へコピーする方法が影響が小さくなります。
スナップショットを消すとディスクの空きは増えますか?
増える場合があります。スナップショットは、現在は使われていない古いブロックを保持しているため、消せばその分が解放されます。ただし消すとその時点へ戻る道は失われます。diskutil apfs listSnapshots の出力では、コンテナのサイズ変更を妨げているスナップショットが示されるため、縮められない原因を探すときの手がかりになります。
スナップショットとTime Machineのバックアップは何が違いますか?
置き場所が違います。スナップショットは同じディスクの中にあり、Time Machineのバックアップは外付けやネットワーク上のディスクにあります。同じディスクの中にある控えは、ディスクそのものが読めなくなると一緒に失われます。操作のやり直しにはスナップショットが速く、機械の故障に備えるには外付けの控えが要ります。