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

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

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


前回の[VirtualBoxにmacOS Mojaveをインストールする](https://qiita.com/ykgeek/items/c0938d943b131dadc652)のCatalina版です。
おおよそ前回と変わりませんが、若干ディレクトリ名が変更されるなどの変化があったので改めて投稿します。

ここではすでにISOファイル化したmacOS Catalinaのインストールディスクを用意してあることを前提条件にします。
~~(そのうち作成方法を記事にするかもしれません。)~~
2019/11/23 更新
インストールディスクイメージの作成方法は[こちら](https://qiita.com/ykgeek/items/d1ed297c00577ba215ef)です。

# 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)構成がCatalinaの環境に近いため、こちらをベースにしていきます。そこからさらにいくつか変更する箇所があります。

- 起動順序からフロッピーディスクを外す
- ビデオメモリを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/macOS\ Base\ System/usr/standalone/i386/apfs.efi /Volumes/EFI/
# APFSドライバーを読み込みOSを起動するスクリプトを作成する
cat > /Volumes/EFI/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
IF EXIST fs5:\System\Library\CoreServices\boot.efi THEN
fs5:\System\Library\CoreServices\boot.efi
ENDIF

EOF

```

`startup.nsh`のコードはあまりスマートではありませんが、下記のようにifを使うことでドライブの番号が変わっても柔軟に対応できます。

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

## 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