macOSと仮想マシン
仮想化ソフトとは、コンピュータの上にまた別の「仮想の」コンピュータの上を作成、別のOSを実行するソフトウェアです。ネイティブのOSでは動作しないソフトを実行させたり、複数台のコンピュータがなければできないことを1台のハードウェアで実現できます。
Mac用の仮想化ソフトとしては、商用製品の「VMウェア・フュージョン(VMware Fusion)」、「パラレルス・デスクトップ(Parallels Desktop)」、フリーソフトの「バーチャルボックス(VirtualBox)」が有名です。これらの製品の主な目的は、もちろんMac上でウィンドウズを動作させ、ウィンドウズソフトとMacソフトを一緒に動かすためですが、macOSも仮想マシンの上で実行できます。パラレルスなどでは新規仮想マシンのリストにmacOSが用意されているほどです。これでMac上でバーチャルなMacを使えるわけですが、macOSを仮想マシン上で動作させるにはライセンス上の問題と、技術的な問題があります。
まず、macOSはライセンス上「Macコンピュータ」でしか実行が許諾されていません。つまり、アップル製ではないコンピュータでmacOSを実行するのはライセンス違反となります。仮想マシンはアップル製コンピュータではないので、macOSの仮想化はライセンス違反ではないかと指摘されていました。しかしこれは、10・7ライオン以降で仮想化に関する記述が利用許諾に追記され、最大2つの追加コピーを実行可能、つまりmacOSをインストールした仮想マシンを使うことが公式に許可されたのです。
EFIがOSを読み込む
さて、少々前置きが長くなりましたが、ここでmacOSハイ・シエラで登場したAPFSが仮想マシンで使えないという問題が起きています。仮想マシンを作ってもmacOS拡張フォーマットのままになってしまうのです。これはどういうことなのか、仮想マシンの起動プロセスを理解することでわかってくるので解説しましょう。
仮想マシンは実際のPCをソフトウェアで再現するものですから、起動についても実際のコンピュータと同じように振る舞います。たとえばフュージョンの場合は、実際のPCでも使われていた「PhoenixBIOS」が採用されいるなど、仮想マシンにもBIOSがありPCと同じ手順でOSを起動するため、ウィンドウズやリナックスなどのOSは特に変更なく利用できます。
しかし、MacではPCでいうところのBIOSがなく、代わりにEFIとも呼ばれるファームウェアが使われています。macOSはEFIが読み込んで起動しているので、macOSをインストールするにはこのEFIをサポートしなければなりません。
最近では、PCでもUEFI(Universal EFI)という名称でEFIが採用されつつあり、たとえばマイクロソフトの「サーフェイス(Surface)」はUEFIベースです。それでは、EFIをサポートしたPCならmacOSがインストールおよび起動ができるのでしょうか?
答えはそれだけではできません。PCのUEFIはmacOS拡張のボリュームが読めませんので、仮にインストール済みのボリュームを与えてもmacOSを読むことができず、起動できません。
Mac用仮想化ソフトでmacOSが起動できるのは、各社が自前でEFIを用意したうえに、macOS拡張を読み書きできるよう拡張しているためです。
macOSがファームウェアを書き換える
すでにハイ・シエラへアップグレードした方は、その際に再起動が何度か行われ、林檎マークだけの画面にプログレスバーが表示されたものを見たかと思います。その前後の挙動からAPFSのサポートをファームウェアに追加し、APFSのボリュームからmacOSを起動できるようにしていると推測できます。
実は、ハイ・シエラはアップグレード時にファームウェアアップデートも同時に実行するのです。OSのアップデート時に必要に応じてファームウェアまでアップデートできるのは、ハードもソフトもどちらも作ってるアップルならではといえます。
そして、フュージョンやバーチャルボックスのファームウェアもEFIですが、それぞれ独自に開発されているので、ハイ・シエラのインストーラはそのEFIをアップデートできません。このため、仮想マシンのEFIはAPFSが読み書きできない状態で、ハイ・シエラのインストールが進められます。
フュージョンドライブ(Fusion Drive)やハードディスクと同じく、APFSが対応できない構成だと判断すると、ハイ・シエラのインストーラは起動ボリュームをAPFSへの変換せず、macOS拡張のままでインストールを続行するのです。
これが、仮想マシン上でAPFSの利用ができない理由です。自力でmacOS拡張をサポートしたように、VMウェアやパラレルスがAPFSドライバを開発してEFIに追加すればよい話ですが、ソースコードが公開されていて仕様がわかりきってるmacOS拡張と異なり、実装されてから間もないAPFSは実際の仕様が何も公開されていません。作ろうにも作れないわけです。
macOSの仮想化自体がニッチであるので今のところ問題は表面化していませんが、もしもAPFSに対応することができれば、仮想マシンのパフォーマンス向上が期待されるので、今後の動向が気になるところです。
【 それでもAPFSで仮想マシンを起動? 】
VMware Fusionなど各社の仮想化ソフトが搭載するEFIでは、APFSを読むことができずAPFSにインストールされたHigh Sierraを起動できません。にもかかわらずAPFSから仮想マシンの起動に成功した人たちがいます。この仕掛けはリカバリボリュームにあります。High Sierraでは通常、APFSの中にリカバリボリュームを作ります。ところが、この人達はリカバリボリュームをAPFSの外にmacOS拡張で作成し、リカバリボリューム内のブートローダからカーネルからを読み込み起動、その後はAPFSにあるルートボリュームをマウントしているわけです。なかなかトリッキーですが、どうしてもAPFSを仮想マシンで使いたい場合は試してみるといいでしょう。
【 EFIとEFIシステムパーティション 】
厳密にはEFIとはExtensible Firmware Interface、拡張可能なファームウェアのための共通インターフェイスを定めたもの。EFIという規約に従っていれば柔軟に機能を追加できるのがEFI対応のファームウェアですが、規約とファームウェアそのものが混同されているのが現実です。さて、ファームウェアを拡張するモジュールをどこに配置するために、EFI対応のコンピュータではストレージの前方に100~300MB程度のvFATのパーティションが存在します。これがEFIパーティションとか、ESP(EFIシステムパーティション)と呼ばれるものです。ESPにはブートローダ以外のものも配置できます。起動するOSを選ぶブートメニューや管理用のコマンド、vFAT以外のファイルシステムへアクセスするためのドライバなどがです。
macOSのライセンス
Mac App Storeにて提供されるMac OS X 10.7 Lion以降では、1つのMacコンピュータ上で直接インストールされるmacOSに加えて、2つのインスタンス、つまり仮想マシン上のmacOSを実行することが可能です。ただし、これを利用した商用サービス的な利用については制限されていることには注意しましょう。【URL】https://www.apple.com/jp/legal/sla/
ファームウェアのアップグレード
macOS High Sierraのインストール時、何度も再起動されるのはファームウェアをアップグレードして、ファームウェアがAPSFのボリュームを読み書きできるようにしていると考えられます。
従来のMacの起動プロセス
従来のMacの起動プロセスはまず、ファームウェアがコンピュータを初期化し、MacのファームウェアはmacOS拡張のボリュームを読み込み、boot.efiブートローダを実行。ブートローダがmachカーネルやデバイスドライバを読み込み、macOSを起動します。
仮想マシンでの起動プロセス
仮想化ソフトのベンダーがそれぞれ自前でEFIを実装、macOSの起動に対応しています。これはPC標準のUEFIをベースにしつつ、macOS拡張のドライバを自前で開発、ESPではなくmacOS拡張上にあるboot.efiを読み込めるように拡張したものです。
High SierraにアップグレードしたMacの起動プロセス
High Sierraにアップグレードすると、ファームウェアがAPFSが読み込めるようになっているため、直接APFSのボリュームを読み込んで、boot.efiブートローダを実行。ブートローダがmachカーネルやデバイスドライバを読み込み、macOSを起動します。
文●千種菊理
本職はエンタープライズ系技術職だが、一応アップル系開発者でもあり、二足の草鞋。もっとも、近年は若手の育成や技術支援、調整ごとに追い回されコードを書く暇もなく、一体何が本業やら…。