mac miniのGPUが壊れたので試したこと

　Mac mini(mid 2011)が電源を入れても起動プロセスの途中で再起動してしまい、起動しない状態になってしまいました。いろいろと悪戦苦闘して、なんとか立ち上がる状態にまでしたので、その顛末を何かの役に立つかもしれないので、書き残しておきます。
　注意として、行っていることは危険性もある方法ですので自己責任で行ってください。本記事に書かれている内容により問題、障害が発生しても責任は負えません。これを理解の上で実施するにしても、データの消失等が発生する可能性がありますので、必ずバックアップを取得するようにしてください。

# 症状
　Macを起動するとログイン画面が表示する前に再起動してしまい、結果として再起動を繰り返す状態に、そして、画面は青とピンクの縞模様が表示されています。Googleで"mac blue pink stripes"というキーワードで検索してみると、んー、似たような症状のMacがたくさん出てきます。中身を読んでみると、どうもGPUの故障でこのような症状が発生しているようです。
　自分のMac miniにはAMD Radeon HD 6630Mが搭載されているのですが、そのGPUが壊れたようです。mid 2011モデルなので寿命として納得はできるものの、GPUが壊れただけですぐに捨ててしまうのも勿体ない気がします。

# 外部GPUの無効化による起動
　いろいろと調べてみると、MacのGPUだけが壊れてしまいそれを何とかしようとしている人たちからの情報を見つけることができました。以下は、その中の一つで、外部GPU(Discreate GPU　= AMD/NVIDIA)を無効にして、内部GPU(Internal GPU = Intel GPU)で起動させています。この方法を試してみることにしました。
[Macbook Pro Discreate Graphics Card Issue Fix Updated](http://www.asyncro.com/2014/03/24/macbook-pro-discreate-graphics-card-issue-fix-updated/)

## シングルユーザモードでデータのバックアップ
　まず、Macのデータのバックアップを取得する必要がありますが、これがGPUが壊れると結構大変です。というのも、通常起動はできないのは当然ながら、リカバリモード(Command + R)でも起動することができないからです。いろいろと試してみて、シングルユーザモードでは起動できることがわかりました。シングルユーザモード(Command + S)で起動した後は以下の記事にある内容に従ってデータをUSBドライブへコピーします。
[How to access a USB drive while in Mac single-user mode](https://alvinalexander.com/mac-os-x/mac-osx-single-user-mode-usb-drive)

1. Command + Sを押しながらMacの電源を入れ、シングルユーザモードで起動します。
2. システムディスクを読み書き可能な状態でマウントします。<br>
`$ mount -uw /`
3. 現在接続されているディスクの一覧を確認します。<br>
`$ ls /dev/disk*`
4. バックアップ先となるUSBドライブを接続します。
5. ここでもう一度ディスクの一覧を確認します。<br>
`$ ls /dev/disk*`
6. 新たに追加されたディスク名が接続したUSBドライブとなります。通常は、/dev/disk1s1や/dev/disk1s2といった名前になります。
7. マウントポイントを作成します。<br>
`$ mkdir /Volumes/usb`
8. USBドライブをマウントします。<br>
`$ mount -t hfs /dev/disk1s2 /Volumes/usb`

　後は、cp/tar/rsync等を使って必要なファイルをシステムドライブからUSBドライブへコピーします。

## SIP(System Integrity Protection)の無効化
　外部GPUを無効化するには、OS内にある外部GPUのドライバファイルを移動させます。ただ、今のMacOSは、OSのファイルを書き換えることができないようにする仕組みとしてSIP(System Integrity Protection)が搭載されています。これを無効化しないことにはGPUのドライバファイルを移動させることができません。
　ここで、また問題となるのが、通常はSIPを無効化するにはリカバリモードに入り、Terminalを起動して無効化するのですが、GPUが壊れたMacではリカバリモードに入れません。シングルユーザモードではSIPを無効化することはできないので手がありません。
　Googleで検索してみると、隠しコマンド(?)として"Command + S + R"なる起動方法があり、これであればSIPを無効化できるとのことです。ということで、Command + S + Rを押しながらMacを起動し、特別なシングルユーザモードに入ります。そして、以下を入力します。
`$ csrutil disable`

## グラフィックスドライバの移動
　いよいよグラフィックスドライバを移動し、外部GPUを無効化します。
1. Command + Sを押しながらMacの電源を入れ、シングルユーザモードで起動します。
2. システムディスクを読み書き可能な状態でマウントします。
`$ mount -uw /`
3. グラフィックスドライバを移動する先となるフォルダを作成します。
`$ mkdir /gpudriver_backup`
4. AMDグラフィックスドライバをすべて移動します。
`$ sudo mv /System/Library/Extensions/AMD*.* /gpudriver_backup`
5. kextキャッシュを更新します。
`$ touch /System/Library/Extensions`
`$ kextcache -q -update-volume /`
6. 再起動すれば、内部Intel GPUで通常通り起動します。

　5のkextキャッシュの更新方法は、以下のNVIDIAドライバを無効化するスクリプトを参考にしました。
[purge-nvda](https://github.com/mayankk2308/purge-nvda)

　移動するドライバをAMDからNVIDIAに変えれば、NVIDIA GPUでも同じことが可能だと思います。
# 現状
　内部GPUで起動したMacですが、いくつか以前との違いがあります。まず、描画速度は低下します。どのくらい低下するかは、Intel GPUの性能しだいなのでMacにより異なると思いますが、私のMac miniでは非常に遅くなりました。もう一つは、デュアルディスプレイにはできなくなりました。どうもTunderbolt側の出力は外部GPUとしか接続していないようです。
　それ以外は問題ないかというと、残念ながら私の場合は、青とピンクの縞模様は消えませんでした。どうもGPUだけでなく、それ以外の箇所も壊れたようです。なので、通常起動はできますが、普通に使うのはちょっと難しいという状態です。なので、今は、バックアップサーバとして使っています。