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

抜き挿し可能なリムーバブルSATAドライブベイで、HDD/SSDのホットプラグを可能にするパッチを以前ご紹介しました。Big Surでパッチパターンが変わったので、これに対応しました。

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を挿しても認識されません。そこでホットプラグが機能するようにconfig.plistにkextパッチを当て、対応していました。

SATA接続HDD/SSDのホットプラグ

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

このパッチが効くと、マザーボードのチップセットが持っているSATA端子以外、つまり、マザーボード上にSATAチップを追加して増設したSATA端子が、リムーバブルドライブとして扱われるようになります。チップセットがサポートするSATAは通常6個ですので、8個のSATAを持っているマザーボードは、最後の2個が対象になります。また、PCIeスロットにSATAアダプターカードを挿してSATA端子を増設した場合も、そこに接続されるドライブがリムーバブルになります。例えば以下のような、Marvell 88SE9230チップセットや、ASMedia ASM1061チップセットを搭載したカードです。

AliExpress.com Product – PCIe to SATA

AliExpress.com Product – Marvell 88SE9230

ところが、Big Surにバージョンアップしたら、このパッチが効かなくなったようで、ホットプラグが機能しなくなりました。調べたところパッチパターンが変わっていたようです。

パッチの方法

パッチは、/System/Library/ExtensionsにあるAppleAHCIPort.kextのバイナリファイルの該当部分を、0x90 (マシンコードでNOP, No OPerationに相当します) に置き換えるものです。置き換える範囲は、ファイルの中の0x40200000というデータ列の4バイト、その前8バイト、その後14バイトの、合計26バイトです。この26バイトのパターンが、Big Surになって変わっていたようで、パッチが効かなくなっていました。

そこで、Big Surのkextの中で0x40200000を探して、書き換えるべきデータ列を調べなおすことにしました。まずは、AppleAHCIPort.kext/Contents/MacOS/AppleAHCIPortをhexdumpして、lessコマンドで表示を一旦停止しておきます。

% 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が続く場所はありません。もしもこれで見つからなければ、他の場所に改行が入っているかもしれませんので、

/20 00 00

で探せば良いと思います。

今回、発見できた場所の前後のデータは以下です。

0003da0 01 00 00 89 d1 81 e1 40 60 02 00 81 f9 40 20 00
0003db0 00 75 0c 81 e2 bf 7f ff ff 89 93 69 01 00 00 f6
0003dc0 c2 40 74 7e 3d 09 01 01 00 72 77 44 89 fe c1 ee
0003dd0 0a 81 e6 80 00 00 00 81 e2 7f ff ff ff 89 d1 09

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

Find    --> 81E14060 020081F9 40200000 750C81E2 BF7FFFFF 89936901 0000
Replace --> 90909090 90909090 90909090 90909090 90909090 90909090 9090
AppleAHCIPort

というパッチを作ります。前回のパッチパターンに類似していますのでおそらく合っていると思います。

config.plistをテキストエディタで編集する場合はbase 64に変換します。詳しくはこちらをご覧ください。Findするデータはbase 64では以下になります。

% echo -en "\x81\xE1\x40\x60\x02\x00\x81\xF9\x40\x20\x00\x00\x75\x0C\x81\xE2\xBF\x7F\xFF\xFF\x89\x93\x69\x01\x00\x00" | base64 
geFAYAIAgflAIAAAdQyB4r9///+Jk2kBAAA=

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の場合

最近Cloverは使っていないので検証できませんが、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>geFAYAIAgflAIAAAdQyB4r9///+Jk2kBAAA=</data>
        <key>InfoPlistPatch</key>
        <false/>
        <key>Name</key>
        <string>AppleAHCIPort</string>
        <key>Replace</key>
        <data>kJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJA=</data>
    </dict>
    </array>

OpenCoreの場合

OpenCoreで、カーネルとkextに対してパッチを当てる項目は、Kernel, Patchの場所です。また、使用するキーは以下です。

  • 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

であることがわかります。これはBig Surになっても変更はありませんでした。そこで、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>geFAYAIAgflAIAAAdQyB4r9///+Jk2kBAAA=</data>
            <key>Identifier</key>
            <string>com.apple.driver.AppleAHCIPort</string>
            <key>Replace</key>
            <data>kJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJA=</data>
        </dict>
    </array>
</dict>

ProperTreeやPlistEDPlusなどのアプリケーションで設定するなら、16進数でそのまま書けます。ProperTreeでは16進数のデータの8バイトごとにスペースを入れる流儀のようですが、

81E14060 020081F9 40200000 750C81E2 BF7FFFFF 89936901 0000

PlistEDPlusではスペースを入れないようです。

81E14060020081F940200000750C81E2BF7FFFFF899369010000

以下はPlistEDPlusの例です。Item番号はたまたま7番目になっていますが、何番目でも大丈夫です。

動作確認

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

補足

最初の記事、

では、

Find    --> 40600200
Replace --> 00000000
AppleAHCIPort

というパッチを当てれば、ASMediaやMarvellのチップでホットプラグが可能になるという情報を紹介しました。今回、Big Surで試したところ、マウントする際にシステムが落ちてしまう現象が発生しました。PCIeに挿すASMediaやMarvellのSATAカードでも、ここで紹介した長いパッチは安定して動きますので、この記事の方式を使ってください。

まとめ

リムーバルドライブベイのホットプラグを可能にするパッチを、Big Sur用に書き換えて動作を確認しました。これからも、しばらくはBig Surへの対応作業を楽しめそうです。

返信を残す

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