VirtualBoxにmacOS Mojaveをインストールする

**この方法は実験の末に出来た方法で明確な根拠がありません。実際に試す場合は注意してください。
また、ライセンス違反にならないようMac上のVirtualBoxにインストールするようにしてください。**

**2019/11/19 macOS Catalinaでも試してみました。少し変更点があったのでこちらをご覧ください。**
https://qiita.com/ykgeek/items/3098074c91da6943ef00

**2019/12/17 VirtualBoxがAPFSに対応したようです。詳しくはこちらをご覧ください。**
https://qiita.com/ykgeek/items/1798c1080c5c5ad5a22e

ここではすでにISOファイル化したmacOS Mojaveのインストールディスクを用意してあることを前提条件にします。

# TL;DR
- Mac high Sierra構成で仮想マシンを作成
- インストールディスクから起動する
    - ディスクを最初にHFS+で初期化する
    - 通常通りにインストールする
- インストール中に一度再起動がかかるのでEFI Shellから直接EFIを指定してインストールを続行する (FS1:\macOS Install Data\Locked Files\Boot Files\boot.efi)
- インストール完了時に再起動がかかるのでインストーラをもう一度起動する
    - ターミナルを起動する
    - diskutil mount /dev/disk0s1でEFI領域をマウントする
    - cp /Volumes/OS X Base System/usr/standalone/i386/apfs.efi /Volumes/EFI/
    - startup.nshファイルを作成する
- 再起動する。


# 一体何をしているのか
細かい操作が多いためおそらくTL;DRだけではまともに理解できないと思います。
だたやっていることは意外とシンプルです。
- 仮想マシンを作成する
- インストールする
- APFSのドライバーを用意し、それを読み込んで起動するためのスクリプトを作る

High Sierraあたりからインストール時にディスクのフォーマットがAPFSになりましたがVirtualBoxでは扱うことができないようです。そのためAPFSのドライバーを読み込むことにより対応しています。

## 仮想マシンを作成する
macOS 10.13 High Sierra (64-bit)構成がMojaveの環境に近いため、こちらをベースにしていきます。そこからさらにいくつか変更する箇所があります。

- 起動順序からフロッピーディスクを外す
- ビデオメモリを128MBに変更する
- インストールディスクをセットする
- オーディオを無効にする
- USBポートを3.0対応にする(VirtualBoxにextensionを入れる必要があります。)

メモリとプロセッサーはできるだけ多めに設定しておくと使いやすくなります。

## インストールする
仮想マシンを作成したらインストールディスクからmacOSを起動します。
インストールを始める前にインストール先のディスクを初期化します。

フォーマットはHFS+(Mac OS Extended)です。
インストール先のディスクを初期化しておかないとmacOSインストール時にインストール先としてディスクが表示されません。

ディスクを初期化したらいつも通りにインストールをしてください。

インストールは２段階で行われているようで、インストールディスクから必要なデータがコピーされると再起動がかかり、内蔵ディスクから起動してインストールを再開するようです。

ここでの再起動ではうまく起動できないようでEFIシェルに入ってしまいます。
直接起動に必要なファイルを起動させなければいけません。
EFIシェルで

```
"FS1:\macOS Install Data\Locked Files\Boot Files\boot.efi"
```
を実行するとインストールが続行されます。

## APFSのドライバーをコピーする
インストールが完了すると再起動がかかります。
しかしこの時にはすでに起動ディスクのファイルシステムがAPFSに変換されているためこのままでは起動できません。
そこでAPFSドライバーとドライバーを読み込んで起動するスクリプトを用意します。

もう一度インストーラから起動してください。
インストーラが起動したらターミナルを開きます。
そこで下記のコマンドを実行します。

``` bash
# EFIパーティションをマウントする
diskutil mount /dev/disk0s1
# APFSドライバーをインストーラーからコピーする
cp /Volumes/OS X Base System/usr/standalone/i386/apfs.efi /Volumes/EFI/
# APFSドライバーを読み込みOSを起動するスクリプトを作成する
cat > /Volumes/EFI/startup.nsh << EOF
load fs0:\apfs.efi
map -r
fs1:\System\Library\CoreServices\boot.efi
EOF

```

**2019/8/10追記**
なんらかのタイミングでパーティションの数字が変わってしまうようです。  
あまりスマートではありませんが、下記のようにifを使うことである程度柔軟に対応できます。

``` bash
# EFIパーティションをマウントする
diskutil mount /dev/disk0s1
# APFSドライバーをインストーラーからコピーする
cp /Volumes/OS X Base System/usr/standalone/i386/apfs.efi /Volumes/EFI/
# APFSドライバーを読み込みOSを起動するスクリプトを作成する
cat > startup.nsh << EOF
load fs0:\apfs.efi
map -r
IF EXIST fs1:\System\Library\CoreServices\boot.efi THEN
fs1:\System\Library\CoreServices\boot.efi
ENDIF
IF EXIST fs2:\System\Library\CoreServices\boot.efi THEN
fs2:\System\Library\CoreServices\boot.efi
ENDIF
IF EXIST fs3:\System\Library\CoreServices\boot.efi THEN
fs3:\System\Library\CoreServices\boot.efi
ENDIF
IF EXIST fs4:\System\Library\CoreServices\boot.efi THEN
fs4:\System\Library\CoreServices\boot.efi
ENDIF

EOF

```

ここまでできたらシャットダウンします。
その後インストールディスクを取り出してください。

## macOSを起動する
初回起動時の設定をしたらあとはいつも通り起動します。
macOSの仮想環境をお楽しみください。


# あとがき
今回はファイルシステムがAPFSのmacOSを起動する方法を紹介しました。
冒頭でも示した通り、あちこちのWebページをさまよい、実験を繰り返した結果できた方法です。
実際に試す際は注意してください。
もし間違いなどがあればご指摘いただければ幸いです。
また今後も検証を続け、内容を一部アップデートすることがあるかもしれません。

# Reference
- https://www.geekrar.com/fix-efi-internal-shell-on-macos-mojave-on-virtualbox/
- https://www.downtown.jp/~soukaku/archives/2015/1231_173459.html
- https://www.mindto01s.com/2018/07/24/7b66f018_7d1d_468e_ab70_bcdeac4b0d80.html