OS Xのディスクが激しく論理故障→復旧のメモ

# ちょっと激しくディスクが壊れました
Time Machineを設定してなかったので復旧が少し面倒でも自業自得……とは思って作業していたのですが、どうもディスクの壊れ方が簡単ではなかったのでバックアップ云々とは別のところで苦労してしまいました。せっかくだから赤の扉を選んだ俺のメモを残すのです。ちなみにYosemite上での事件。

免責：一般ユーザ向けの記事ではありません。少なくともソフトウェア関連の開発・運用業務に携わっていて、細かいところは自分で調べられる人向けの記事です。記事内容に間違いがあり、なんらかの損失が発生したとしても責任は負いませんのであしからず。

# 状況
## 故障
ある日突然、Parallelsが仮想ディスクのイメージ書き込みに失敗した旨をダイアログ表示してきました。正確なメッセージはメモしていませんが、リトライして成功するまで再開できない類のモーダル通知です。この場では継続を諦めて仮想マシン強制終了を受け入れました。まぁ、VM内のファイルが多少消えたくらいでは動じないカッコいい俺、みたいなやつです。

## 副作用
この時点でホスト側で動作していたChromeのタブが全て真っ黒になりました。VM使ってるとたまにGLのコンテキストが飛ぶので「OS側かアプリ側かしらんけど、よくあるバグだよね」くらいの気持ちでChromeを再起動したのですが、再起動後に設定が読めずに正しく起動できない。設定を一時退避して、新規プロファイルで起動しても何もできない。マニア向けに言うとSeatbelt（OS XのSandbox機構）が正しく動作しておらず、レンダラープロセスがブロックされているような状態に見えます。

何を調べるにもウェブは必要なのでSafariを起動。しかし、こちらもキーチェーンのアクセスに失敗。"login"にアクセスできないとの事。ただエラーダイアログを出すものの、ウェブの閲覧くらいはできますので、とりあえず戦力になりそう。設定が消えてたかどうかは普段使っていないので不明。

## 軽めの復旧
認証絡みがおかしいので、ディスクのパーミッションを最初は疑いました。なので、定番、かどうかは知りませんが[Disk Utility.appからアクセス権の修復](https://support.apple.com/ja-jp/HT201560)を試みます。いくつか無駄にroot所有になってるファイルがあったり、微妙に壊れていたので修復。これで修復できればハッピーだったんですが、全然駄目。症状に変化はありません。

次に疑ったのはキーチェーン。何かルートの証明書が飛ぶとかしたかなぁ……と。でKeychain Access.appです。で、見たらキーチェーンのうち"login"の項目のアイコンが消えてます。中身も空っぽ。仕方ないのでメニューからKeychain First Aidを起動して検証・修復。まっさらな"login"項目が復活します。でも、やっぱりSafariやChromeはエラーを出し続ける。

となると、なんとなくディスク障害を疑いたくなる。SSDの寿命でread onlyとかだったら嫌だなぁ……でも言うほど使ってないよなぁ……と思いつつDisk Utility.appに戻ってボリュームの検証。がっつりエラーが出てました。起動ディスクの修復はこのままではできないのでCommand + Rでリカバリーモードで再起動してから修復しなければいけません。なので再起動して修復……しばらく待つと「このディスクは修復できません。できるだけ多くのファイルをバックアップし、ディスクを再フォーマットしてからバックアップしたファイルを復元してください。」うへー。

# 本気で復旧
## バックアップ
ファイルシステムの論理エラーだと思って適当にバックアップのメモを取っていた時の記事が[こちら](http://qiita.com/toyoshim/items/f3985fe66f561043f849)になります。

この時は書かなかったんですが、最初は

```shell-session
# tar -zc foo_dir | ssh $remote "cat > foo_dir.tar.gz"
```

でサーバのバックアップ用ディスクに吐き出せば良いかな、と思ってました。が、どうもOS X付属のBSD tarが8GB以上のファイルを正しく取り込めない。古いustarとか8GB制約があって、OS Xもデフォルトがustarフォーマットを採用してたので、それが原因かなぁ、と思ってたんですがpaxを指定しても駄目。あんまり深追いしても仕方がない（というか、試すのに時間かかる）ので、さっさと諦めてddにしました。まぁ、ディスクがどう壊れるかわからない時はddが一番「後からどうにかして復旧」に成功する可能性が高いですし。1TBの転送になるので、さっさとAmazonでUSB3対応の2TBディスクを買って直接コピー。[これ](http://www.amazon.co.jp/gp/product/B00D5OT630)なら作業後はTime Machineに再利用するにも良さそう。この時ちょうどタイムセール中（笑）

## ボリューム再初期化
バックアップが終わったので再初期化……と思ったら思ったら、ここでまさかのトラブル。リカバリーモードのDisk Utility.appからの論理フォーマットすら失敗する。Core Storageからボリュームが削除できない旨のエラー。ここに来て本気で物理故障を疑い始める。あるいはFusion Disk周りのトラブルか。

## diskutil is your friend
Fusion Diskがどんな仕組みなのか、この時点までさっぱり調べたことなかったんだけど、構成的にはLinuxのLVMとかと似たようなものらしい。複数の物理ディスクからなる論理ボリュームグループを作って、その中に論理ボリュームを作る。Disk Utility.appにはこの最上位層の論理ボリュームがディスクとして見えている模様。diskutil cs <command>で色々と制御できるが、まずはlistで内容表示。我が家のmac mini 2014ではこんな感じ。ここからは慎重にログを取っていたので具体的な内容になります。

```shell-session
-bash-3.2# diskutil cs list
CoreStorage logical volume groups (1 found)
|
+-- Logical Volume Group A86C4D9D-B6CB-4E53-95B0-7E7835F4D085
    =========================================================
    Name:         Macintosh HD
    Status:       Online
    Size:         1120333864960 B (1.1 TB)
    Free Space:   4995407872 B (5.0 GB)
    |
    +-< Physical Volume E35CFF16-CFA7-4E62-A2F5-148A12D36D46
    |   ----------------------------------------------------
    |   Index:    0
    |   Disk:     disk0s2
    |   Status:   Online
    |   Size:     120988852224 B (121.0 GB)
    |
    +-< Physical Volume 3A42E94E-A1E2-42D7-BBBF-68519624FB0F
    |   ----------------------------------------------------
    |   Index:    1
    |   Disk:     disk1s2
    |   Status:   Online
    |   Size:     999345012736 B (999.3 GB)
    |
    +-> Logical Volume Family 85180190-6DB8-4CDD-A378-56C2AC92FEB6
        ----------------------------------------------------------
        Encryption Status:       Unlocked
        Encryption Type:         None
        Conversion Status:       NoConversion
        Conversion Direction:    -none-
        Has Encrypted Extents:   No
        Fully Secure:            No
        Passphrase Required:     No
        |
        +-> Logical Volume 9F3DD608-9E29-449E-A974-17A9FC6BE56F
            ---------------------------------------------------
            Disk:                  disk3
            Status:                Online
            Size (Total):          1114478493696 B (1.1 TB)
            Conversion Progress:   -none-
            Revertible:            No
            LV Name:               Macintosh HD
            Volume Name:           Macintosh HD
            Content Hint:          Apple_HFS
```

SSDがdisk0、HDDがdisk1として見えていて、それぞれのslice 2を集めて論理ボリュームグループA86C4D9D-B6CB-4E53-95B0-7E7835F4D085を構成、その中に論理ボリューム9F3DD608-9E29-449E-A974-17A9FC6BE56Fが作られていて、これがdisk3としてDisk Utility.appなどに唯一の内蔵ディスクかのように見えている。diskutil list（第一引数のcs抜き）で通常のディスク情報を覗いてみるとこんな感じ。

```
-bash-3.2# diskutil list
/dev/disk0
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *121.3 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:          Apple_CoreStorage                         121.0 GB   disk0s2
   3:                 Apple_Boot Boot OS X               134.2 MB   disk0s3
/dev/disk1
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *1.0 TB     disk1
   1:                        EFI EFI                     209.7 MB   disk1s1
   2:          Apple_CoreStorage                         999.3 GB   disk1s2
   3:                 Apple_Boot Recovery HD             650.1 MB   disk1s3
/dev/disk2
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     Apple_partition_scheme                        *1.3 GB     disk2
   1:        Apple_partition_map                         30.7 KB    disk2s1
   2:                  Apple_HFS OS X Base System        1.3 GB     disk2s2
/dev/disk3
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:                  Apple_HFS Macintosh HD           *1.1 TB     disk3
                                 Logical Volume on disk0s2, disk1s2
                                 9F3DD608-9E29-449E-A974-17A9FC6BE56F
                                 Unencrypted
(snip)
```

disk2は再インストール用に挿してあるUSBメモリで、El Capitanのインストーラが入っています。これがない場合はディスク番号が1つずつずれるはず。

他のsliceはGPTやEFI向けのシステム情報やリカバリー用パーティションになっていて、普段は隠されているようです。リカバリーモードで起動すると他にもこの後ろに仮想ディスクがずらりと並びます。で、症状としてはこのdisk3が読めるけどボリューム削除すら受け付けない。

```shell-session
-bash-3.2# diskutil cs deleteVolume disk3
The Core Storage Logical Volume UUID is 9F3DD608-9E29-449E-A974-17A9FC6BE56F
Started CoreStorage operation on disk3 Macintosh HD
Unmounting disk3
Removing Logical Volume from Logical Volume Group
Error: -69779: Unable to delete the CoreStorage Logical Volume
```

なので、Core Storageのレイヤーで不整合が起きてるんじゃないか、と疑って1つ下のレイヤーに降りて作業してみます。それでダメならSSDかHDDの故障を疑う感じ。Fusion Drive再構成に失敗したらどうしよー、とか思いつつApple Store持ってく手間よりマシか、ってな気持ちで作業を進めます。

```shell-session
-bash-3.2# diskutil cs delete 0EE166A4-9FF1-48AB-B447-B088CC3B012A
The Core Storage Logical Volume Group UUID is 0EE166A4-9FF1-48AB-B447-B088CC3B012A
Started CoreStorage operation
Destroying Logical Volume Group
Erasing disk0s2
Initialized /dev/rdisk0s2 as a 113 GB case-insensitive HFS Plus volume with a 16384k journal
Mounting disk
Erasing disk1s2
Initialized /dev/rdisk1s2 as a 931 GB case-insensitive HFS Plus volume with a 81920k journal
Mounting disk
Finished CoreStorage operation
```

親切心から論理ボリュームグループを開放すると構成元の物理スライスをHFS+でフォーマットしてくれます。これ、同じ設定で再構成すればデータ消えずに済むよなー、みたいなLinux感覚で試しに開放すると撃沈するので注意。

続けて論理ボリュームグループの再作成。今まで論理ボリュームグループと論理ボリュームが同じ名前"Machintosh HD"だったんですが、紛らわしいのでこの際だから"Fusion Drive"に変更。

```shell-session
-bash-3.2# diskutil cs create "Fusion Drive" disk0s2 disk1s2
Started CoreStorage operation
Unmounting disk0s2
Touching partition type on disk0s2
Adding disk0s2 to Logical Volume Group
Unmounting disk1s2
Touching partition type on disk1s2
Adding disk1s2 to Logical Volume Group
Creating Core Storage Logical Volume Group
Switching disk0s2 to Core Storage
Switching disk1s2 to Core Storage
Waiting for Logical Volume Group to appear
Discovered new Logical Volume Group "8458CDB2-70DF-4F52-BECF-4DCFE3744A1D"
Core Storage LVG UUID: 8458CDB2-70DF-4F52-BECF-4DCFE3744A1D
Finished CoreStorage operation
```

で、作成した論理ボリュームグループ内に論理ボリュームを作ります。3つ目の引数になってるUUIDはもちろん先ほど作成した論理ボリュームグループの物。直前の出力からコピペしましょう。Case-insensitive、ジャーナリング有効なHFSを目一杯のサイズで作ります。名前は今まで通り"Macintosh HD"。

```shell-session
-bash-3.2# diskutil cs createVolume 8458CDB2-70DF-4F52-BECF-4DCFE3744A1D jhfs+ "Macintosh HD" 100%
The Core Storage Logical Volume Group UUID is 8458CDB2-70DF-4F52-BECF-4DCFE3744A1D
Started CoreStorage operation
Waiting for Logical Volume to appear
Formatting file system for Logical Volume
Initialized /dev/rdisk3 as a 1 TB case-insensitive HFS Plus volume with a 90112k journal
Mounting disk
Core Storage LV UUID: F2BB8A77-0B49-45A4-BABD-E818840B233E
Core Storage disk: disk3
Finished CoreStorage operation
```

これでdisk3が改めて出現。Disk Utility.appにも"Fusion Drive"以下に"Macintosh HD"があるように見えます。インストーラからも"Macintosh HD"が見えるようになります。disk0/1にはYosemiteのインストーラが入っているのですが、改めてEl Capitanにアップデートするのも面倒だったので、Laptopからインストール用のUSBメディアを作って、直接El Capitanをインストールしました。

以下、再インストール後のEl Capitanから確認したディスク情報。diskutilが新しくなってるので表示される情報に差があるかも。USBメモリを抜いたので今まで見えていたdisk3がdisk2になっています。

```shell-session
Darwin-15.0.0/x86_64toyoshim@mei[ttys000]
{20} ~
# diskutil cs list
CoreStorage logical volume groups (1 found)
|
+-- Logical Volume Group 8458CDB2-70DF-4F52-BECF-4DCFE3744A1D
    =========================================================
    Name:         Fusion Drive
    Status:       Online
    Size:         1119818080256 B (1.1 TB)
    Free Space:   114688 B (114.7 KB)
    |
    +-< Physical Volume F69ABCAB-CC4B-45A7-83E3-AE0CAFC4CB75
    |   ----------------------------------------------------
    |   Index:    0
    |   Disk:     disk0s2
    |   Status:   Online
    |   Size:     120988852224 B (121.0 GB)
    |
    +-< Physical Volume 0E2B20B0-0519-42C3-96A8-DEA051A1923C
    |   ----------------------------------------------------
    |   Index:    1
    |   Disk:     disk1s2
    |   Status:   Online
    |   Size:     998829228032 B (998.8 GB)
    |
    +-> Logical Volume Family 4862ABDD-D4BF-4248-B3D6-5FC937AA26A4
        ----------------------------------------------------------
        Encryption Type:         None
        |
        +-> Logical Volume F2BB8A77-0B49-45A4-BABD-E818840B233E
            ---------------------------------------------------
            Disk:                  disk2
            Status:                Online
            Size (Total):          1113962708992 B (1.1 TB)
            Revertible:            No
            LV Name:               Macintosh HD
            Volume Name:           Macintosh HD
            Content Hint:          Apple_HFS
            LVG Type:              Fusion, Sparse
```

## 復元
ddで作っておいたディスクイメージをマウントしつつ、仮想マシンのイメージを中心にcp -rpで復元。ディスクのマウントは以下のコマンドが一番楽。

```shell-session
# hdid -readonly disk3.img
```

その後、退避用のディスクを使ってTime Machineを設定。これを想定して最初の段階で退避用ディスクはGPTでパーティションテーブルを作り、Case-sensitive、ジャーナリングありのHFS+でボリュームを作ってあります。

Parallelsの仮想ディスクについてはParallels側でVMごとに設定があるのでそれを有効に。セキュリティの項目に「Time Machine: □ 仮想マシンを含まない」って設定がありますが、こっちは無視。含めた状態のままで「SmartGuard: □ 使用可能」をチェックします。「詳細...」から「□ Time Machine 用に最適化」にチェックを入れておけばTime Machineと同じ粒度で差分ファイルの作成・統合を行ってくれるという理解。これで巨大なディスクイメージのバックアップが発生する頻度を極力抑えてくれるはず。

# 最後に
VMの復元をしながら、合間にこの記事を書いています。すでにVMイメージの復元は終わり、Time Machineにも同期できています。数百GB単位の読み書きが発生しているはずですが、今のところ特に問題は起きていないようです。今後何か問題が発生したら追記します。