概要
Windows環境で、VirtualBoxとDockerを併用しているときにVirtualBoxで躓いた箇所があったのでそのときのメモです。
詳細
ことの発端
私の所属している会社では、昔からあるプロジェクトはVirtualBox、最近のプロジェクトはDockerでの開発を行っています。
VirtualBoxの6.1.14~6.1.16あたりでDockerとVirtualBoxが共存で動かせるとのことだったので、共存で動くように設定し、昔からあるプロジェクトの作業をするときはVirtualBoxを立ち上げ、最近のプロジェクトの場合はDockerを立ち上げて作業を行っています。
※VirtualBoxとDockerの共存設定参考記事
そのような環境で作業している中である時、昔からある方のプロジェクトでmongoDBのバージョン3系列から5もしくは6にアップデートする要件があり、じゃあVirtualBox上のCentOS7にmongoDB6.0を入れて動かしてみたところ・・・
Illegal instruction
というログが出て動きませんでした。。。
詳しいログ
$ 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.
原因
mongoDBの5.0系列以降ではAVXという拡張命令セットが有効になっている必要があるそうです。
MongoDB 5.0 requires use of the AVX instruction set, available on
select Intel and AMD processors.
※mongodbのproduction-notes/#platform-support-notes
のページ記載
AVXが有効であれば(CentOS7上で)lscpu
コマンドでFlagsの箇所を見るとavx
やavx2
と表示されるはずが、表示されていませんでした。
解決
VirtualBoxとDockerを共存させるために
bcdedit /set hypervisorlaunchtype auto
のコマンドを行っていたため、VirtualBoxで起動したCentOSのAVXが有効になっていない状態となっていました。
管理者権限で起動したコマンドプロンプト(またはPowerShell)で下記のコマンドを実行した後ホストを再起動することでVirtualBoxで起動したCentOSのAVXが有効になります。
bcdedit /set hypervisorlaunchtype off
ただし、この状態ではDockerやWSLを使うことはできなくなってしまう。
DockerやWSLを使うときには管理者権限で下記コマンド実行後、ホストマシンを再起動する必要があります。
bcdedit /set hypervisorlaunchtype auto
※私の環境の場合、「Windowsの機能の有効化または無効化」の方からHyper-Vの機能のON/OFFではAVXの有効無効は関係ありませんでした。
備考
- 私の場合はmongoDBをVirtualBox上のCentOS7に入れて動かそうとしたらこの事象に遭遇しましたが、ざっくり調べたところ、tensorflowなんかを動かすときにもavxが必要なようです
- VirtualBoxではなく、VMWareなら・・・と試してみたところ、VMWareの場合は特に設定もなく動きました。
- 会社PCがIntel製CPU(i7-10510U)、家PCがAMD製CPU(Ryzen 5 5600X)だったので、家PCの方でも試してみたところ、同じ結果となりました
終わりに
WindowsでVirtualBoxとDocker共存できる!やったー!って思ってたところ、こういう事象があると面倒ですね。。。(対応は可能とは言えホストマシンの再起動が必要なので面倒・・・)
可能であれば昔のものもDockerに移行したほうがいいのかなぁと(とは言えWindowsのDocker固有の問題もあるのですんなりとはいかない現実。。。)