🍎

macOSのTime Machineバックアップデータのディスク移行

に公開

はじめに

macOSではTime Machineと呼ばれるバックアップ機能があります。
私は外付けHDDにTime Machineのデータを作成しているのですが、より容量のあるHDDを購入したので、すでに作成されたバックアップデータを新しいHDDに移行した上でTime Machineとして利用したいと考えました。
最終的になんとかなったのですが、かなり苦戦したので忘備録として残しておきます。

流れとしてはddでディスクごとコピーして、新しいディスクのサイズをシステムに分からせるという2段階の作業が必要です。
前者はコマンド一発でしたが、後者は正しい方法がわからず、かなり手間取りました。

基本的にコピー元の情報はコピーするだけなので破損する危険性は低いですが、必要に応じてバックアップを作成してください。
基本的に操作はコマンドライン上で行います。

基本的な注意事項ですが、かなり時間がかかりますのでコマンドの実行中に誤ってケーブルを抜き差ししたりしないように注意して下さい。

ディスク階層に関する補足

なお、ディスクユーティリティやdiskutil listの表示から分かる通り、デバイスには主に次の階層があります。

  • 物理ディスク: /dev/diskX
  • APFSコンテナ(合成ディスク): /dev/diskY
  • APFSボリューム: /dev/diskYsZ

例として、物理ディスクが/dev/disk2、その上のAPFSコンテナが/dev/disk3、コンテナ内のボリュームが/dev/disk3s1のように表示されます(数値は環境で異なります)。
本記事中のコマンドは、対象レイヤー(物理ディスク / APFSコンテナ / APFSボリューム)に応じてデバイス指定が変わります。
必ずdiskutil listで自身の環境のデバイス名を確認して置き換えてください。

なおご覧の通り、フォーマットはAPFSを前提としており、他のフォーマットではどうなるのかは分からないためご了承ください。

筆者の状況

あまり詳しく書いてもしょうがないと思いますが、簡単にどのような環境で作業を行ったかを記載します。
Mac mini (M2, 2023)を使用しており、OSはmacOS 15.5です。
2TBの外付けHDDをTime Machine用に使用しており、これを5TBの外付けHDDに移行しました。
フォーマットは両者ともAPFS(大文字/小文字を区別、暗号化)です。

ターゲット名の具体例と対応図

先ほど説明したデバイス名の階層と説明に用いるターゲット名は以下の通りです。
具体的なターゲット名に出てくる番号は各自で異なりますので、後述するようにdiskutil listで確認してください。

ディスクのコピー

まずはコピー元のディスクとコピー先のディスクを確認します。

diskutil list

このコマンドで、ディスクの一覧が表示されます。
以下では例として、コピー元の物理ディスクを/dev/disk2、コピー先の物理ディスクを/dev/disk4とします(高速アクセス時はそれぞれ/dev/rdisk2/dev/rdisk4)。

ディスクユーティリティで確認してもよいです。

ディスクの暗号化の解除とアンマウント

暗号化の解除(オプション)

暗号化されている場合は、まずAPFSボリュームの暗号化を解除(アンロック)します。
以下のコマンドで暗号化を解除します(例ではボリュームを/dev/disk3s1としています)。

sudo diskutil apfs unlockVolume /dev/disk3s1

移行先に使うディスクも暗号化されている場合は、同様に解除します(例ではボリュームを/dev/disk5s1としています)。

アンマウント

続けて、コピー元・コピー先の物理ディスクをアンマウントします。

sudo diskutil unmountDisk /dev/disk2
sudo diskutil unmountDisk /dev/disk4

ディスクのコピーの実行

次に、コピー元のディスクをコピー先のディスクにddコマンドでコピーします。

sudo dd if=/dev/rdisk2 of=/dev/rdisk4 bs=1m status=progress
  • /dev/diskXの代わりに/dev/rdiskXを使用すると速くなるらしいです。
  • bs=1mは1MB単位で読み書きすることを指定しています。大きすぎても小さすぎてもダメらしく、これくらいが速いっぽいです。ハードごとに最適値が変わるらしいので、必要に応じて調整してください。
  • status=progressは進捗状況を表示します。

コピーが完了したら、ディスクユーティリティ(またはdiskutil list)でコピー先のディスクを確認してください。
コピー元のパーティションおよびAPFSコンテナ・ボリュームが作成されているはずです。
コンテナサイズはコピー元と同じになっているため、次にこれをコピー先の物理ディスクの容量いっぱいに拡大できるよう調整します。

ディスクサイズの変更

コピー先のディスクのサイズを変更するために、パーティションのリサイズを行います。
単純に考えるとコピー先のディスクサイズまで大きくすれば良いと思うかもしれませんが、GPTパーティションテーブルとAPFSコンテナのメタデータが旧ディスクの容量で定義されたままのため、単純に領域を拡大しようとしても失敗します。
そのため、まず元の占有領域より少し大きいサイズに変更します。
そうすると、パーティションテーブルとAPFSメタデータが更新されるので領域拡大が可能になります。

私の場合はこれでうまくいっただけで、これでも他の方はうまくいかないかもしれませんが、とりあえず体験談として残しておきます。

ディスクの推奨最小サイズを確認する

まず、以下のコマンドで移行先のAPFSコンテナ(合成ディスク)の推奨最小サイズを確認します。
これ以下のサイズにはリサイズできません[1]

diskutil apfs resizeContainer /dev/disk5 limits

Recommended minimumの項目が出るはずですので、容量値をメモします(ここでは例としてコンテナを/dev/disk5としています)。

リサイズの実行

続いて以下のコマンドで、確認した推奨最小サイズになるようにコンテナのリサイズを実行します。

sudo diskutil apfs resizeContainer /dev/disk5 1.9t

推奨最小値としてはおそらくTBでの切り上げ値が出ると思いますので、それを指定するか100GBの位で切り上げた値を指定するのが良いと思います。
以下の例では最小推奨値として、例えば1845GBが出たとして、1.9TBに切り上げた値でリサイズするというような状況です。

かなり時間がかかりますが、完了したらコンテナの上限サイズ定義が実ディスク容量に整合した状態になります。
この時点でディスクユーティリティで確認すると、APFSコンテナのPhysical Store(上限サイズ)の定義がコピー先の物理ディスクの実容量に更新され、旧ディスク容量を上限とする制約が解消されているはずです。

コンテナ容量の最大化

移行先の物理ディスクの容量が正しく認識されるようになったことが確認できたら、最後にコンテナを最大まで拡大します。

sudo diskutil apfs resizeContainer /dev/disk5 0

0を指定すると最大まで拡大されます。

ボリュームのマウント

全ての工程が終わったら、Time MachineのAPFSボリュームを再マウントします(例では/dev/disk5s1)。

sudo diskutil mount /dev/disk5s1

移行元も同様です(例では/dev/disk3s1)。

これで作業は完了です。

参考文献

https://qiita.com/hann-solo/items/2d34785f52aa1879e911

脚注
  1. 厳密には推奨最小サイズ以外に真の最小サイズがあるので、一応推奨最小サイズより小さくても真の最小サイズより大きければ実行は可能だとは思います ↩︎

GitHubで編集を提案

Discussion