Mac信者のHackintosh修行

惑星で一番美しいOSが1台でも多くのマシンで動くことを目指します。

Hackintoshの長靴 (ブート)

↓ブートストラップ        

ご存知のようにコンピュータを起動することをブートすると言います。ブートは一般の辞書にも動詞として載っています。このブートの元の意味は長靴です。一方、公式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が使えました。

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

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

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

VBoxHfs-64.efiとHFSPlus.efiは、いずれもHFS+ファイルシステムのファイルを読み込むためのドライバーです。apfs.efiはAPFSのファイルを読み込むためのドライバーです。macOSがHFS+に格納されている場合は、VBoxHfs-64.efiもしくはHFSPlus.efiのどちらか一つが必要です。macOSがAPFSに格納されている場合は、apfs.efiが必要です。

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

HFSPlus.efiApple社純正のドライバで、本物のMacintoshファームウェアで使われているものです。ハッカーのみなさんの技術で、ファームウェアから取り出されて、配布されています(名前で検索すれば配布サイトが出てきます)。多くのガイド、例えば  

How To Install OS X Yosemite Using Clover | tonymacx86.com では、VBoxHfs-64.efiをHFSPlus.efiに置き換えると良いと書かれています。オープンソースのプログラムより、Apple純正の方が高速だからという理由です。ただ、起動時間を実測してみたところ、

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

程度の違いしかありませんでした。ブートの時しか関係しないことですし、これからは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に置く必要は無くなりました。

siroanko.hatenablog.com