VirtualBox(mac+vagrant)上のCentOS7にVirtualBoxをインストールする

VirtualBox(mac+vagrant)上のCentOS7で、kubernetes(minikube)を動かそうとしたときに、CentOS7にVirtualBoxをインストールする必要がありました。

その時の手順を記載しておこうと思います。

# yumリポジトリをCentOSに追加

以下の公式サイトのページを参考に、VirtualBoxのyumリポジトリをCentOSに追加します。

※公式サイトのページ：https://www.virtualbox.org/wiki/Linux_Downloads
　「RPM-based Linux distributions」セクションの最下部をご覧ください。

```terminal
$ sudo wget https://download.virtualbox.org/virtualbox/rpm/el/virtualbox.repo -O /etc/yum.repos.d/virtualbox.repo
```

# 改竄有無チェック用の公開鍵をCentOSにインポート

先ほどの公式サイトのページには

>Note that importing the key is not necessary for yum users (Oracle Linux/Fedora/RHEL/CentOS) when using one of the virtualbox.repo files from below as yum downloads and imports the public key automatically!

>（Google翻訳）yumは公開キーを自動的にダウンロードしてインポートするため、下からvirtualbox.repoファイルのいずれかを使用する場合、yumユーザー（Oracle Linux / Fedora / RHEL / CentOS）にはキーをインポートする必要はありません。 

と書かれていますが、実際にはそんなことはありません。

なぜなら、後ほどインストール可能なバージョンを確認するために

```terminal
yum list |grep Virtual
```
をする必要があり、事前に改竄有無チェックのための公開鍵がCentOSにインポートされている必要があるからです。なので、この公開鍵のインポートは結局必要となります。
（もちろん、インストール可能なバージョンが事前に分かっている場合はこの限りではありません。）

公式サイトに記載されている通り、公開鍵をインポートします。

```
wget https://www.virtualbox.org/download/oracle_vbox.asc
sudo rpm --import oracle_vbox.asc
```

# VirtualBoxをインストール

インストール可能なVirtualBoxのバージョンを確認します。

```terminal
$ yum list |grep Virtual

VirtualBox-4.3.x86_64                       4.3.40_110317_el7-1        virtualbox
VirtualBox-5.0.x86_64                       5.0.40_115130_el7-1        virtualbox
VirtualBox-5.1.x86_64                       5.1.38_122592_el7-1        virtualbox
VirtualBox-5.2.x86_64                       5.2.38_136252_el7-1        virtualbox
VirtualBox-6.0.x86_64                       6.0.18_136238_el7-1        virtualbox
VirtualBox-6.1.x86_64                       6.1.4_136177_el7-1         virtualbox
```

最新版をインストールします。

```terminal
sudo yum install VirtualBox-6.1.x86_64
```

# カーネルモジュールをインストール

virtualboxが動くか確認してみましょう。

```terminal
$ virtualbox

WARNING: The vboxdrv kernel module is not loaded. Either there is no module
         available for the current kernel (3.10.0-957.12.2.el7.x86_64) or it failed to
         load. Please recompile the kernel module and install it by

           sudo /sbin/vboxconfig

         You will not be able to start VMs until this problem is fixed.
Qt FATAL: QXcbConnection: Could not connect to display 
Aborted
```

エラーとなってしまいました。エラメッセージに`sudo /sbin/vboxconfig`を実行せよ、と書いてありますので、素直に実行してみます。

```terminal
$ sudo /sbin/vboxconfig

vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
This system is currently not set up to build kernel modules.
Please install the gcc make perl packages from your distribution.
Please install the Linux kernel "header" files matching the current kernel
for adding new hardware support to the system.
The distribution packages containing the headers are probably:
    kernel-devel kernel-devel-3.10.0-957.12.2.el7.x86_64
```

エラーとなりました。エラーメッセージを見てみると、

```
Please install the gcc make perl packages from your distribution.
```
とのことなので素直にインストールします。

```terminal
$ sudo yum install gcc make perl
```

さらに、エラーメッセージには以下の記載もありました。

```
Please install the Linux kernel "header" files matching the current kernel for adding new hardware support to the system.
The distribution packages containing the headers are probably:
    kernel-devel kernel-devel-3.10.0-957.12.2.el7.x86_64
```
kernel-develが無いということなので、こちらも素直にインストールします。

```terminal
$ sudo yum install kernel-devel
```

設定を有効にするためにCentOSを再起動して、リトライです。（再起動は不要なのかもしれません）

```
$ sudo /sbin/vboxconfig

Please install the Linux kernel "header" files matching the current kernel for adding new hardware support to the system.
The distribution packages containing the headers are probably:
    kernel-devel kernel-devel-3.10.0-957.12.2.el7.x86_64
```

あれ？「kernel-devel」が無い、ということで、同じエラーです。

SELinuxが関係してるのかなと思い、SELinuxをDisabledにしてみたのですが、状況は変わりませんでした。

色々と調べてみると、CentOSのkernelのバージョンに対応するkernel-develがインストールされていないことが原因のようでした。

```terminal
$ sudo yum install kernel-devel
```

としてしまうと、最新版のkenel-develがインストールされてしまいます。最新版のkenel-develは、CentOSのkernelのバージョンと整合性が無いので、エラーが起きてしまったのです。

詳しくは以下の解説をご覧ください。大変参考になります。こちらに記載の手順を実施して、CentOSのkernelのバージョンと整合性があるkernel-develをインストールしましょう。
　https://qiita.com/metheglin/items/60261f474ccdfb467574

その後、リトライしてみます。

```terminal
$ sudo /sbin/vboxconfig

vboxdrv.sh: Stopping VirtualBox services.
vboxdrv.sh: Starting VirtualBox services.
vboxdrv.sh: Building VirtualBox kernel modules.
```

やっとうまくいきました！

# おまけ
今回は、macのVirtualBox上でCentOS7を動かし、そのCentOS上でVirtualBoxを動かそうとしていました。それによって、CentOS上でkubernetes(minikube)を動かそうとしました。

こういったVMの中でさらにVMを動かす、ということを「ネステッドVM」と呼びます。

しかし、このネステッドVMは、macのVirutualBoxでは使えませんでした。AMDのCPUしか対応してないらしく、macのIntel CPUでは使えないとのこと。せっかく本記事のように頑張ったのに、残念でした・・・。

VirtualBox上のCentOS7でkubernetesを動かすのは諦めて、mac上で動かしてみることにしました（おわり）。