WindowsでVirtualBoxとDockerを併用するときに気をつけること(AVX)

# 概要

Windows環境で、VirtualBoxとDockerを併用しているときにVirtualBoxで躓いた箇所があったのでそのときのメモです。

# 詳細

## ことの発端

私の所属している会社では、昔からあるプロジェクトはVirtualBox、最近のプロジェクトはDockerでの開発を行っています。
VirtualBoxの6.1.14～6.1.16あたりでDockerとVirtualBoxが共存で動かせるとのことだったので、共存で動くように設定し、昔からあるプロジェクトの作業をするときはVirtualBoxを立ち上げ、最近のプロジェクトの場合はDockerを立ち上げて作業を行っています。

※VirtualBoxとDockerの共存設定参考記事

https://qiita.com/picato1123/items/992f84fa41f78dd37030

そのような環境で作業している中である時、昔からある方のプロジェクトでmongoDBのバージョン3系列から5もしくは6にアップデートする要件があり、じゃあVirtualBox上のCentOS7にmongoDB6.0を入れて動かしてみたところ・・・

`Illegal instruction` というログが出て動きませんでした。。。

<details>
<summary>
詳しいログ
</summary>


```sh
$ systemctl status mongod.service

--->
● mongod.service - MongoDB Database Server
   Loaded: loaded (/usr/lib/systemd/system/mongod.service; enabled; vendor preset: disabled)
   Active: failed (Result: signal) since Sun 2022-10-23 05:20:28 EDT; 7s ago
     Docs: https://docs.mongodb.org/manual
  Process: 18762 ExecStart=/usr/bin/mongod $OPTIONS (code=killed, signal=ILL)
  Process: 18761 ExecStartPre=/usr/bin/chmod 0755 /var/run/mongodb (code=exited, status=0/SUCCESS)
  Process: 18757 ExecStartPre=/usr/bin/chown mongod:mongod /var/run/mongodb (code=exited, status=0/SUCCESS
)
  Process: 18756 ExecStartPre=/usr/bin/mkdir -p /var/run/mongodb (code=exited, status=0/SUCCESS)

Oct 23 05:20:28 localhost.localdomain systemd[1]: Starting MongoDB Database Server...
Oct 23 05:20:28 localhost.localdomain systemd[1]: mongod.service: control process exited, code=kille...s=4
Oct 23 05:20:28 localhost.localdomain systemd[1]: Failed to start MongoDB Database Server.
Oct 23 05:20:28 localhost.localdomain systemd[1]: Unit mongod.service entered failed state.
Oct 23 05:20:28 localhost.localdomain systemd[1]: mongod.service failed.
Hint: Some lines were ellipsized, use -l to show in full.
```

</details>

## 原因

mongoDBの5.0系列以降では[AVX](https://ja.wikipedia.org/wiki/%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0SIMD%E6%8B%A1%E5%BC%B5%E5%91%BD%E4%BB%A4#Intel_AVX)という拡張命令セットが有効になっている必要があるそうです。

> MongoDB 5.0 requires use of the AVX instruction set, available on 
select Intel and AMD processors.

※mongodbの[production-notes/#platform-support-notes
](https://www.mongodb.com/docs/manual/administration/production-notes/#platform-support-notes) のページ記載

AVXが有効であれば(CentOS7上で)`lscpu`コマンドでFlagsの箇所を見ると`avx`や`avx2`と表示されるはずが、表示されていませんでした。


## 解決

VirtualBoxとDockerを共存させるために

```powershell
bcdedit /set hypervisorlaunchtype auto
```

のコマンドを行っていたため、VirtualBoxで起動したCentOSのAVXが有効になっていない状態となっていました。

管理者権限で起動したコマンドプロンプト(またはPowerShell)で下記のコマンドを実行した後ホストを再起動することでVirtualBoxで起動したCentOSのAVXが有効になります。

```powershell
bcdedit /set hypervisorlaunchtype off
```

ただし、この状態ではDockerやWSLを使うことはできなくなってしまう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/9c33700c-3547-c711-a69e-44aae84ed64d.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/127686/2f5393df-5e2f-8dac-be2f-7964286a3134.png)

DockerやWSLを使うときには管理者権限で下記コマンド実行後、ホストマシンを再起動する必要があります。

```powershell
bcdedit /set hypervisorlaunchtype auto
```

※私の環境の場合、「Windowsの機能の有効化または無効化」の方からHyper-Vの機能のON/OFFではAVXの有効無効は関係ありませんでした。

## 備考

- 私の場合はmongoDBをVirtualBox上のCentOS7に入れて動かそうとしたらこの事象に遭遇しましたが、ざっくり調べたところ、tensorflowなんかを動かすときにもavxが必要なようです
    - [Tensorflowを1.6以上にすると、CPUによっては実行できなくなる／tensorflowのバージョン指定インストールの方法](https://arakan-pgm-ai.hatenablog.com/entry/2018/06/21/090000)
- VirtualBoxではなく、VMWareなら・・・と試してみたところ、VMWareの場合は特に設定もなく動きました。
- 会社PCがIntel製CPU(i7-10510U)、家PCがAMD製CPU(Ryzen 5 5600X)だったので、家PCの方でも試してみたところ、同じ結果となりました


# 終わりに

WindowsでVirtualBoxとDocker共存できる！やったー！って思ってたところ、こういう事象があると面倒ですね。。。(対応は可能とは言えホストマシンの再起動が必要なので面倒・・・)
可能であれば昔のものもDockerに移行したほうがいいのかなぁと(とは言えWindowsのDocker固有の問題もあるのですんなりとはいかない現実。。。)