Vagrant と VirtualBox Guest Additions の関係について

知りたいことがずばり書かれている記事を見つけられなかったので、まとめておきます。

## VirtualBox Guest Additions とは


VirtualBox Guest Additions (vbguest) は、VM にインストールして使う拡張機能です。

共有フォルダ機能 ([`synced_folder` の `type: virtualbox`](https://www.vagrantup.com/docs/synced-folders/virtualbox)) などで必要になります。

## VirtualBox 本体と Guest Additions のバージョンは揃っているのが望ましい

<img alt="image.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2596/83fc48e8-f49a-8915-2cc8-9944d8339055.png">

バージョンが揃っていなくても動きますが、`vagrant up` で起動時に以下のように警告が出ます。

```
==> default: Checking for guest additions in VM...
    default: The guest additions on this VM do not match the installed version of
    default: VirtualBox! In most cases this is fine, but in rare cases it can
    default: prevent things such as shared folders from working properly. If you see
    default: shared folder errors, please make sure the guest additions within the
    default: virtual machine match the version of VirtualBox you have installed on
    default: your host and reload your VM.
```

「たいてい大丈夫だけど、レアケースで共有ディレクトリが動かなくなったりするよ」とのこと。

## Vagrant の box には Guest Additions が最初から含まれているものがある

Vagrant box には、最初から Guest Additions が含まれているものと、そうでないものがあります。

box に Guest Additions が入っているかどうかは、外からは判別がつきません。少なくとも Vagrant Cloud の画面からは判断できないと思います。

例えば、CentOS 公式 `centos/8` の現時点で最新バージョンには入っていません。

 * https://app.vagrantup.com/centos/boxes/8

Chef の `bento/centos-8` には入っています。

 * https://app.vagrantup.com/bento/boxes/centos-8

非エンジニアに使ってもらう場合は、最初から入っている box のほうが便利そうです。VirtualBox とバージョンが多少ずれていても、たいていは動くみたいなので。

もし動かなくなったら、VirtualBox と box の両方を最新にしてもらうような運用で行けるのでは、、と思っています。

## Guest Additions が入っているかどうかの確認方法

起動時のメッセージで区別が付きます。以下は入っていない場合。

```
==> default: Checking for guest additions in VM...
    default: No guest additions were detected on the base box for this VM! Guest
    default: additions are required for forwarded ports, shared folders, host only
    default: networking, and more. If SSH fails on this machine, please install
    default: the guest additions and repackage the box to continue.
```

また、ログイン後に `lsmod` で確認ができます。

```
[vagrant@localhost ~]$ lsmod
:
vboxguest             292797  2 vboxsf
:
```

## vagrant-vbguest プラグインの挙動

Vagrant に `vagrant-vbguest` プラグインを入れると、インストールや Virtualbox のバージョンに合わせたアップデートを自動でやってくれるようです。

プラグインを入れた状態で、`centos/8` で `vagrant up` すると、以下のエラーで止まりました。

```
[default] No Virtualbox Guest Additions installation found.
Last metadata expiration check: 0:00:01 ago on Sun 07 Jun 2020 01:03:38 AM UTC.
Package centos-release-8.0-0.1905.0.9.el8.x86_64 is already installed.
Dependencies resolved.
================================================================================
 Package               Arch         Version                  Repository    Size
================================================================================
Upgrading:
 centos-release        x86_64       8.1-1.1911.0.9.el8       BaseOS        21 k
Installing dependencies:
 centos-gpg-keys       noarch       8.1-1.1911.0.9.el8       BaseOS        12 k
 centos-repos          x86_64       8.1-1.1911.0.9.el8       BaseOS        13 k

Transaction Summary
================================================================================
Install  2 Packages
Upgrade  1 Package

Total download size: 45 k
Downloading Packages:
(1/3): centos-gpg-keys-8.1-1.1911.0.9.el8.noarc  11 kB/s |  12 kB     00:01
(2/3): centos-release-8.1-1.1911.0.9.el8.x86_64  19 kB/s |  21 kB     00:01
(3/3): centos-repos-8.1-1.1911.0.9.el8.x86_64.r 9.1 kB/s |  13 kB     00:01
--------------------------------------------------------------------------------
Total                                            16 kB/s |  45 kB     00:02
warning: /var/cache/dnf/BaseOS-31c79d9833c65cf7/packages/centos-gpg-keys-8.1-1.1911.0.9.el8.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
CentOS-8 - Base                                 255 kB/s | 1.6 kB     00:00
Importing GPG key 0x8483C65D:
 Userid     : "CentOS (CentOS Official Signing Key) <security@centos.org>"
 Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
 From       : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
  Preparing        :                                                        1/1
  Running scriptlet: centos-gpg-keys-8.1-1.1911.0.9.el8.noarch              1/1
  Installing       : centos-gpg-keys-8.1-1.1911.0.9.el8.noarch              1/4
  Installing       : centos-repos-8.1-1.1911.0.9.el8.x86_64                 2/4
  Upgrading        : centos-release-8.1-1.1911.0.9.el8.x86_64               3/4
  Cleanup          : centos-release-8.0-0.1905.0.9.el8.x86_64               4/4
  Running scriptlet: centos-release-8.0-0.1905.0.9.el8.x86_64               4/4
  Verifying        : centos-gpg-keys-8.1-1.1911.0.9.el8.noarch              1/4
  Verifying        : centos-repos-8.1-1.1911.0.9.el8.x86_64                 2/4
  Verifying        : centos-release-8.1-1.1911.0.9.el8.x86_64               3/4
  Verifying        : centos-release-8.0-0.1905.0.9.el8.x86_64               4/4

Upgraded:
  centos-release-8.1-1.1911.0.9.el8.x86_64

Installed:
  centos-gpg-keys-8.1-1.1911.0.9.el8.noarch
  centos-repos-8.1-1.1911.0.9.el8.x86_64

Complete!
Error: Unknown repo: 'C*-base'
==> default: Checking for guest additions in VM...
    default: No guest additions were detected on the base box for this VM! Guest
    default: additions are required for forwarded ports, shared folders, host only
    default: networking, and more. If SSH fails on this machine, please install
    default: the guest additions and repackage the box to continue.
    default:
    default: This is not an error message; everything may continue to work properly,
    default: in which case you may ignore this message.
The following SSH command responded with a non-zero exit status.
Vagrant assumes that this means the command failed!

yum install -y kernel-devel-`uname -r` --enablerepo=C*-base --enablerepo=C*-updates

Stdout from the command:



Stderr from the command:

Error: Unknown repo: 'C*-base'
```

手元だったら、バージョンを上げるなり、何らか調整すれば動くようになると思いますが、人の環境だとサポートが大変なので、`vagrant-vbguest` を前提とした運用にはしたくないなと思っています。

プラグインをいれるより、最初から vbguest が入っている box を使うほうが手っ取り早いのでは。


### 自動アップデート

`vagrant-vbguest` の自動アップデートをオフにするには以下の設定を行います。

 * https://github.com/dotless-de/vagrant-vbguest#configuration--usage

自動アップデート時には、一緒にカーネルなどのバージョンも上がるとのこと。また、プラグインが入っていない場合にエラーにならないように、対応が必要なようです。

 * https://pentan.info/server/vagrant/vagrant_vbguest_note.html

## synced_folders の挙動

Vagrant の `synced_folders` は Guest Additions が入っていない状態だと `type: rsync` がデフォルトになります。

 * https://www.vagrantup.com/docs/synced-folders/rsync

巨大なリポジトリで `vagrant up` しようとしたら、`Rsyncing` と表示されたまま止まった状態になっていました。大きな共有フォルダを rsync で運用するのは厳しそうです。

Guest Additions が入っていると `type: virtualbox` がデフォルトになるようです。

 * https://www.vagrantup.com/docs/synced-folders/virtualbox

> If you are using the Vagrant VirtualBox provider, then VirtualBox shared folders are the default synced folder type.