Hackintoshの長靴 (ブート)

↓ブートストラップ                    

ご存知のようにコンピュータを起動することをブートすると言います。このサイトの名前も、「macOSを起動しよう」という意味です。ブートは一般の辞書にも動詞として載っています。このブートの元の意味は長靴です。

一方、公式WikiによるとCloverの正式名称は、Clover Bootloaderです。Bootloaderというのは、

– Bootstrap program loader

を短くした言い方です。loadするというのは搭載するとか装填するという意味で、HDDなどからプログラムを読み込んで、コンピュータ上のメモリに格納して、プログラムが動作できるように準備する作業をさします。OSは稼働している間、こういう仕事をいつもやっています。当然ですが、loadするのもプログラムで実施しています。

ではコンピュータの電源を入れたばかりで、メモリー上のプログラムが空っぽの状態では、どうやってloadすれば良いのでしょうか。load作業を実施するプログラムはHDDの中にあります。缶切りが缶詰の中に入っている状況です。そこで使われるのが、缶切り機能だけに特化したBootstrap programという短い(OS全体に比べたら)プログラムです。CloverはmacOSを稼働させるために、まずはmacOSの核(kernel)となる基本機能を含むbootstrap programを読み込み (load) ます。次に、bootstrap programに制御を移管し、macOSの全体の読み込みと設定を行ってもらいます。なので、Cloverはbootstrap program loaderなわけです。

そもそもbootstrapって何かと言うと、上の写真にあるブーツの踵などについている平たい紐のことです。ストラップは平たい革紐のことです。ブーツに足を突っ込んで、このストラップを引っ張ってブーツを持ち上げると、楽に履けます。この時にもっと頑張ってストラップを引っ張ったら、自分で自分の体を持ち上げられるかもしれません。それでpull oneself up by one’s bootstrapsという言い回しは、「自力でなんとかする」という意味になりました。自力でなんとかOSを立ち上げるためのプログラムも、これにちなんでbootstrap programと呼ぶようになりました。

bootstrap programをloadするためには、

  1. プログラムを装填するためのメモリ領域を確保して
  2. ファイルシステムから読み込む

二つのステップが必要です。Cloverではそのために以下の設定が必要です。

メモリを確保する

マザーボードに電源が投入された直後は、UEFIという簡易的なOSのようなプログラムが動いていて、メモリなどのコンピュータリソースを管理しています。CloverはUEFIにお願いしてmacOSのbootstrap programを格納するためのメモリ領域を確保します。メモリ上には、すでにグラフィックスカードや他の周辺機器のBIOSが居座っていることもあります。空き地を探したり、空き地を確保するためのこれらを移動したり、いろいろな作業が必要です。その手続きが、マザーボードや搭載周辺機器によって異なることがあります。なので、それを行うプログラムもハードウェアに合わせて選択する必要があります。そこで、Cloverの設定作業

f:id:siroanko:20180120002246p:plain

では、以下の選択肢の中から必要なプログラムを1つだけ選択して、EFI/CLOVER/drivers64EFI/の中に格納します。

  1. AptioMemoryFix.efi
  2. OsxAptioFix3Drv-64.efi
  3. OsxAptioFix2Drv-64.efi
  4. OsxAptioFixDrv-64.efi
  5. OsxLowMemFixDrv-64.efi

必要なのは、このうちの1つだけです。このリストの複数のファイルをdrivers64EFIに入れてはいけません。また、推奨する順に番号が振られています。この順番に入れてみて、ちゃんと起動すればそれを使うのが良いです。できれば1か2が望ましいです。

この選択が正しくないと、メモリを確保できません。メモリを確保できないと、Cloverが起動した直後に、

f:id:siroanko:20171217172024p:plain

こんなマークが出て止まってしまいます。-vオプションで起動すると、

OSXAptioFix2Drv: Starting overides for SystemLibrafyCoreServicesoot.efi
Using reloc block: no, hibernate wake: no
Error allocating 0x116f5 pages at 0x000..... alloc type 2
Couldn't allocate runtime area
Boot failed, sleeping for 10 seconds before exiting...

こんなメッセージが現れて止まってしまいます。こんなメッセージの場合もあります。

AptioMemoryFix(RC5) : Starting SystemLibraryCoreServicesoot.efi
Hibernate wake: no
does printf work??

また、これらのエラーは、必ず出るとは限りません。起動のタイミングで、周辺機器BIOSがたまたま分散せずにメモリマップ上のかたまった場所に配置され、空き領域が容易に確保できるような場合には、エラーが発生しにくいです。なので、何度も試すとエラーが出る場合もありますし、逆に、ほとんどエラーが出るけど稀に起動できたりすることもあります。

上記の5個のプログラムの違いは、以下で説明されています。

www.insanelymac.com

それによると:

  • OsxAptioFixDrv-64.efi と OsxAptioFix2Drv-64.efi は、Clover 4368 以前に作られて、NVRAMサポートしていません。歴史的経緯で残されています。高位アドレスにワープしたメモリマップでは、OsxAptioFixDrv-64.efiだけが動くこともあります。
  • OsxAptioFix2Drv-64.efi は、メモリブロックの配置変えを行わない機能削減バージョンです。いくつかのハードウェアや古いOSバージョンでは動かないかもしれません。しかし、OsxAptioFixDrv-64.efiに比べると、こちらはハイバーネーションをサポートしています。
  • OsxAptioFix3Drv-64.efi は、Cloer 4369でOsxAptioFix2Drv-64.efiから改変されたバージョンです。これはNVRAMをサポートします。Clover 4379ではランタイムの不具合が解消されました。Clover開発チームは今後、このバージョンだけを改良していきます。
  • AptioMemoryFix.efi は、サードパーティメモリ修正ドライバをそのまま使っています。そのため、色々手を加えているOsxAptioFix*Drv-64.efiシリーズよりもたぶん優れています。まずは、AptioMemoryFix.efiが動くかどうかを試すべきです。
  • OsxLowMemFixDrv-64.efi は、やはりメモリ修正ドライバですが、Clover 608から改良されていません。

とのことです。それで上記のような優先順位で、1から5の順に、動くプログラムを探すのが良いです。手元のMSIマザーボードでは1が使えました。

追記:起動に失敗する原因は、連続したメモリー空き空間が確保できないためです。KASLR(カーネル番地乱数化)をoffにしてslideを指定して、カーネル読み込み場所を明示的に指定することで解決します。詳しくはこちらをご覧ください。

ファイルシステムから読み込む

ファイルを管理するOSの仕組みがファイルシステムです。起動パーテションに使われるファイルシステムは、macOS Sierra以前ではHFS+だけですが、macOS High Sierra以降ではHFS+とAPFSの2種類が使われます。OSは、ファイルシステムを知り尽くしていて、その機能を全て使いこなします。bootstrap programに必要なファイルもファイルシステムの中に置かれていて、OSならばそれを読みだすのは簡単です。でも、コンピュータに電源を入れた直後は、ファイルを読みだすプログラムも、ファイルシステムの中にあります。またもや缶切りが缶詰の中にある状態です。

そこで、なんとかbootstrap program関連ファイルだけでも読みだすためのプログラムが作られています。それが、CloverのEFI/CLOVER/drivers64EFI/の中に格納される次のファイルです。

  • VBoxHfs.efi
  • HFSPlus.efi(Cloverには同梱されてません)
  • apfs.efi

VBoxHfs.efiとHFSPlus.efiは、いずれもHFS+ファイルシステムのファイルを読み込むためのドライバーです。apfs.efiはAPFSのファイルを読み込むためのドライバーです。macOSがHFS+に格納されている場合は、VBoxHfs-64.efiもしくはHFSPlus.efiのどちらか一つが必要です。macOSがAPFSに格納されている場合は、apfs.efiが必要です。これらが無いとCloverの起動選択メニューにmacOS起動ボリュームが現れません。

VBoxHfs.efiだけがCloverの配布セットに含まれています。VBoxHfs-64.efiはオープンソースのHFS+ドライバです。オープンソースであるために、Appleの許可を得ずに(純正ドライバーの配布をお願いしても許可をもらえないと思いますが)配布することが可能なのです。

HFSPlus.efiはApple社純正のドライバで、本物のMacintoshのファームウェアで使われているものです。ハッカーのみなさんの技術で、ファームウェアから取り出されて、配布されています(名前で検索すれば配布サイトが出てきます)。多くのガイド、例えばこちらでは、VBoxHfs.efiをHFSPlus.efiに置き換えると良いと書かれています。オープンソースのプログラムより、Apple純正の方が高速だからという理由です。ただ、起動時間を実測してみたところ、

  • VBoxHfs-64.efiは約14秒
  • HFSPlus.efiは約9秒

程度の違いしかありませんでした。ブートの時しか関係しないことですし、現行macOSはAPFS起動のみですので、無理して入手して置き換える必要はないと思います。

apfs.efiは、macOS High Sierraの /usr/standalone/i386/ の中にあります。システムがAPFSに格納されている場合は、これが無いとCloverの起動選択画面に現れません。apfs.efi入手方法の詳細な手順は以下をご覧ください。

2018/06/19更新:Clover 4558からApfsDriverLoader.efiというドライバができて、apfs.efiの機能を自動的にロードしてくれるようになりました。なので、 /usr/standalone/i386/ からapfs.efiを取り寄せてESPに置く必要は無くなりました。

4件のコメント

  1. ども、Boot macOSさん、

    >そこで、なんとかbootstrap program関連ファイルだけでも読みだすためのプログラムが作られています。
    >それが、CloverのEFI/CLOVER/drivers64EFI/の中に格納される次のファイルです。

    >VBoxHfs-64.efi
    >HFSPlus.efi
    >apfs.efi

    HFSPlus.efiも、もうCloverに同梱されなくなってしまってますよね。
    現在のmacOSの中にもファイルは見つけられないし、どこかで拾ってくりしかないしろものと化してます。
    どっから拾うかもちょっとググらないといけません。

    いくつかのサイトで拾い場所などが、紹介されて安心かなというのは、↓ここじゃないかと思います。。。
    Downloads
    HFSPlus.efi : https://github.com/JrCs/CloverGrowerPro/raw/master/Files/

    インストーラ作成時に、VBoxHfs.efiよりも少しでも早いのがイイという人は、ここからダウンロードして、自分で差し替える必要がある状況です。

    全く新規にMacOSのUSBインストーラを作成する際には、Cloverのインストール時に必要なefiドライバを自分で選ばなきゃいけないですけど、
    UFEI Drivers>Filesystem drivers>『VBoxHhfs』は、デフォルトでチェックが入っていないはずなので、
    初めての方は、これをチェックし忘れて、作成したインストーラのEFIの中にVBoxHfs.efiが存在しないと、Cloverメニューに起動用の選択できるアイコンが出てこず、てこずっちゃうというパターンもあるので要注意ですね。

    HFSでフォーマットしているUSBインストーラをこしらえた場合には、ちゃんと起動時にBoot Menuのアイコンから選べるようVBoxHhfs.efiが必須であることもmacOSの各バージョンのUSB作成トピに明示しておいてあげないと、この罠にハマって苦闘してしまうかもしれないですね。

    1. ありがとうございます。HFSPlus.efiは、記事に書きましたように、以前からCloverには同梱されていなかったと思います。でもご指摘のようにわかりにくい書き方だったかもしれません。記事を見直して、修正しました。

  2. ども、Boot macOSさん、

    Clover Boot loaderというのは、本来macOSの起動が想定されていないPCのハードウェアに、Boot loader(OS Boot load Switcher?みたいな感じのもの)という形でboot.efiの間に介在し、旧来のWindowsなどのBiosベースOSとLinux、Windows、macOSを含むEFIベースOSに対してOSに組み込まれた標準のBoot loader(macOSの場合10.6以降のboot.efi)をロードするためのEFI Boot loaderシステムといべきものに仕上がっている感じですよね。

    そして、macのSMBIOSの設定、macOSが持つ独自のNVRAMをエミュレーションを提供するためのやAptioメモリマネージャのefiドライバーを設定、必要に応じてKernelやドライバー(kext)などが一旦メモリに読み込まれた状態から動的(ダイナミック)パッチを適用したり、.plistファイルや一般的に必要とされるパッチ群の選択的適用が可能だったり、ACPIに関連する互換性を向上させるためのDSDTテーブルの整合性補完機能などPCのハードウェアから起動できるようにするための総合的なパッチ機能を持っている。また、 起動対象にあたるOSのBoot Manager(GUI付き)も内包しており、Cloverが起動した後では、PCシステムのストーレージから起動可能なOSのアイコンをグラフィカルに表示し、テーマなどの装飾も備えているという感じのまとめもありかなと思います。他に何か抜けてるとこあるかもしれませんが、意外とCloverの全容を掴んでまとめるのには、私は文書つくるの下手だしむずいですね。。。

    macOSのboot.efiへのブートストラップに関する記事はこちら↓が詳しいですね。。。

    Booting the Mac: Visual Summary
    https://eclecticlight.co/2018/08/25/booting-the-mac-visual-summary/

    複雑なMacの起動プロセスを図解した「Booting the Mac」
    https://www.softantenna.com/wp/mac/booting-the-mac/

    OpenCoreにははまだGUIのBootManagerなしですけど、Ver1.00に到達したらGUI付くのかなとか思ってます。。。

    1. ブート手順図解の情報ありがとうございます。読んでみます。

返信を残す

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