後で追記しますが、とりあえず忘備録として書いておく。
背景
今までTimeMachineによるバックアップに使っていたHDDの挙動が怪しくなってきたので、新しいSSDにTimeMachineバックアップデータを移行したかった。が、やたら難しくて1ヶ月ほどハマった。
TL;DR
ファイルベースでのコピーはハマる。ddコマンドとディスクユーティリティを使って、ブロックレベルでHDDをクローンすべき
準備
環境はmacOS Mojave(10.14.5)で、移行元のドライブはUSB接続で外付けの2TB HDD、移行先の新しいドライブは1.92TBのUSB-C接続のSSDです。HDDは2TBの容量をもつ単一のパーティションで運用しており、900GBほどがバックアップデータで消費され、1TB弱の空き領域があるという状況。ファイル数は正確には数えてないですが1000万個ぐらいのオーダーのはず。
後で述べますが、空き領域を含めてドライブ(正確にはパーティション)をブロック単位でコピーするので、TimeMachineのデータがあるパーティションのサイズよりも移行先パーティションの容量が小さい場合、TimeMachineに使っているパーティションを分割して移行先に収める必要があります。
macのディスクユーティリティを開き、TimeMachineバックアップに使用しているドライブを右クリック選択、上部メニューから「パーティション作成」をクリックして、TimeMachineデータのサイズに合わせた適当な新規パーティションを作成します。ここで作ったパーティションは、データの移行が終わったらディスクユーティリティを使って消せます。
例;2TBのHDDのうちTimeMachineが500GBの容量を消費していた場合、TimeMachineパーティションとして510GBぐらいの容量を残す形で、1490GBの新規パーティションを作成する。こうすれば2TB未満のサイズのHDDやSSDにもデータをコピーできる。
方法
- diskutilコマンドでパーティションを見つける
- ddコマンドでTimeMachineバックアップドライブのディスクイメージを作成する。
容量が異なるドライブ間での移行の場合、ディスクユーティリティで書き戻さないとパーティションテーブルが壊れて厄介なことになるので、面倒でも一度ディスクイメージとして書き出す。
if=がソース、of=が出力先。例としては次の通り。
sudo dd if=/dev/rdisk3s2 of=/Volumes/NEW_SSD/backup_image.img bs=32m
disk名の先頭にrをつけると、シーケンシャルアクセスになる代わりにキャッシュを介さなくなるので、ddによるコピーのようなシーケンシャルなアクセスの場合には高速化できる。bs(バッファサイズ)は適当に32MBにしました。
ここでstatus=progressオプションはサポートされていないので、つけるとエラーが出る。そこでddの進捗を見るには、ddが走っているターミナル上でcontrol + Tキーを押す。ddの進捗確認によく使われるkillallコマンドを使う方法だと、普通にddプロセスがkillされるので注意 - ディスクユーティリティを使って、作成したディスクイメージを新しいドライブに書き戻す
もしも、ディスクイメージが検証できませんでしたなどと怒られた場合は、作成したディスクイメージを普通にfinderから一度開いて、その状態で再トライするとできました(詳細不明)
うまくいかなかった方法
基本的にファイルレベルのコピーは時間がかかりすぎる && macのシステムファイル周りのセキュリティがガチガチなためにコピーできず、ハマります(体験談)
- finderでコピー
- 公式には推奨されている
- 時間がかかりすぎてダメ(一晩立ってもコピーが進まない)
- セキュリティが厳しい一部のファイル(システムファイルなど)がコピーできない(うろ覚え)
- cpコマンドでコピー
- ファイルが多すぎて時間がかかりすぎる
- ファイルを管理するハッシュテーブルを時々リサイズしているためにやたら遅いという話
- sudoつけていてもシステムファイルをコピーできない(Operation deniedなどと言われるはず)
- ファイルが多すぎて時間がかかりすぎる
- rsyncコマンドでコピー
- ファイルが多いためメモリ消費が多すぎる。16GBのRAMではとても無理
- cpと同様に権限の問題
- ディスクユーティリティでクローン
- 謎のエラーで実行できず。
- 開始直後、「元のマウント状態を復元中に問題-69842が起きました。」と怒られる
- 謎のエラーで実行できず。
- ddコマンドでディスクイメージを作成後、普通にddを使って書き戻す
- 書き込み自体は完了するが、パーティションテーブルが壊れて、macから破損ディスクと認識される