kextはどこに置けば良いのか

今までkextファイルはEFI/Clover/kexts/Otherに置くと良いと紹介してきました。でも以下の投稿によるとそれは「全く正しくない」のだそうです。

今回はHackintoshに必要なカーネル拡張ファイル(kextファイル)を置く場所に関する議論を紹介します。(コメントで紹介いただいた情報です。ありがとうございます。)

kextを/L/Eに置く利点と方法

上記の投稿にはkextを/L/Eに置くべきである理由と、推奨するkextの置き方が書かれています。抄訳します:


macOSの流儀である

FakeSMCなどを含むすべての3rdパーティkextは/Library/Extensions (以下/L/E) に置くべきです。多くの人が「これらのkextをEFI/Clover/kexts/Other (以下ESP) に置き、config.plistでInject KextsをYESにすることが、メンテナンスフリーであり、よりネイティブなmacOSインストール方法だ」という印象を持っているように思えます。しかしこの考えは完全に間違っています。

この俗説とは逆に、Cloverに3rdパーティkextをインジェクトしてもらうことは、クリーンなインストールにはならないどころか、その逆です。インジェクトされたkextはmacOSの保護メモリー空間の外側で機能します。大量のkextをインジェクトすると、システムが不安定になる可能性があります。Cloverによってインジェクトされる多くの3rdパーティkextはただいく動きません。インジェクトされたkextはカーネルキャッシュに含まれず、その結果macOSが行うエラー検査の対象外になります。kextを/L/Eに置くことは、アップルが推奨いています。何らかの周辺機器を買ってドライバをインストールする時、kextは/L/Eにインストールされます。Hackintoshのkextも同じです。

Cloverのkext読み込み機能の目的

/L/Eに追加のkextを置くのが正しいやり方なのだとしたら、なぜCloverはESPに置いたkextをインジェクトする機能を持っているのでしょうか?それは、次のような形式のmacOS、つまり

  • MacOS Installer
  • MacOS Updater
  • MacOS Recovery

をブートする場合に、最小限必要なkextを読み込むために必要だからです。これらはどれもフルサイズのmacOSではないため、通常の方法では必須kextを読み込めないので、Cloverがそれを行う必要があるのです。ほとんどの場合、これらのパッケージを機能させるためには、通常はEFI/Clover/kexts/Other に FakeSMC があれば良いです。場合によっては3rdパーティのストレージ制御用ドライバ、NASで動かすTimeMachineバックアップへのアクセス用ドライバ、ノートPCのマウス用ドライバなどが必要なこともあります。このような、本当に必要なkextだけをEFI/Clover/kexts/Otherに入れます。

CloverのDetect設定

Hackintoshに必要なkext類を、

  • 通常のmacOSブート時は、/L/Eにkextを置いてmacOSでロードしつつ、
  • Installer/Updater/Recoveryの時だけESPに置いてCloverでインジェクトする

ように設定するには以下のようにします。

Cloverのconfig.plistのSystem Parameters セクションでは、Inject Kextsの設定ができます。ここでは、Cloverがkextをインジェクトしてくれるよう、通常はYESを設定します。

<key>InjectKexts</key>
<string>YES</string>

これをDetectに設定すると、

<key>InjectKexts</key>
<string>Detect</string>

Cloverは/L/Eにあるkextを調べて、

  • FakeSMCが/L/EにあればCloverはkextをインジェクトしない
  • FakeSMCが/L/Eに無ければCloverはkextをインジェクトする

という動作をします。なので、macOSの/L/Eと、CloverのEFI/Clover/kexts/Otherの両方にkext類を入れておけば、フルサイズのmacOSを起動するときは/L/Eのkextを、Installer/Updater/Recoveryの時はCloverがインジェクトするkextを使えることになります。


抄訳はここまでです。

/L/Eにkextを入れる方法

今まではバニラな方法しか説明していませんでした。/L/Eにkextを入れるとするといくつかの手順が必要です。

まずはHackintosh用のkext類は、当然ながらアップル社の承認を受けていませんので、「署名されていないkextも動く」設定にSIP (System Integrity Protection)を設定する必要があります。これにはconfig.plistで

<key>CsrActiveConfig</key>
<string>0x01</string>

と設定します。また、/L/Eに必要なkextをコピーした後で、パーミッションを設定して、キャッシュを作り直す必要があります。ターミナルから行うには、

sudo cp -R *.kext /Library/Extensions/.
sudo chown -R 0:0 /Library/Extensions/*.kext
sudo kextcache -i /

などとします。*.kextの部分は、追加するkextだけ指定すれば良いです。これで再起動するとキャッシュが再構成されます。

kextをESPに置く利点と欠点

以上で、/L/Eにkextを置く方法が良いという意見とその実際を紹介しました。kextをESPに置くバニラな方法と比較して、長所短所を検討してみます。

macOSの流儀からは外れる

macOSの設計では追加のkextは/L/Eに置くべきのようです。Cloverがインジェクトする方法では、メモリー不足になる可能性があるようです。ただ、そのような報告はあまり聞いたことがないので、実際には支障はないのかもしれません。

また、/L/Eに置くと、キャッシュに入れる際にkextのエラーチェックをしてくれるそうです。ただこれも、kext開発者でなければあまり恩恵の無い機能のように思います。ちなみに、/L/Eに置くと、そのkextがシステム情報–>ソフトウェア–>拡張機能に現れます。これを使って得られる情報がトラブル対応の参考になるかもしれません。

ESPでは動かないkextもある

一部の kextはESPでは正しく動きません。こらは/L/Eに置かざるを得ません。ただ、そのようなkextは少数で、大体はESPで動きます。

SIPを有効にできる

もともとHackintoshのkextは、macOSの規格外の拡張です。なので署名が無く、/L/Eで有効にするにはSIPで署名の無いkextを許可する設定が必要です。せっかくのSIPの仕組みなので、マルウェア対策としてSIPは有効のまま使いたい気がします。もちろんESPにkextを置くことも同様に危険なことですが、Hackintoshを狙ったマルウェアは少なそうですし、署名のあるkextと、署名の無いkextを、/L/EとESPに分けて管理するのは、セキュリティ対策として有効です。/L/EにHackintoshのkextを入れると、混在してしまいます。

ESPに置くと管理が楽

/L/Eに置くと、パーミッションを設定し、キャッシュを作り直す手間がかかります。ESPへ置くのはコピーするだけなので簡単です。また、上記で説明したInject KextsをDetectにする手法では、/L/EとESPの両方にkextを置かないといけません。この方式ではkextの入れ替えや、アップデートの手間が倍以上になります。/L/Eにkextを簡単に置くためのツールもありますが、手間が増えることには変わりありません。

以上のことを考えると、このままバニラな方法(ESPに置く方法)を続けても良いように思いました。

2件のコメント

  1. 勉強になります。SIP自体は無効にしていることが多いので気にしないですが、kextを/L/Eに置くことの
    決定的なメリットがあれば・・・やっぱりメンテナンスには困りますね。もし/L/Eの更新したKextが問題
    が起きてOSが起動できない場合はどうするのでしょうか・・。EFI/Clover/kexts/OtherにあればCloverの
    オプションでKextのブロックが可能でしたよね。もちろんUSBのEFIから起動させることも可能ですし。
    どっちかというと今まで通りの方が安心ですね。

返信を残す

メールアドレスが公開されることはありません。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)