MacOSをアップデートしようとしたら起動しなくなった
OSを Catalina にアップデートしようとしたところ、見事になにかにハマりMacが起動しなくなった。暫定回復できた思い出を。
回想
敗因はOSアップデートをする直前にバックアップを取っていなかったこと、これに尽きる。最後にバックアップを取ったのは1週間前。TimeMachineのログをみると去年の同じ時期にも取っていた。大型連休中になんとなく取っていることに気づく。
macOS は High Sierraを使用。MacBook Proの 2012年モデルでHDDを使っていた。かなり前のモデルで自分でも驚き。買った当時は動画エンコードが爆速になって感激していたなー。新しいの買おうかな。
事象:インストール後起動しなくなった
OSのダウンロードが終わり、インストーラーを起動していくのは確認した。そしてお決まりの再起動。ここまで何も疑っていなかった。途中でダウンロードをやめたのが原因なのかもしれないが今となってはわかない。
「もうそろそろインストール終わったかな?」と思ったら起動ディスクを選択せよ、と画面に表示されている。
しかし、なぜか選択できる起動ディスクがない。
なぜ?何度か再起動しても同じ。困った。
1次対応:とりあえずディスクユーティリティ起動だ
ディスクドライブがついているMacだし、手元にOSのディスクもある。Snow Leopardだけど。CDで起動させる(「C」を起動時に押しっぱなし)
メニューからディスクユーティリティを開いてみると、メインのディスクが存在することはわかった。でもなぜかマウントされていない。
とりあえず修復かなと思って「First Aid」をクリックするとエラーで終了する。
ディスクユーティリティのFistAid
ファイルシステムを修復中です。
ボリュームはすでにマウント解除されています。
fsck_hfs -fy -x /dev/rdisk1s2を実行中
ジャーナリングが有効なHFS+ボリュームを確認中です。
エクステントエントリが正しくありません
ボリューム“ ”の検証を完了できませんでした。
ファイルシステム検査の終了コードは8です。
マウント解除済みとして検出されたときの状態を復元中。
ファイルシステムを検証または修復できませんでした。
操作が失敗しました…
「エクステントエントリが正しくありません」直感的にこのメッセージからめんどくさい感じを受ける。
ただこれ以上ここでどうにか修復はできそうにない。コマンドでやったほうが良さそう。
2次対応:とりあえずOS起動したい
OSを起動する方法として、セーフブートという機能があるらしい。Windowsでもそんなのがあった気がする。ただTimeMachineで使っているディスクでも起動できることに気がついたので、そっちを採用する。
TimeMachineで起動してディスクユーティリティで 起動ディスクをマウントしてみるが失敗。First Aid でチェックディスクさせてみても同じく。
とりあえず1週間前のデータはTimeMachineにあるので最悪それでよい。底からの作業量は大したことないし欲しいファイルは限られている。
外部ディスクに起動ディスクのコピーをさせることにした。
バックアップから復元
リカバリーモードで再起動(コマンド+R 起動)
このモードだとディスクユーティリティとTimeMachineの機能が使える。
ディスクユーティリティの復元の機能を使って起動ディスクの内容をまるごと外付けHDDをにコピー。4時間ぐらいかかったか。その後、起動ディスクをフォーマット。ここではエラーは起きない。
TimeMachineを使って起動ディスクに1週間前の内容を流し込む。この作業も結構時間かかる。6時間ぐらいか。
流し込んだら特に問題もなく起動した。ラッキー。
じゃあ外付けHDDに移したデータを読めるかなと思ったらマウントできない。コピーする前は普通にマウントできていたのに。
ここで、ディスクは物理障害ではなく論理障害なのでは?という仮説を持つ。論理的に壊れているだけなら必要なファイルを復元できそうだ。
ディスク修復にチャレンジする
とりあえずコマンドで修復に再チャレンジ。このあたりを参考にhttps://qiita.com/earth55/items/88015f3499411e3eab51
まずはディスクを特定
$ diskutil list
/dev/disk0 (internal, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *500.1 GB disk0
1: EFI EFI 209.7 MB disk0s1
2: Apple_HFS Macintosh HD 397.2 GB disk0s2
3: Apple_Boot Recovery HD 650.0 MB disk0s3
4: Apple_HFS BootCamp 102.0 GB disk0s4
/dev/disk1 (external, physical):
#: TYPE NAME SIZE IDENTIFIER
0: GUID_partition_scheme *2.0 TB disk1
1: EFI EFI 209.7 MB disk1s1
2: Apple_HFS Macintosh HD 999.5 GB disk1s2
3: Apple_Boot Recovery HD 650.0 MB disk1s3
外付けのやつなので disk1s2 である。コマンドでマウントしてみる。
$ sudo diskutil mount readOnly -mountPoint /Volumes/tmpmount disk1s2
Volume on disk1s2 failed to mount
If the volume is damaged, try the "readOnly" option
$ sudo mount -t hfs -r /dev/disk1s2 /Volumes/tmpmount
mount_hfs: error on mount(): error = -1.
mount_hfs: Invalid argument
マウント失敗。試しに修復にもチャレンジ
$ diskutil repairVolume /dev/disk1s2
Started file system repair on disk1s2 Macintosh HD
Repairing file system
Volume is already unmounted
Performing fsck_hfs -fy -x /dev/rdisk1s2
Checking Journaled HFS Plus volume
Invalid extent entry
The volume could not be verified completely
File system check exit code is 8
Restoring the original state found as unmounted
Error: -69845: File system verify or repair failed
Underlying error: 8: Exec format error
$ sudo fsck_hfs -drfy /dev/disk1s2
Password:
journal_replay(/dev/disk1s2) returned 0
** /dev/rdisk1s2
Using cacheBlockSize=32K cacheTotalBlock=65536 cacheSize=2097152K.
Executing fsck_hfs (version hfs-407.50.6).
** Checking Journaled HFS Plus volume.
Invalid extent entry
(4, 0)
CheckExtRecord: id=4 1:(1802498,0), (blockCount == 0)
** The volume could not be verified completely.
volume check failed with error 7
volume type is pure HFS+
primary MDB is at block 0 0x00
alternate MDB is at block 0 0x00
primary VHB is at block 2 0x02
alternate VHB is at block 1952117606 0x745af366
sector size = 512 0x200
VolumeObject flags = 0x07
total sectors for volume = 1952117608 0x745af368
total sectors for embedded volume = 0 0x00
CheckHFS returned -1317, fsmodified = 0
結果はFirstAidと同じだ。
このあたりの記事でちょっと希望があるので地味だけど他にも調べてみてはチャレンジした。
最終的にはこの記事を参考。http://borg4.vdomains.jp/~goro/diary/2012/1930
$ sudo diskutil disableJournal /dev/disk1s2
An error occurred journaling the file system: Couldn't mount disk (-69842)
$ sudo diskutil disableJournal force /dev/disk1s2
An error occurred journaling the file system: The underlying task reported failure on exit (-69860)
エラーがでて焦るけど、とりあえず出るらしいということで続ける。readonlyでマウントすればいいらしい。
$ sudo mount -r -t hfs /dev/disk1s2 /tmp/tmpdisk
エラーが出ない!Finderのメニューをみるとたしかにマウントされている!ちゃんともともとのディレクトリ構成でマウントされている。解決
そのあとfsck_hfs をやったり readwriteでマウントしようとしたりとかしたけど、今までと同じでだめだった。
思い出せる更新ファイルだけコピーして、外付けHDDを初期化。その後はちゃんとマウントできるので、やはり論理的に何かが壊れていたのだろう。
結論
OSのアップデート前にはバックアップを取る
物理障害ではなさそなら回復の見込みあり
途中有料ソフトのお試し版を入れてみたけど復元は有料だったので諦めた。
感想
MacBookAir で 512GBのメモリ16GB でCPU上位に変えるとMacbookProと2万ぐらいしか変わらなくてお得感がなかった