hatena.dummy@gmail.com

備忘録:MacOS(Big Sur)環境で、KEXTの手動インストール。

普段使っていたアプリケーションを一度アンインストールしてから再インストールしたら、

アプリケーションが利用するカーネル機能拡張(KEXT)が正しくインストールされず、

まともに動作しなくなってしまった。

原因:

-El Capitanで追加された、システム整合性保護 (System Integrity Protection, SIP) が、サードパーティのドライバによってクリティカルな処理を行う事を制限する。

-Catalina以降、システム領域保護のためにMacintosh HD – DataとMacintosh HDが分離され、KEXTを格納するシステム領域(/System/Libraries/Extensions/)はread-onlyになった。

-Big SurでKEXTが原則禁止され、Big Sur環境でKEXTを無理やりシステム領域にコピーしても、動作せずにブロックされてしまうようになった。

 

 Big Sur環境では基本的に不要なKEXTは消しましょうね。で、KEXTを利用しているアプリケーションは、KEXTを使わずSystem Extentionで機能を実現できるように、アプリベンダーは努力してね。ということっぽい。

 KEXTは古い実装法でセキュリティにも問題があることからこうなっているわけで、しょうが無い。

じゃあ諦めましょうか。

 

 とも言いたくないので、解決した。

 

流れ:

-リカバリモードでブートする。

起動時にCommand-Rを押し続ければリカバリーモードで起動する。

できない場合は次のコマンドを、ターミナルで実行する。

sudo nvram internet-recovery-mode=RecoveryModeDisk
sudo reboot

-SIPを停止する。*1リカバリモードでブートして、ターミナルを起動し、次のコマンドを実行。

csrutil disable

-再起動。Big Surに入る。

-KEXTをシステム領域にコピーし、所有権を変更する。

リカバリモードでのターミナルコマンド直打ちがだるいので、GUIのツールを使った。

github.com

-KEXTの所有権を変更する。*2

chmod 755 /System/Libraries/Extentions/foobar.kext*3

chown root:wheel /System/Libraries/Extentions/foobar.kext

-KEXTのキャッシュを消す。*4

kextcache -system-prelinked-kernel

 -KEXTをロード。*5

sudo kextload /System/Libraries/Extentions/foobar.kext

-正しくロードできたか調べる。*6

sudo kextstat

-正しくロードできたら、もう一度リカバリモードでブートし直す。

sudo nvram internet-recovery-mode=RecoveryModeDisk
sudo reboot

-SIPを再開する。

ターミナルを起動し、次のコマンドを実行。

csrutil enable

 -再起動。Big Surに入る。

-KEXTがロードできているか調べる。

sudo kextstat

-KEXTを利用するアプリケーションが、正しく使用できるか調べる。

 

 これでとりあえずKEXTを手動でインストールすることができた。

わすれてしまう前に記録。

*1:直後に再起動し、もう一度リカバリモードに入ってからcpを使ってKEXTを直接システム領域にコピーすることもできるのだけど、リカバリモードのターミナルはパス補完がきかない上に、パスも/Volumesから始まるベタ打ちになるので、面倒くさいことこの上ないからやめた。実際にどうやってコピーしたかは、この後説明。

*2:ターミナルで実行

*3:foobar.kextは実際にコピーしたKEXTファイル名

*4:ターミナルで実行

*5:ターミナルで実行

*6:ターミナルで実行