弊サイトではOpenCore Legacy Patcher (OCLP)の使い方や特徴を紹介する記事を紹介しております。
この記事ではOpenCore Legacy Patcherのブートプロセスについて詳しく見ていきたいと思います。
専門用語が多く出てきますが、可能な限り注釈を入れて分かりやすく解説しました。
やや長い記事なので、お時間のある時にのんびりとご一読いただけると幸いです。
目次
OpenCore Legacy Patcherのブートプロセス
OpenCore Legacy PatcherはOpenCorePkgというブートマネージャーとLilu(リル)を中心としたツールで、古いMacで最新のmacOSを起動させるための中心には、前出の「OpenCorePkg」が大きな役割を果たしています。
国内のサイトでOpenCore Legacy Patcherに関して解説しているページが見当たらなかったので、このページでは起動シーケンス(PC電源投入後から起動するまでの流れ)を詳しく解説してみたいと思います。
この起動シーケンスを確認することで、問題発生時のトラブルシューティングが少し楽になるかもしれません。
なお、この記事は「Boot Process with OpenCore Legacy Patcher」をベースに執筆しました。
それではゆっくりとOpenCore Legacy Patcherを使用したmacOSの起動手順を見ていきましょう。
Macの電源投入
Macが起動する
Macの電源ボタンが押されました。
ここからブートプロセスが始まります。
(U)EFIイメージがロードされる
UEFI (Unified Extensible Firmware Interface) またはEFIは、ハードウェアとオペレーティングシステム(OS)との間のソフトウェアインターフェースです。
UEFIやEFIはこの文脈では「Macのファームウェア」と呼ばれることもあります。
ファームウェアが利用可能なドライブをスキャン
MacのファームウェアがMacに接続されたストレージを検出し、ブート可能なものを探します。
サポートされている一般的にスキャンされるファイルシステム:
- FAT32 パーティション
- HFS+ (MacOS ジャーナリング)
- APFS (ファームウェアがサポートしている場合)
ファームウェアが一般的なブートローダーをスキャン
ブートローダーを探し、どれを使用するかを決定します。
サポートされている一般的なスキャンされる場所:
- EFI/BOOT/BOOTx64.efi
- System/Library/CoreServices/boot.efi
前者は(U)EFIブートの際のデフォルトのファイルと位置です。多くのUEFIベースのシステムはこの位置を最初にスキャンします。
後者はmacOSのデフォルトのブートローダーの位置です。通常、Macのシステムが起動する際にこの場所をチェックします。
OCLPのBootstrapは、特定の場所 (S*/ L*/ C*/ boot.efi) に保存されています。これにより、他のブートローダーとの互換性が確保されます。
(S*, L*, C* はそれぞれ System、Library、 CoreServices の略です。これは上記のSystem/Library/CoreServices/boot.efiを短縮した表現としています。)
OCLP Bootstrap is stored as S*/ L*/ C*/ boot.efi to ensure other boot loader compatibility
OpenCoreスタート
ファームウェアがOpenCoreのboot.efiをロード
MacのファームウェアがOpenCore を検出しそこから起動します。
OpenCoreは、EFI/OC/内に位置しているOpenCore.efiをブートストラップ (初期化・起動)します。さらに、Macが常にOpenCoreを使用して起動するように、新しいデフォルトのブートエントリを作成します。
OpenCoreブートローダーは自身の主要なファイルであるOpenCore.efiを使用してシステムを起動します。このファイルはEFI/OC/というディレクトリに保存されています。
OpenCoreは、Macが次回からも自動的にOpenCoreを使って起動するように、新しいデフォルトのブートエントリを作成します。これにより、Macの起動時にユーザーが手動でOpenCoreを選択しなくても、自動的にOpenCoreを使用してシステムが起動します。
OpenCoreがプロトコルとSMBIOSオーバーライドを開始
OpenCoreはプロトコルとSMBIOS (System Management BIOS)の上書きを開始します。
これは特定のハードウェアやソフトウェア設定を変更または上書きするためのもので、古いハードウェアで最新のmacOS機能や設定をサポートするための準備が行われます。
OpenCoreは、新しい機能を取得するためにSMBIOSのセクションやプロトコルを置き換えます。これには、APFS (Apple File System)の追加やFileVaultサポートの強化が含まれます。この操作により、古いMacハードウェアでも新しいmacOSの機能を利用できるようになります。
この段階で、NVRAMのDeviceProperty (デバイスのプロパティや設定)とACPI (Advanced Configuration and Power Interface)のパッチが処理されます。これにより、ハードウェアとOSの間の通信や電源管理の設定が処理されます。
RequestBootVarの機能は、OSのアップデートを含むすべてのブートオプションがOpenCoreを経由してルーティングされるように強制します。これにより、OpenCoreがシステムの主要なブートローダーとして機能し、OSのアップデートやその他のブート関連のタスクもOpenCoreを通じて処理されることを保証します。
OpenCoreのブートピッカーがmacOSをロードして起動
OpenCoreのブートピッカー (Boot Picker)は、利用可能な起動オプションを表示するツールです。
このツールを通じて、macOSやその他のOSがロードおよび起動されます。
ここでユーザーがどのOSを起動するかを選択するか、デフォルトで設定されているOSが自動的にロードされます。
この段階で、カーネル (macOSの中核となる部分)とkext (カーネルエクステンション、macOSのドライバやモジュールのようなもの) のパッチ処理が行われます。
このパッチ処理は、システムが正常に動作するための特定の修正や調整を行うためのものです。
なお、パッチ処理はディスク上の実際のファイルを変更するのではなく、メモリ上でロードされたデータに対して行われます。
ディスク上の実際のファイルを変更することなく、一時的にシステムの動作を変更します。
さらに、カスタムkexts (ユーザーが追加したか、特定のハードウェアのサポートのために必要なカーネルエクステンション)はカーネルキャッシュに挿入されます。これにより、システムの起動時にこれらのカスタムkextsが自動的にロードされ、ハードウェアサポートが提供されます。
カーネルスタート
macOSのboot.efiがスタート
macOSのブートプロセスが開始します。
boot.efiは、macOSのブートローダーで、OSを起動するための初期段階を処理します。
boot.efiはNVRAM (Non-Volatile Random Access Memory、不揮発性RAM)をスキャンして、起動オプションを探します。具体的なオプションとして以下が挙げられます。
- NormalOS Boot: 通常のmacOS起動。
- RecoveryOS Boot: macOSのリカバリモードでの起動。
- FileVault Boot: FileVault (macOSのディスク暗号化機能)で暗号化されたドライブからの起動。
- Hibernation Boot: ハイバネーション (休眠)状態からの復帰。
次に、boot.efiは、OSのサポートを検証するためのサポートされる引数 (args)をスキャンします。ただし、ハイバネーション起動時にはこのチェックはスキップされます。具体的な引数として以下が挙げられます。
- -no_compat_check
- すべての互換性チェックをスキップします。
- HW_BID
- board-idというNVRAM変数。これが存在する場合、SMBIOSはチェックされません。
- BoardProduct
- board-idというSMBIOS変数。
boot.efiがカーネル(XNU)をブートストラップ
カーネルがロードされ、システムが初期化されます。
boot.efiがカーネル、具体的にはXNU (X is Not Unix)と呼ばれるmacOSのカーネルをブートストラップ(初期化・起動)します。ブートストラップは、システムが起動するときに最初に行われるプロセスで、これによりシステムは正常に動作する状態にセットアップされます。
カーネルが起動し、画面上にテキストを出力するための環境や、カーネル拡張を読み込むための環境を準備します。カーネル拡張は、macOSのカーネル機能を拡張するためのモジュールやドライバで、特定のハードウェアデバイスやシステム機能をサポートするために使用されます。
IOKitがスタートし、PCI構成プロセスが開始
ハードウェアデバイスの初期化と認識が始まります。
このタイミングで、OpenCore Legacy Patcherを構成する主要な構成要素の1つである「Lilu」が登場します。
IOKitの起動、PCI構成の開始
IOKitは、macOSのカーネルスペース内でハードウェアデバイスとのインターフェースを提供するフレームワークです。IOKitの起動により、PCI(Peripheral Component Interconnect)デバイスの構成が開始されます。
IOKitが起動すると、メインのカーネルキャッシュ内のすべてのカーネル拡張がハードウェアデバイスを検出し (probe)と接続 (attach)を試みます。これに成功すると、それぞれのカーネル拡張は自身のプロセスを実行します。これにより、各種のハードウェアデバイスや機能がOSによって正常に認識・操作されるようになります。
Liluは、macOSのカーネル拡張の一つで、他のプラグインやカーネル拡張がカーネルスペース内で動作するためのパッチを適用する機能を提供します。これにより、特定のカーネル機能の修正や拡張を行うことができるプラグインが、Liluを介してカーネルスペースで動作することができます。
2ndステージのカーネル拡張(kext)がスタート
macOSの起動プロセスには複数のステージが存在し、ここでは「2nd Stage (第2段階)」でのカーネル拡張の起動を指しています。
一般的なカーネル拡張のキャッシュがこの段階で起動します。
第二段階のカーネル拡張が起動する際、一般的にはオーディオやビデオに関連するカーネル拡張が起動します。
さらに、Library/Extensionsディレクトリのキャッシュもこの段階で起動します。このディレクトリは、システム全体で使用されるカーネル拡張を格納しています。
macOSユーザースペース開始
macOSの起動プロセスは、初めにカーネル (OSの中核部分)が起動し、その後にユーザースペースが開始します。ユーザースペースは、オペレーティングシステムの中でアプリケーションが実行される部分を指します。カーネルと対照的に、ユーザースペースはアプリケーションやサービスの動作のための領域です。
ユーザースペーススタート、WindowServerが開始
ユーザースペースが開始されると、OCLPではおなじみの「WindowServer」というプロセスも開始します。WindowServerは、macOSのGUI (グラフィカルユーザーインターフェース)を管理するためのプロセスです。
GPU (グラフィックスプロセッシングユニット)のアクセラレーション (高速化)が有効になります。
これでで、高度なグラフィック描写やアニメーションを効率的に実行することが可能になります。これにより、WindowServerがスムーズに動作し、macOSのユーザーインターフェースが快適に操作/表示されます。
さらに、ログインするためのユーザーアカウント情報がロードされます。
これにより、ユーザはログイン画面で自分のアカウントを選択してmacOSにログインすることができます。
これでOpenCore Legacy Patcherのブートシーケンスは終了です。
OpenCore Legacy Patcherのほとんどの処理はOpenCore (OpenCorePkg)が行っていました。
以下は「Boot Process with OpenCore Legacy Patcher」で掲載されているOpenCore Legacy Patcherブートプロセスの図を和訳したものです。
上記の説明を踏まえて、起動の流れを確認してみましょう。
まとめ
ここまで、OpenCore Legacy Patcherの起動プロセスに関して詳しく見てきました。
OpenCore Legacy Patcherを使用してmacOS をインストールするとユーザの目に触れないところで大変多くの処理を行い、古いMacでも最新のmacOSの新しい機能を利用できるようになります。
OCLPが行う処理を知ることで、私たちの生活が豊かに…なるわけではありませんが、今まで以上に愛用のMacを楽しく利用できるようになるかもしれません。
弊サイトと「おんかぼ!」では引き続きmacOS SonomaとOpenCore Legacy Patcherの最新情報をお届けします。
記事の更新については、かぼしーのTwitterアカウントやHumin.meで紹介しますので、ぜひフォローいただけると幸いです!
では!素敵なMacライフを!
OpenCore Legacy Patcherに関するよくある質問
Q: OpenCore Legacy Patcherはメモリ上にのみ展開され、ディスクには一切の変更を加えませんか?
A: 基本的にはディスク上のESPにOpenCoreを挿入し、起動時にメモリ上でパッチ処理を行います。
ただし、GPUアクセラレータ関連やワイヤレスモジュールなどのサポートを追加するためにルートパッチ(On-Disk Patchesとも)をインストールする必要があり、これはディスク上に変更を加えます。
Q: OpenCore Legacy PatcherでインストールしたmacOSの「macOS 復旧」を立ち上げることは可能ですか?
A: 可能です。OpenCore のブートピッカー上で「スペースキー」を押し、立ち上げたい「macOS 復旧 (macOS Recovery)」を選択します。詳しくは「OpenCoreでインストールしたmacOSのmacOS 復旧を立ち上げる方法」をご覧ください。
2024.05.29 タグ「OpenCore Legacy Patcher ドキュメント」を追加しました。