開催した勉強会、Nagoya.cloud.first #1でUbuntu 16.04でVirtualBoxを用いてVirtual Machineが作成できないという事象に遭遇したのですが、その原因と解決方法についてあたりがつきましたので共有します。
TL;DR
- Ubuntu 16.04でリポジトリを編集せずに
apt
コマンドでVirtualBoxを入れた場合、仮想マシンを作成後、isoイメージを読み込ませようとするとホストOSごとフリーズする場合がある - Meltdown対応のためにカーネルのバージョンが上がっていることが原因
- 最新のVirtualBox(>=5.2)を利用することで対処可能
発生条件
Ubuntu 16.04を入れた直後にapt
でVirtualBoxをインストールすると、少し古いバージョン5.0のものがインストールされます。GCPでUbuntu16.04のインスタンスを立て、次のコマンドを実行することで確認できました。
$ sudo apt update; sudo apt upgrade
$ sudo apt install virtualbox
(略)
Setting up virtualbox (5.0.40-dfsg-0ubuntu1.16.04.2) ...
vboxweb.service is a disabled or a static unit, not starting it.
(略)
バージョン確認は次のコマンドでもできます。
$ VBoxManage -v
5.0.40_Ubuntur115130
この状態で、kernelのバージョンを4.13以降にあげている場合、VirtualBoxに作成したVMにisoファイルをマウントさせて起動させるとホストOSごとフリーズします。GUI環境でのみこの現象を確認しましたが、CUI環境(例えば、サーバーとして利用している場合や、Vagrantを利用している場合)では確認を行っていません。
解決策 : VirtualBoxのバージョンを5.2以上に上げる
virtualbox crash on kernel 4.13.0-26 - Ask Ubuntuで回答されているように、VirtualBoxのバージョンを上げることで対策可能です。VirtualBox公式に掲載されている手順に従えば、Virtualbox 5.2系がインストールできます。
幾つか不具合報告がなされているため、VirtualBoxをアンインストールしてから実行するほうが良いかもしれません。アンインストールは次のコマンドでできます。
apt autoremove 'virtualbox*'
補足 : Linuxカーネルのバージョンを上げる理由
Ubuntu Japanese Teamの連載するUbuntu Weekly Topicsでは2018年3月2日号 Spectre/Meltdown対策さらにさらにその後・3月初旬編:Ubuntu Weekly Topicで次のように解説されています。
Meltdownは,基本的にKPTIによって対処済みです。詳細は次の通りです。
- カーネルを含めた,他のプロセスのメモリの中身を読み取ることが可能な問題。すでに攻撃コードに転用可能なサンプルが存在しており,攻撃も十分に可能と考えられる。「なんらかの信用できないコードが実行されうる環境」では必ず対策が必要。
- 対策には基本的にカーネルのPTI(KPTI)が必要。KPTIを有効にすることで,ワークロードによっては一定の性能劣化が発生する場合がある。
- UbuntuにはKPTIが実装済みで,デフォルトで有効(1-2月に提供された新しいカーネルへのアップデートが必要)。
このような理由から、Ubuntuをデスクトップ環境で利用している場合、カーネルのアップデートを行ったほうが良いでしょう。
クラウド環境で新規にVMを立てて運用する場合、クラウド事業者側で既にカーネルのバージョンが上げられている場合があります。例えば、2018/03/11現在、GCPでUbuntu 16.04のイメージを利用してインスタンスを作成した場合、カーネルのバージョンは4.13.0になっていました。
Special Thanks
次のツイートにより今回の事象の発生原因と、対策方法を特定できました。
aptで入れたvirtualboxの仮想マシンにwindows入れようとしたらPCがフリーズしたからVMWareにしたら完璧
— intelf+++ (@intelfike) 2018年3月11日
また、検証とその結果についても教えていただきました。ありがとうございました。
# aptでver5.0削除
— intelf+++ (@intelfike) 2018年3月11日
apt autoremove 'virtualbox*'
# debパッケージでver5.2インストールhttps://t.co/3qZ7rcGyn0
主にすることはこれだけですが、仔細については先ほどのツイートの記事などが参考になるかと思います