Catalinaにアップグレード後の「ログイン画面常時フリーズ」「内臓カメラ認識しない」問題

## TL;DR;

```bash
# これを別のフォルダに移動させたら解決した
/System/Library/Extensions/Apple_iSight.kext
```
「ログイン画面常時フリーズ」「内臓カメラが認識しない」、ともに解決

```bash
# これもついでに移動しておくと良い
# 名前にThunderboltが入ったkextパッケージ
/System/Library/Extensions/****Thunderbolt**.kext
```

## CatalinaにアップグレードしたMacのスペック

```bash
# Yosemite（購入時） => High Sierra（前回） => Catalina（今回）
MacBook Pro (Retina, 13-inch, Mid 2014)
```

## Xcode11を使うためにCatalinaへ

Xcode11.4はCatalinaでないとダメなため

> Xcode 11.4 requires a Mac running macOS Catalina 10.15.2 or later.
https://developer.apple.com/documentation/xcode-release-notes/xcode-11_4-release-notes


## アップグレードインストールからログイン画面で常にフリーズするまで

- アップデート直後：普通に使えた
- 数日後：カメラがダメになった（slack, hangout, messenger, facetime, 全部ダメ）
    - 内臓カメラの原因はそのときは調べず（zoomは別macbookで、しのいでいた）
- 半月後：起動後ログイン画面で常時フリーズ状態
    - スリープから復帰せずにフリーズしていたので再起動後はずっとこの状態だった

## ハードウェア不具合か調査 => 違った

内臓カメラが認識しない原因もわかってなかったので、物理的にダメなのか調べることに

- MacBook Pro購入も視野にいれつつ調査
- SMCクリア => 効果なし
- macOS復元 => 起動できた
    - トラックパッドは動き、ターミナル起動で、キーボードは使えることが判明
    - ディスクユーティリティでFirst Aid => 不具合なし
- PRAMクリア => 効果なし
- セーフブート => 起動できた。繰り返しできる。

起動時に読み込まれるソフトウェアが原因

## ソフトウェアレベルの不具合として調査

- MacBook Pro購入するのは保留に
- セーフブートと通常起動の違いについて勉強しつつ進めることに

## カーネル機能拡張の読み込みで不具合が起こってるらしい。。。

2014-2015年のモデルのMacBookでCatalinaにすると、突如強制終了するという不具合に遭遇する人が結構いることがわかった

- "catalina random shutdown" で検索すると記事・フォーラム投稿が結構ヒットする

その情報を参考に不具合の原因となる `.kext`が読み込まれないように移動させた

```bash
# この辺の **Thunderbolt**なやつを一掃した
/System/Library/Extensions/AppleThunderboltNHI.kext
/System/Library/Extensions/AppleThunderboltDPAdapters.kext
/System/Library/Extensions/AppleThunderboltEDMService.kext
/System/Library/Extensions/AppleThunderboltIP.kext
/System/Library/Extensions/AppleThunderboltNHI.kext
/System/Library/Extensions/AppleThunderboltPCIAdapters.kext
/System/Library/Extensions/AppleThunderboltUTDM.kext
/System/Library/Extensions/IOThunderboltFamily.kext
```

```bash
/System/Library/Extensions/IOUserEthernet.kext
/System/Library/Extensions/AppleFWAudio.kext
```
https://apple.stackexchange.com/a/295525



### `sudo　mv`では動かせない

- `/System/Library`や`/Library/Extensions` のファイル・ディレクトリは制限がかけられている
    - [Mac のシステム整合性保護について \- Apple サポート](https://support.apple.com/ja-jp/HT204899)
- 自分は [macOS復元](https://support.apple.com/ja-jp/HT204904)（command+r+powerキー）で起動させて、terminal開いて移動させた

### ごくわずかに効果あり

- ログイン画面表示後10-20秒くらいはキーボード、トラックパッドが動く状態に
    - 動いてる隙にログインすると数分は使える状態になった
  
- これで解決にはならないので、起動時に読み込まれる`.kext` を調べることに
- 動作に不要な`.kext`を全て消す（動かす）ことができれば、解決する目処がたった

## `.kext` ファイルが配置される場所は２つ

```
/Library/Extensions
/System/Library/Extensions/
```
Catalinaをクリーンインストールした場合、`/Library/Extensions`以下は

```bash
ACS6x.kext
ArcMSR.kext
ATTOCelerityFC8.kext
ATTOExpressSASHBA2.kext
ATTOExpressSASRAID2.kext
CalDigitHDProDrv.kext
HighPointIOP.kext
HighPointRR.kext
PromiseSTEX.kext
SoftRAID.kext
```
となることがわかり（ネットで晒している方がいた）、自分の環境と全く一緒だったので、`/System/Library/Extensions/` を調査対象に絞り込んだ

### セーフブート時に読み込まれるカーネル機能拡張の一覧を取得し、比較していった

```bash
# セーフブート時に読み込まれてる.kextの一覧を取得
kextfind -loaded
# 通常起動時の一覧はわからないので、読み込まれうるkextの一覧をディレクトリから取得
ls -la /System/Library/Extensions/
```

この２つを比較して、通常起動でのみ読み込まれている`.kext`のリストを作成し、１つ１つ消せそうか検索して調べた

```bash
# kextfind -loaded　出力例
/System/Library/Extensions/IOSkywalkFamily.kext
/System/Library/Extensions/IOAcceleratorFamily2.kext
/System/Library/Extensions/AppleAPIC.kext
/System/Library/Extensions/KextAudit.kext
/System/Library/Extensions/AppleImage4.kext
/System/Library/Extensions/AppleCredentialManager.kext
/System/Library/Extensions/ALF.kext
/System/Library/Extensions/AppleStorageDrivers.kext/Contents/PlugIns/AppleUSBStorageCoexistentDriver.kext
/System/Library/Extensions/AppleStorageDrivers.kext/Contents/PlugIns/AppleUSBCardReader.kext
/System/Library/Extensions/AppleStorageDrivers.kext/Contents/PlugIns/AppleUSBTDM.kext
/System/Library/Extensions/IOHDIXController.kext
/System/Library/Extensions/TMSafetyNet.kext
/System/Library/Extensions/AppleAHCIPort.kext
/System/Library/Extensions/IOUSBMassStorageDriver.kext
/System/Library/Extensions/IOSerialFamily.kext
/System/Library/Extensions/CoreTrust.kext
/System/Library/Extensions/AppleBacklight.kext
/System/Library/Extensions/Dont Steal Mac OS X.kext
/System/Library/Extensions/HFS.kext
/System/Library/Extensions/AppleHPET.kext
/System/Library/Extensions/IOSMBusFamily.kext
/System/Library/Extensions/AppleMCCSControl.kext
/System/Library/Extensions/IOReportFamily.kext
/System/Library/Extensions/IOBluetoothFamily.kext
/System/Library/Extensions/IOBluetoothFamily.kext/Contents/PlugIns/IOBluetoothHostControllerUSBTransport.kext
/System/Library/Extensions/IOBluetoothFamily.kext/Contents/PlugIns/BroadcomBluetoothHostControllerUSBTransport.kext
/System/Library/Extensions/IOBluetoothFamily.kext/Contents/PlugIns/IOBluetoothHostControllerTransport.kext
/System/Library/Extensions/IOBluetoothFamily.kext/Contents/PlugIns/IOBluetoothUSBDFU.kext
/System/Library/Extensions/IOBluetoothFamily.kext/Contents/PlugIns/IOBluetoothPacketLogger.kext
/System/Library/Extensions/IOSurface.kext
/System/Library/Extensions/AppleSMC.kext
/System/Library/Extensions/autofs.kext
/System/Library/Extensions/AppleMobileFileIntegrity.kext
/System/Library/Extensions/AppleMatch.kext
/System/Library/Extensions/System.kext/PlugIns/IOKit.kext
/System/Library/Extensions/System.kext/PlugIns/Kasan.kext
/System/Library/Extensions/System.kext/PlugIns/BSDKernel.kext
/System/Library/Extensions/System.kext/PlugIns/Libkern.kext
/System/Library/Extensions/System.kext/PlugIns/Mach.kext
/System/Library/Extensions/System.kext/PlugIns/MACFramework.kext
/System/Library/Extensions/System.kext/PlugIns/Unsupported.kext
/System/Library/Extensions/System.kext/PlugIns/Private.kext
/System/Library/Extensions/AppleGraphicsPowerManagement.kext
/System/Library/Extensions/AppleFDEKeyStore.kext
/System/Library/Extensions/AppleBusPowerController.kext
/System/Library/Extensions/AppleSSE.kext
/System/Library/Extensions/AppleKeyStore.kext
/System/Library/Extensions/AppleSEPManager.kext
/System/Library/Extensions/AppleIntelLpssGspi.kext
/System/Library/Extensions/AppleXsanScheme.kext
/System/Library/Extensions/AppleSMBIOS.kext
/System/Library/Extensions/AppleSMBusPCI.kext
/System/Library/Extensions/AppleFSCompressionTypeDataless.kext
/System/Library/Extensions/watchdog.kext
/System/Library/Extensions/AppleUSBMultitouch.kext
/System/Library/Extensions/AppleUSBNetworking.kext
/System/Library/Extensions/IONetworkingFamily.kext
/System/Library/Extensions/IONetworkingFamily.kext/Contents/PlugIns/mDNSOffloadUserClient.kext
/System/Library/Extensions/IOSlaveProcessor.kext
/System/Library/Extensions/AppleUSBTopCase.kext/Contents/PlugIns/AppleUSBTCKeyEventDriver.kext
/System/Library/Extensions/AppleUSBTopCase.kext/Contents/PlugIns/AppleUSBTCKeyboard.kext
/System/Library/Extensions/AppleUSBTopCase.kext/Contents/PlugIns/AppleUSBTCButtons.kext
/System/Library/Extensions/AppleBacklightExpert.kext
/System/Library/Extensions/IONDRVSupport.kext
/System/Library/Extensions/IOAHCIFamily.kext
/System/Library/Extensions/IOAHCIFamily.kext/Contents/PlugIns/IOAHCIBlockStorage.kext
/System/Library/Extensions/IOSCSIArchitectureModelFamily.kext
/System/Library/Extensions/IOSCSIArchitectureModelFamily.kext/Contents/PlugIns/SCSITaskUserClient.kext
/System/Library/Extensions/IOSCSIArchitectureModelFamily.kext/Contents/PlugIns/IOSCSIBlockCommandsDevice.kext
/System/Library/Extensions/IOPlatformPluginFamily.kext
/System/Library/Extensions/IOPlatformPluginFamily.kext/Contents/PlugIns/X86PlatformPlugin.kext
/System/Library/Extensions/IOPlatformPluginFamily.kext/Contents/PlugIns/X86PlatformShim.kext
/System/Library/Extensions/IOPlatformPluginFamily.kext/Contents/PlugIns/IOPlatformPluginLegacy.kext
/System/Library/Extensions/IOPlatformPluginFamily.kext/Contents/PlugIns/ACPI_SMC_PlatformPlugin.kext
/System/Library/Extensions/IOStorageFamily.kext
/System/Library/Extensions/AppleLPC.kext
/System/Library/Extensions/IOHIDFamily.kext
/System/Library/Extensions/AppleACPIPlatform.kext
/System/Library/Extensions/AppleACPIPlatform.kext/Contents/PlugIns/AppleACPIButtons.kext
/System/Library/Extensions/AppleACPIPlatform.kext/Contents/PlugIns/AppleACPIEC.kext
/System/Library/Extensions/AppleSMBusController.kext
/System/Library/Extensions/AppleSmartBatteryManager.kext
/System/Library/Extensions/corecapture.kext
/System/Library/Extensions/pthread.kext
/System/Library/Extensions/IOUSBFamily.kext
/System/Library/Extensions/CoreAnalyticsFamily.kext
/System/Library/Extensions/AppleUSBCommon.kext
/System/Library/Extensions/KernelRelayHost.kext
/System/Library/Extensions/AppleRTC.kext
/System/Library/Extensions/IOPCIFamily.kext
/System/Library/Extensions/BootCache.kext
/System/Library/Extensions/IO80211Family.kext
/System/Library/Extensions/IO80211Family.kext/Contents/PlugIns/AirPortBrcmNIC.kext
/System/Library/Extensions/Libm.kext
/System/Library/Extensions/apfs.kext
/System/Library/Extensions/IOACPIFamily.kext
/System/Library/Extensions/Quarantine.kext
/System/Library/Extensions/AppleGraphicsControl.kext
/System/Library/Extensions/AppleGraphicsControl.kext/Contents/PlugIns/AppleGPUWrangler.kext
/System/Library/Extensions/AppleGraphicsControl.kext/Contents/PlugIns/AGDCBacklightControl.kext
/System/Library/Extensions/AppleGraphicsControl.kext/Contents/PlugIns/AppleGraphicsDeviceControl.kext
/System/Library/Extensions/AppleGraphicsControl.kext/Contents/PlugIns/AppleGraphicsDevicePolicy.kext
/System/Library/Extensions/AppleEffaceableStorage.kext
/System/Library/Extensions/IOUSBHostFamily.kext
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBXHCIPCI.kext
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBHostPacketFilter.kext
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/IOUSBHostHIDDevice.kext
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBHostMergeProperties.kext
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBHostCompositeDevice.kext
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBHub.kext
/System/Library/Extensions/IOUSBHostFamily.kext/Contents/PlugIns/AppleUSBXHCI.kext
/System/Library/Extensions/AppleUSBCDC.kext
/System/Library/Extensions/AppleFSCompressionTypeZlib.kext
/System/Library/Extensions/IOUSBMassStorageClass.kext
/System/Library/Extensions/triggers.kext
/System/Library/Extensions/IOGraphicsFamily.kext
/System/Library/Extensions/Sandbox.kext
/System/Library/Extensions/AppleIntelFramebufferAzul.kext
/System/Library/Extensions/corecrypto.kext
/System/Library/Extensions/HFSEncodings.kext
/System/Library/Extensions/AppleEFIRuntime.kext
/System/Library/Extensions/AppleEFIRuntime.kext/Contents/PlugIns/AppleEFINVRAM.kext
/System/Library/Extensions/EndpointSecurity.kext
/System/Library/Extensions/AppleSystemPolicy.kext
/System/Library/Extensions/IOTimeSyncFamily.kext
/System/Library/Extensions/AppleFileSystemDriver.kext
```

## # `Apple_iSight.kext` を消すと不具合は直るというフォーラムの投稿をみつけた

2017年のCatalinaが登場する２年以上前の投稿だが、内臓カメラが認識しない不具合への対応策として投稿されていた

>I always just deleted “Apple\_iSight\.kext” and that worked for me\. I am contemplating just unplugging the cable from the logic board though\. It looks pretty easy\.
https://osxdaily.com/2017/03/01/disable-mac-camera-completely/

内臓カメラが認識しない不具合は自分も同じで、情報は３年以上前のものだが、消しても問題ない`.kext` だと判断して、読み込まれないようにした

その結果解決した

### 

- https://gist.github.com/knightsc/6c188ad9c065d7c134de88564974952c

## （解決したので実施しなかったが）実施を予定していたこと

Xcode11利用は必須だったのでダウングレードは選択肢になかった

- Catalina クリーンインストール
    - データ吸い出しが面倒（セーフブートではUSB接続されたメディア、SDが認識しないため）ので先送りにしていた
- Big Surへのアップデート
    - カーネル機能拡張という仕組みはCatalinaでdeprecated宣言され、DriverKitという新しい仕組みに移行するため、今回の不具合の原因である `.kext`読み込み自体がBig Surではなくなるため