Ubuntu Desktop 16.04でVirtualBoxが動かないときの対処方法


開催した勉強会、[Nagoya.cloud.first #1](https://nagoyacloud.connpass.com/event/78769/)で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のインスタンスを立て、次のコマンドを実行することで確認できました。

```bash
$ 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](https://askubuntu.com/questions/994315/virtualbox-crash-on-kernel-4-13-0-26/994653#994653)で回答されているように、VirtualBoxのバージョンを上げることで対策可能です。VirtualBox公式に掲載されている手順に従えば、Virtualbox 5.2系がインストールできます。

幾つか不具合報告がなされているため、VirtualBoxをアンインストールしてから実行するほうが良いかもしれません。アンインストールは次のコマンドでできます。

```bash
apt autoremove 'virtualbox*'
```

補足 : Linuxカーネルのバージョンを上げる理由
-----------------------------------------------------

Ubuntu Japanese Teamの連載する[Ubuntu Weekly Topics](http://gihyo.jp/admin/clip/01/ubuntu-topics)では[2018年3月2日号　Spectre/Meltdown対策さらにさらにその後・3月初旬編：Ubuntu Weekly Topic](http://gihyo.jp/admin/clip/01/ubuntu-topics/201803/02)で次のように解説されています。

> Meltdownは，基本的にKPTIによって対処済みです。詳細は次の通りです。
> * カーネルを含めた，他のプロセスのメモリの中身を読み取ることが可能な問題。すでに攻撃コードに転用可能なサンプルが存在しており，攻撃も十分に可能と考えられる。「⁠なんらかの信用できないコードが実行されうる環境」では必ず対策が必要。
> * 対策には基本的にカーネルのPTI（KPTI）が必要。KPTIを有効にすることで，ワークロードによっては一定の性能劣化が発生する場合がある。
> * UbuntuにはKPTIが実装済みで，デフォルトで有効（1-2月に提供された新しいカーネルへのアップデートが必要）⁠。

このような理由から、Ubuntuをデスクトップ環境で利用している場合、カーネルのアップデートを行ったほうが良いでしょう。

クラウド環境で新規にVMを立てて運用する場合、クラウド事業者側で既にカーネルのバージョンが上げられている場合があります。例えば、2018/03/11現在、GCPでUbuntu 16.04のイメージを利用してインスタンスを作成した場合、カーネルのバージョンは4.13.0になっていました。


Special Thanks
-----------------------------------------------------

次のツイートにより今回の事象の発生原因と、対策方法を特定できました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">aptで入れたvirtualboxの仮想マシンにwindows入れようとしたらPCがフリーズしたからVMWareにしたら完璧</p>&mdash; intelf+++ (@intelfike) <a href="https://twitter.com/intelfike/status/972657565094957056?ref_src=twsrc%5Etfw">2018年3月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

また、検証とその結果についても教えていただきました。ありがとうございました。

<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"># aptでver5.0削除<br>apt autoremove &#39;virtualbox*&#39;<br><br># debパッケージでver5.2インストール<a href="https://t.co/3qZ7rcGyn0">https://t.co/3qZ7rcGyn0</a><br><br>主にすることはこれだけですが、仔細については先ほどのツイートの記事などが参考になるかと思います</p>&mdash; intelf+++ (@intelfike) <a href="https://twitter.com/intelfike/status/972695815708860416?ref_src=twsrc%5Etfw">2018年3月11日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>