【macOSアップデート】vagrant upできない時に一通り試すと良いかもしれない方法

## はじめに
久しぶりに仮想環境を立ち上げようと思ったのですが、昔は実行できた`vagrant up`ができなくなっていました！

```
me@MacBook ~ % cd ~/vagrant/ubuntu64
me@MacBook~ % vagrant up

Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Running 'pre-boot' VM customizations...
==> default: Booting VM...

There was an error while executing `VBoxManage`, a CLI used by Vagrant
for controlling VirtualBox. The command and stderr is shown below.

Command: ["startvm", "{仮想マシン名}", "--type", "headless"]

Stderr: VBoxManage: error: The virtual machine 'ubuntu64_default_{仮想マシン名}' has terminated unexpectedly during startup with exit code 1 (0x1)
VBoxManage: error: Details: code NS_ERROR_FAILURE (0x80004005), component MachineWrap, interface IMachine
```

また何もしてないのに壊した…と思っていたのですが、どうやらOSをBig Surにアップデートしたことが原因のようでした。
試した方法をいろいろ書きますが、最終的にVirtualBoxのカーネルエクステンションのロードで解決したので、OSアップデートして同じ現象に悩まれている方やVirtualBoxの最新化を既に試行済みの方はそちらをご参照ください。

### 使用環境とバージョン
- macOS Big Sur（11.0.1）
- iTerm2 3.4.1
- Homebrew 2.5.11
- VirtualBox 6.1.16 r140961 (Qt5.6.3)（アップデート後）
- Vagrant 2.2.13（アップデート後）


## 仮想マシンを削除する
まず、今まで使っていた仮想マシン（Ubuntu）を削除しました。
仮想マシンの再インストールだけで問題が解決する場合もあるので、全部消す前に一度試すと良いと思います。OSアップデート起因ではない場合、有効かもしれません。
もっとも自分の環境では、これで解決はできませんでしたが。。。

①仮想マシンをインストールしたディレクトリを削除（自分の場合`~/vagrant/ubuntu64`）
②先程消したディレクトリを再作成し、そのディレクトリに移動

```
mkdir -p ~/vagrant/ubuntu64
cd ~/vagrant/ubuntu64
```

③ubuntuの再インストール

```
vagrant box add ubuntu/bionic64
```

④Vagrant を実行し、仮想マシンの設定ファイル（Vagrantfile）を作成

```
vagrant init ubuntu/bionic64
```

⑤Vagrantを起動

```
vagrant up
```

これで立ち上がれば万々歳ですが、自分の場合はまた`==> default: Booting VM....`の部分で同じエラーが発生したため、後続の方法を試しました。

## VirtualBoxとVagrantを最新版にアップデートする
今までのmacOSアップデートの記事を見て、最新版のインストールをしたら解決した例がありました。それに倣い、現在のバージョンを一度アンインストールし、最新版をインストールし直しました。（これも解決せずでしたが、試す価値はあると思います）

①Homebrewでvirtualboxとvagrantのアンインストール

```
brew cask uninstall virtualbox
brew cask uninstall vagrant
```

②（ここで一応ubuntuも削除）
③再インストール

```
brew cask install virtualbox
brew cask install vagrant
```

④（ubuntu再インストール）

再度`vagrant up`をしましたが、自分の場合また`Booting VM…`が越えられず…絶望…

## VirtualBoxのカーネルエクステンションをロードし、Oracleのソフトウェアの実行許可を出す
これが最終解決方法です。
VirtualBox, Vagrant, 仮想マシンのインストールが終わったら、以下のコマンドを実行します。kmutilという、Appleのカーネル拡張で使用するツールを使用し、macOSにVirtualBoxのカーネルエクステンションをロードするコマンドです。

```
sudo kmutil load -b org.virtualbox.kext.VBoxDrv
```

しかし実行すると、おそらく以下のメッセージが表示されると思います。

```
Extension with identifiers org.virtualbox.kext.VBoxNetAdp,org.virtualbox.kext.VBoxNetFlt,org.virtualbox.kext.VBoxDrv,org.virtualbox.kext.VBoxUSB not approved to load. Please approve using System Preferences.
```

このメッセージが表示されたら、システム環境設定 > セキュリティとプライバシーの下部にOracleのソフトウェア読み込みがブロックされた旨が出ているはずです。
右の「許可」ボタンを押し、PCの再起動を実行します。

![SystemPreference.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/469936/0cc0a8a4-0b7c-80c4-d960-97bb5b468347.jpeg)

再起動後、改めてvagrant upを実行します。

```
==> default: Booting VM…
```

を越えて

```
==> default: Machine booted and ready!
```

が出れば、仮想マシンの起動が無事にできたことになります！お疲れ様でした。
おそらくですが、以前のOSのバージョンでVirtualBoxをインストールした際、OracleのソフトウェアにmacOSのカーネルを使用する許可を出してVirtualBoxが起動できていたところ、OSアップデートによりその許可がなくなってしまったため、再度許可を出す必要があったのかな、と思います。

## おわりに
今回はmacOS アップデート後vagrant upができなくなった際の対応方法をご紹介しました。
巷で言われているVirtualBoxとVagrantのアップデートだけではエラーが解決しなかったので焦りましたが、なんとかすぐ解決して良かったです。またkmutilというコマンドは初めて見たので勉強になりました。

この記事がどなたかの参考になれば幸いです。また、何か間違いなどございましたら、そっと教えてください…！

お読みいただき、ありがとうございました！

## 参考にさせていただいたサイト

- [macOS Big SurでVirtualBoxが動かないので対応した話](https://www.mmpp.org/archives/2133)
- [Segmentation violation exception with Docker2.5.0](https://memo.xight.org/2020-11-09-1)
- [Installing a Custom Kernel Extension](https://developer.apple.com/documentation/apple_silicon/installing_a_custom_kernel_extension)