リムーバブルHDD/SSDのホットプラグパッチをOpenCoreに適用する

抜き挿し可能なリムーバブルSATAドライブベイを使うために、Cloverでは、macOS稼動中にHDD/SSDドライブのホットプラグを可能にするパッチをconfig.plistに書いてました。OpenCoreに移行したのでこのパッチも移行しました。

5.25インチベイ用リムーバブルHDDラック

AliExpress.com Product – Rack for 5.25″ bay

上の写真のような、5.25インチベイに取り付けるリムーバブルHDDラックは、本物のMacには無い、自作hackintoshならではの便利な装備です。でもHDDラックを取り付けただけではHDD/SSDのホットプラグが効きませんでした。macOS起動時にリムーバブルベイに装着されているHDD/SSDは認識され、ファインダー上でアンマウントして、安全に取り外すことはできます。しかし、macOS稼動中にHDD/SSDを挿しても認識されません。そこでCloverでは、ホットプラグが機能するようにconfig.plistにkextパッチを当て対応していました。

Cloverで使用していたパッチ

このパッチは、AppleAHCIPort.kextの一部を0x90 (マシンコードでNOPに相当します) に置き換えるものです。置き換える範囲は、kextの中の0x40200000というデータ列の4バイト、その前8バイト、その後14バイトの、合計26バイトです。コメントでまっくぷろさんに教えていただいたパッチです。

このパッチを作るために、kextの中で0x40200000を探して、書き換えるべきデータ列を調べます。例として、macOS 10.15.4で、書き換えるべきデータを探してみます。まずは、AppleAHCIPort.kext/Contents/MacOS/AppleAHCIPortをhexdumpします。

% hexdump /System/Library/Extensions/AppleAHCIPort.kext/Contents/MacOS/AppleAHCIPort | less

lessが起動しているところ、以下のサーチコマンドをタイプし、40 20 00 00を探します。

/40 20 00 00

ところが運悪く途中に改行が入っているようで見つかりません。40 20だけでもう一度探索します。

/40 20

今度は見つかりました。改行の先に00 00があるので、間違い無いようです。他にも40 20は見つかりますが、その先に00 00が続く場所はありません。おそらくは2バイト単位で位置揃えされているので、この場所以外に改行が来る可能性は無いと思います。40 20 00 00と40 20の2種類の探索を試みれば、40 20 00 00の場所を発見できると思います。

0002a40 69 01 00 00 89 ca 81 e2 40 60 02 00 81 fa 40 20
0002a50 00 00 75 0c 81 e1 bf 7f ff ff 89 8b 69 01 00 00
0002a60 f6 c1 40 74 7e 3d 09 01 01 00 72 77 44 89 fa c1
0002a70 ea 0a 81 e2 80 00 00 00 81 e1 7f ff ff ff 09 d1

ここで発見した0x40200000の4バイト、その前8バイト、その後14バイトの、合計26バイトをNOP (90) に置き換えるパッチを作ります。つまり、

Find    --> 81E24060 020081FA 40200000 750C81E1 BF7FFFFF 898B6901 0000
Replace --> 90909090 90909090 90909090 90909090 90909090 90909090 9090
AppleAHCIPort

というパッチを作ります。ProperTreeなどのツールならこのまま16進数が使えますが、テキストエディタで作る場合はbase 64に変換します。詳しくはこちらをご覧ください。Findするデータはbase 64では以下になります。

% echo -en "\x81\xE2\x40\x60\x02\x00\x81\xFA\x40\x20\x00\x00\x75\x0C\x81\xE1\xBF\x7F\xFF\xFF\x89\x8B\x69\x01\x00\x00" | base64
geJAYAIAgfpAIAAAdQyB4b9///+Ji2kBAAA=

Replaceするデータは、NOPコマンド列である9090…なのですが、このbase 64は以下です。

% echo -en "\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90" | base64
kJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJA=

なのでCloverのconfig.plistには、

<key>KextsToPatch</key>
    <array>
    <dict>
        <key>Comment</key>
        <string>Enables hot plug for removal drives</string>
        <key>Disabled</key>
        <false/>
        <key>Find</key>
        <data>geJAYAIAgfpAIAAAdQyB4b9///+Ji2kBAAA=</data>
        <key>InfoPlistPatch</key>
        <false/>
        <key>Name</key>
        <string>AppleAHCIPort</string>
        <key>Replace</key>
        <data>kJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJA=</data>
    </dict>
    </array>

というパッチを追加していました。これでBIOSでホットスワップ指定したチップセットSATA接続ドライブがオレンジ色アイコンになり、随時マウント・アンマウントできるようになりました。またスリープしても問題ありませんでした。

OpenCore用のパッチに書き換える

OpenCoreには、CloverのようなKextToPatchの項目はありません。OpenCoreで、カーネルとkextに対してパッチを当てる項目は、Kernel, Patchの場所です。また、使用するキーの一部がCloverのパッチとは異なります。OpenCoreのパッチで使うキーは以下です。

  • Comment : Cloverと同じ。人が読むためのメモ書き。
  • Find : Cloverと同じ。検索データ列。
  • Replace : Cloverと同じ。置き換えるデータ列。
  • Idenetifier : CloverのNameに相当するキー。kextを指定するためのIDで、バンドルIDを使う。
  • Enabled : パッチを有効にする場合はtrueにする。(有効にしたいのでtrueにする)
  • Count : パッチを当てる箇所の数。今回の場合は1回なので1。
  • その他のキー : デフォルトで良いので省略。

kextのバンドルIDは、システム情報で知ることができます。

システム情報の拡張機能のAppleAHCIPortの項目を選択すると、

com.apple.driver.AppleAHCIPort

であることがわかります。そこで、上記のCloverのパッチに相当する、OopenCoreのパッチは以下になります。

<key>Kernel</key>
<dict>
    <key>Patch</key>
    <array>
        <dict>
            <key>Comment</key>
            <string>Enables hot plug for removal drives</string>
            <key>Count</key>
            <integer>1</integer>
            <key>Enabled</key>
            <true/>
            <key>Find</key>
            <data>geJAYAIAgfpAIAAAdQyB4b9///+Ji2kBAAA=</data>
            <key>Identifier</key>
            <string>com.apple.driver.AppleAHCIPort</string>
            <key>Replace</key>
            <data>kJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJA=</data>
        </dict>
    </array>
</dict>

ProperTreeで設定するなら、以下のようになります。(0番から4番までに、OpenCore付属のSample.plistにあった無効設定のパッチを残してあるので、たまたま5番目になっていますが、何番目でも大丈夫です。)

このパッチをOpenCoreのconfig.plistに追加したところ、OpenCoreでも、ホットプラグが機能しました。オレンジ色のドライブがmacOS起動後にリムーバルベイに取り付けた2.5インチHDDです。

パッチを施したconfig.plistを以下に置いておきます。もしこれを使用する場合は、SystemSerialNumber, SystemUUID, MLB, ROMの値を必ず置換えてください。

まとめ

リムーバルドライブベイのホットプラグを可能にするCloverパッチを、OpenCoreのconfig.plist用に書き換えて動作を確認しました。これでまた一歩、OpenCoreに適応できた気がします。

つづき

Big Sur対応パッチはこちらをご覧ください。

リムーバブルHDD/SSDのホットプラグパッチ (Big Sur版)

3件のコメント

  1. PrpperTreeを使った場合の記載ですが確認させていただけますでしょうか?
    サイトのconfig.plistから該当部分を抽出して、自分の作ったplistに貼りました。
    すると

    Kernel—>Patchに
    Comment/String/Enables hot plug for removal drives
    Count/Number/1
    Enabled/Boolean/True
    Find/Data/81E24060 020081FA 40200000 750C81E1 BF7FFFFF 898B6901 0000
    Identifier/com.apple.driver.AppleAHCIPort
    Replace/90909090 90909090 90909090 90909090 90909090 90909090 9090
    となります。

    これで合っていますでしょうか?

    1. はい、それで良いと思います。本文にも、ProperTreeの画面を貼り付けておきました。

      1. bootmacosさん、画面貼り付け頂きありがとうございます!
        最初はCloverでチャレンジしましたが、OpenCoreに切り替えてProereTreeを使うようになってから理解と作業効率が高まりました。

返信を残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です