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

5.25インチベイに取り付ける取り外し可能なHDDケース

今のMacintosh製品には5.25インチベイが無いです。最近の自作PCケースも、5.25インチベイの無い製品が増えていますが、あれば色々便利です。中でも、簡単に5.25/2.5インチドライブを取り付け・取り外しできるリムーバブルディスクケースは便利だと思います。自作していれば、小容量の古いHDD/SSDが余ってしまいがちです。それが簡単に取り付けられるリームバブルケースがあれば、大容量のデータを高速にコピーして持ち運ぶとか、新しいバージョンのOSを実験的にインストールするとか、いろいろな場面で便利に使えます。

市販の製品

5.25インチベイ自体が廃れ始めているので、製品もひところに比べたら少ないですが、いくつかあるようです。5.25インチと2.5インチの両方が入る製品が多いようです。隙間にUSBコネクタを装備している製品とか、光学ドライブも入れられる製品もあります。ちなみに、大は小を兼ねるので、5.25インチが一台だけしか入らないケースも、工夫すれば2.5インチもなんとかなります。

AliExpress.com Product – Bay for HDD
AliExpress.com Product – Bay for 2.5/3.5

 

HDD/SSDのSATAコネクタは、なんども抜き差しする前提で設計されていないので、壊れやすいと言われています。ちゃんとしたサーバで使うホットプラグケースでは、強度の高いコネクタ付きトレイを用意してHDDをネジ止めする構造になっています。でも、素人がちょっとした実験で抜き差しするくらいなら、全然問題ありません。ねじ止めしなくても取り付けられるケースが楽です。

またこれらの製品は、ホットプラグ対応を謳っています。電源を入れたまま、HDD/SSDを抜き差しできるという意味です。ただし、これは電気的に問題を起こさないという意味であって、マウントしたままいきなり取り外すと当然ですがデータが損傷する可能性があります。非マウント状態にしてから抜き差しする必要があります。

ホットプラグなドライブアイコン

ドライブはmacOSでいろいろなアイコンで表示されます。一般的なHDD/SSDは銀色のアイコンです。ちょっと古い感じのハードディスクの形です。USBメモリーは白いアイコンで表示されます。スリットがあるので、光学ドライブの絵なのかもしれません。また、取り外し可能なHDDなどはオレンジ色のアイコンで表示されます。取り外し可能なドライイブアイコンの隣には、イジェクトアイコンが表示されていて、これを押すとアンマウントされます。

上で紹介したリムーバブルケースは、取り外し可能なディスクなので、イジェクトマークのあるアイコンになるべきです。でも、USB接続と違い、リムーバブルケースからマザーボードへは内蔵ドライブと同じSATAケーブルで接続します。マザーボードから見たら、SATAコネクタが内部のHDDに接続されているか、もしくはリムーバブルHDDケースに接続されているのかの区別はつきません。人手で指定する必要があります。

いくつかのマザーボードではデフォルト設定として、インテルのチップセットに接続されたドライブを内部ドライブ(銀色アイコン)にしています。一方で、チップセットのSATAに加えて追加SATAチップを搭載して、SATAの数を増やしている場合、追加のSATAチップに接続はリムーバルボリュームに設定されていることが一般的です。でも全てをホットプラグ対象とみなすマザーボードも中にはあります。こうした割り当てで、内蔵ドライブがオレンジ色のアイコンになってしまうことがあります。それが嫌な人のために、 AHCI_3rdParty_eSATA.kext や AHCI_Intel_Generic_SATA.kext といったkextが用意されていました。これらのkextの主な目的は、オレンジ色のアイコンを銀色に戻すことです。ただ、これらのkextは最近のmacOSでは機能しないことが多いので、あまり使われなくなりました。

BIOSでホットプラグと設定

マザーボード搭載のSATAに接続したドライブがリムーバブル(ホットプラグ)なのかどうかは、BIOS設定で指定します。下はMSIのマザーボードの例です。

この機能で、それぞれのSATAコネクタに接続されているドライブが、固定ドライブなのか、ホットプラグさせるドライブなのかを設定します。これが一番理想的ですね。この方式ならば、オレンジアイコンの割り当てを正しく行うことができます。ただし、後述するように、BIOSでホットプラグに設定しても、macOSで必ずしもオレンジアイコン表示にはならない場合もあるようです。

なお銀色アイコンで、イジェクトマークがついていないドライブでも、ゴミ箱方向へドラッグ&ドロップすればアンマウントできます。また、ディスクユーティリティを使ってもアンマウントできます。ターミナルから、diskutil unmount /dev/disk… としてもアンマウントできます。

ただ、銀色アイコンとして認識されているSATAドライブは、起動時に接続されていなければ認識されません。macOS起動後に接続しても認識されません。また、起動時に接続されてマウントされても、その後で一旦アンマウントしたら、もう一度接続しても認識されません。なので、リムーバブルケースで接続する場合は、オレンジ色のアイコンで認識されないととても不便です。

macOSでホットプラグ

BIOSレベルでホットプラグに設定しても、macOSでオレンジアイコンにならない場合があります。銀色アイコンの状態では、起動時にはマウントしますが、ホットプラグによりマウントしてくれない状態になります。SATAチップの種類、マザーボード、macOSのバージョンなどで対応が異なるようです。

Z97マザーボード+Sierra以前

この記事を最初に書いた時点では、MSIのZ97チップセットマザーボードでSierraで動かしていました。BIOSのホットプラグ設定をすると、macOSでもオレンジアイコンになりホットプラグでマウントされ、安定に動作していました。

Z97マザーボード+High Sierra以降

不安定です。High Sierraになった時点で、BIOSで設定しても銀色アイコンのままのこともあり、動くこともあるようです。ASUS ROG MAXIMUS XI HERO (Z390)マザーボード+Catalinaの組み合わせでは、BIOS設定のホットプラグが正しくオレンジアイコンに表示されることも何度かありました。その時は、スリープしても問題ありません。でも何度も起動して確認すると、マウントされないこともあります。

PCIe拡張SATAカード + Catalina

以前、macOSと互換性のあるPCIe拡張SATAカードをご紹介しました。

追記:以下の方法では、マウントする際にBig Surが落ちることがありました。後述する長いパターンのパッチを当ててください。ASMediaやMarvellのチップでもホットプラグ可能です。

これらのカードの場合、こちらで紹介されているように、

Find    --> 40600200
Replace --> 00000000
AppleAHCIPort

というパッチを当てれば、ASMediaやMarvellのチップでホットスワップできるようです。元のサイトの説明では、SATAポートデュプリケータの不具合に対応するパッチらしいですが、ホットプラグ問題も解決するようです。具体的には、config.plistに

<key>KextsToPatch</key>
    <array>
    <dict>
        <key>Comment</key>
        <string>ALPM IO Error AppleAHCIPort</string>
        <key>Disabled</key>
        <false/>
        <key>Find</key>
        <data>QGACAA==</data>
        <key>InfoPlistPatch</key>
        <false/>
        <key>Name</key>
        <string>AppleAHCIPort</string>
        <key>Replace</key>
        <data>AAAAAA==</data>
    </dict>
    </array>

を追加します。QGACAA==が40600200で、AAAAAA==は00000000です。これでホットスワップが動くようになり、スリープしても大丈夫でした。Marvell 88SE9230チップセットによるカードと、ASMedia ASM1061チップセットカードの両方で動作を確認しました。

AliExpress.com Product – PCIe to SATA
AliExpress.com Product – Marvell 88SE9230

Z390 + Catalinaのパッチ

コメントでまっくぷろさんからいただいた情報によると、こちらで紹介されているパッチもしくはその変形を使うと、Z390チップセットのSATAをホットプラグ対応にできるようです。

Find    --> 89C82540 6002003D 40200000 750C81E1 BF7FFFFF 898B5101 0000
Replace --> 90909090 90909090 90909090 90909090 90909090 90909090 9090
AppleAHCIPort

または、

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

のようです。これに対するBase64文字列を、上で紹介したように、config.plistのKextsToPatchセクションに書き込んでおけば良いようです。

このパッチのいずれでも動かないようでしたら(もしくは将来のmacOSバージョンで動かなくなったら)、AppleAHCIPort.kext/Contents/MacOS/AppleAHCIPortをバイナリーサーチして40200000を検索して、その前後から上記のようなパッチを作れば良いようです。例えば以下のようにします。10.15.3での実施例です。まずはバイナリーをhexdumpしました。

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

lessの中で、サーチコマンド

/40 20 00 00

をタイプし、40 20 00 00を探します。

00029a0 73 0e 81 ca 40 80 00 00 89 d1 89 93 69 01 00 00
00029b0 89 ca 81 e2 40 60 02 00 81 fa 40 20 00 00 75 0c
00029c0 81 e1 bf 7f ff ff 89 8b 69 01 00 00 f6 c1 40 74
00029d0 7e 3d 09 01 01 00 72 77 44 89 fa c1 ea 0a 81 e2

この方法では、運悪く改行にかかっているとデータ列が見つからない可能性はありますが、首尾よく発見できました。他には存在していないようです。ということで、まっくぷろさんの情報と同じく、40 20 00 00を挟んだデータ列をNOP (90) に置き換える

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

というパッチで良いようです。base 64に変換します。詳しくはこちらをご覧ください。

echo -n "\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=

ちなみにNOPコマンド列である9090…の方は、

echo -n "\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=

です。なので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のconfig.plistで当てる方法を以下で紹介しました。

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

 

また、Big Sur対応のパッチを以下で紹介しました。

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

結論

ホットプラグできるリムーバブルベイは便利です。チップセットSATAの場合は、BIOSでホットプラグを設定します。それでもmacOSにホットプラグ対応と認識されない場合は、AppleAHCIPort.kextにconfig.plistでパッチを当てます。手元の環境 (ASUS Z390 + Catalina) では、MarvellのSATA拡張カードを使っているので、拡張カード用のパッチを当てることにしました。

5件のコメント

  1. ども、Boot macOSさん、

    このトピックはDat落ちしそうに古いですが、5.25インチベイに取り付ける取り外し可能なHDDケースは意外と重宝しますね、常時そのベイに7200rpmのHDDとか付けてると、前面から直風の冷却なしにつかわないと、あっという間にチンチンに熱くなって、結構苦闘した思い出があります。。。
    ICY DOCK MB971SP-B Mobile Rack, 2.5″/3.5″ SATA6G HDD in 5.25″ Bay, Black
    https://www.shopmania.co.za/system-accessories/p-icy-dock-mb971sp-b-mobile-rack-2-5-3-5-sata6g-hdd-in-5-25-bay-black-19722169
    今はこれを検証機的な用途の古いケースに3台付けたままになってます。

    >High Sierraになって以下のホットプラグがうまく動かなくなりました。
    >私の環境だけなのかもしれません。もう少し様子を見てみます。
    確かにHighSierraからだったと思いますが、ホットプラグ?、ホットスワップが無効化されちゃったですね。。。スノレパかライオンのときは、システムプロファイラー>SATA>該当のポートをクリックして、メニューからファイル>情報を更新を選択したら、繋いだHDDが認識できるような感じだったと思います。

    今では外部ドライブ起動とかホットスワップによるセキュリティー上の懸念があるのか、元々MacにはeSATAコネクタが付いてるわけでもなく、必要最小限のSATAコネクタしかないんで、いらねぇ〜機能なんで無慈悲に無効化しますっていうことなのか不明ですけど、私は結構に今でもSATAでホットプラグとホットスワップは使いたい派なので、適当なパッチを見つけてはそれを当てて使ってました。
    しかしながら、アップデートタイミングでAppleAHCIPort.kextが変わってしまうと、パッチが効かなくなって、それを探すのに苦労するという悪循環。。。
    カタリナ10.15.3でも当然のごとくホットプラグ動かず、現時点でまだパッチが出回っていない感じです。動かないからパッチくれって言ってる人は何人かいるみたいですけど。。。

    https://lycabettus.wordpress.com/2019/03/03/asm1061-based-pcie-cards-for-os-x-mojave/
    ↑このパッチ(Credit by vit9696さんといわれてるやつ?)だと、BIOSで該当するポートのHot PlugをEnableにした状態でインテルのZ390チップセットについてるAHCIでは、起動時にHDDが繋がっているポートであればホットスワップできる感じ、しかしながら、デバイスに何も繋がっていないポートでただ単にマザボから引っ張り出した別のSATAポートへeSATAの外付けHDDなどをつなげて電源ONしても梨の礫で、すぐにHDDの回転止まって認識しませんね。。。でも、Intel 7シリーズのAHCIだとこのパッチだけでも普通にホットプラグでもOKだったりします。ASM1061-based PCIeのカードとかを挿した状態だと、もしかしたらこのパッチだけでもホットプラグもOKかもしれないですけど、手元に同カードがないんで不明です。。。

    https://www.tonymacx86.com/threads/solved-ich10r-and-high-sierra.233435/page-2
    <89C82540 6002003D 40200000 750C81E1 BF7FFFFF 898B5101 0000 -> 90909090 90909090 90909090 90909090 90909090 90909090 9090>
    ↑それでこのsecond patch for hot-plugとうたわれてるパッチも10.15.3で試したりしたんですがZ390チップセットについてるAHCIではなんの効果もない感じ。該当するバイナリは存在しないんで。。。バイナリマッチするHighSerra 10.13.6 17G11023は、329.50.2ではこのパッチが効く可能性ありです。

    動かないとイライラするんで実験的にこの2nd Hot Plugパッチのmodで無責任てきとう自前パッチをこしらえるとどうなるかというので、10.15.3のAppleAHCIPort.kextを覗いてみて似ているバイナリ部分探してみたら、意外と似ている部分を見つけたのでパッチのmodを作ってみました。。。

    あらたな自前パッチはFind 81E24060 020081FA 40200000 750C81E1 BF7FFFFF 898B6901 0000 で、Replaceは元のパッチに同じで90(これは実際のところ全部Nop命令で埋めてるのかな?)で埋めちゃう作戦したら、見事にホットプラグ復活しましたという結末。元のパッチの内容を理解できてないんであくまでも実験ですけど、当面これをテストしつつ、どこかの国の有志の方がちゃんとしたパッチ作ってくれるまでこれで逃げちゃうつもりでいます。Catalina 19D76に適用した状態で簡単な起動とSATA接続のソフトウェアRAID0の認識、読み書き、SATA接続の単体HDDのベンチマークのテストCCCでOS戻し作業はOKでした。

    Mojave 10.14.6 18G3020の場合では、<81E24060 020081FA 40200000 750C81E1 BF7FFFFF 898B5101 0000>

    いずれにしても、HighSierraからホットプラグとホットスワップは無効化されてるっぽいので、使いたいならパッチ当てないと無理な感じですね。

    1. これは良い情報をありがとうございます。手元の環境でも試してみます。

  2. ども、boot macOSさん、

    そちらの環境でも検証お願いします。。。

    念のためですけど、なぜか?ColverのデフォルトにもあるACPI patch: Change STA0 to SATA 53415430 53415441は、(互換性向上?のため)入れといた方がいいかもです。。。

    あと、HDDオレンジアイコンのパッチは↓これで一括で内蔵HDDに戻ります。。。
    Orange External Icons Patch
    Name com.apple.driver.AppleAHCIPort
    Find 45787465 726E616C
    Replace 496E7465 726E616C

    こちらでは、実害のある副作用は今のところ確認できてません。ただTuxeraとかファイルシステム系のKextを併用した環境(マルチブート環境?)でのCatalinaでは再起動後にfseventsd-uuidが勝手にゴミ箱に出現したりしますね(普通に削除可で問題無し?)。。。あと内蔵SATAでRAID0組んでる場合で、Wake時に再マウントしない(手動でマウントはできるので問題無し?)とかの現象は確認しました。。。

    今後のCatalina、Mojaveアップデートで機能しなくなった場合の考察としては、お気づきかもしれませんが40200000がKeyです。これはバイナリーの変更がないっぽいところなんで、これを中心にして、上の句(16 Bytes)と下の句(28 Bytes)でアップデート時に微妙にスクランブルがかかってくるようです。。。
    というようなパターンで動かなくなるんで、動かなくなった場合は、対象のアップデートされたAppleAHCIPort.kextをFinderでこのパッケージの内容を表示>Contents>MacOS>AppleAHCIPortのバイナリに対してバイナリーツール(Hex Fiendなど)で40200000を検索

    Hex Fiend
    https://ridiculousfish.com/hexfiend/

    40200000がHitしたら、新しく変わったバイナリーのあらたな上の句(16 Bytes)と下の句(28 Bytes)をパッチのFindの対象にしたパッチを自前することで、今後も安定的に?使い続けることが可能であると思われます。

    1. SATAのホットプラグを常用した運用する場合は、Sleep時の対策でSDカードとかの外付けドライブと同じ感覚でドライブの取り出しツールの併用も考えないといけませんね。

      JettisonはMacをスリープモードにする際、自動的に外付けドライブを取り出してくれるアプリ
      http://iphone-st.com/utility/jettison/

      Jettison
      https://www.stclairsoft.com/Jettison/index.html

      内蔵SATAのRAID0のHDDを検証時にBiosでHot PlugをONにした状態だったかもしれくて、Jettson併用してたので、Sleep時にEjectされたことでWake時に自動マウントされなかったかもしれないと思い返しました。。。RAID0はアンマウントしたら自動で再マウントしないのかも?

  3. 教えていただいたパッチを試して記事に反映しておきました。ありがとうございました。

返信を残す

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