読者です 読者をやめる 読者になる 読者になる

CUBE SUGAR CONTAINER

技術系のこと書きます。

Vagrant: vagrant-vbguest プラグインで仮想マシンの Guest Additions を最新に保つ

Vagrant を VirtualBox プロバイダで使っていて煩わしく感じるのは、仮想マシンのカーネルを新しくするとその度に Guest Additions を手動で再インストールする必要がある点。 今回はその煩わしさを取り払ってくれる vagrant-vbguest プラグインを紹介する。

今回使う環境は以下の通り。

$ VBoxManage --version
5.0.0r101573
$ vagrant --version
Vagrant 1.7.4

Guest Additions が無いとどうなるか

仮想マシンのカーネルを新しいバージョンにすると、古いカーネルでビルドした Guest Additions が動作しなくなる。 すぐに分かるデメリットとしては、Guest Additions を使って実現していた共有ディレクトリがマウントできなくなる。 これはタイムアウトするまで続くので vagrant コマンドの実行結果が相当長い間ブロックすることになる。

$ vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Clearing any previously set forwarded ports...
...(省略)...
==> default: Mounting shared folders...
    default: /vagrant => /Users/amedama/Documents/vagrant/centos7
Failed to mount folders in Linux guest. This is usually because
the "vboxsf" file system is not available. Please verify that
the guest additions are properly installed in the guest and
can work properly. The command attempted was:

mount -t vboxsf -o uid=`id -u vagrant`,gid=`getent group vagrant | cut -d: -f3` vagrant /vagrant
mount -t vboxsf -o uid=`id -u vagrant`,gid=`id -g vagrant` vagrant /vagrant

The error output from the last command was:

/sbin/mount.vboxsf: mounting failed with the error: No such device

vagrant-vbguest プラグインで Guest Additions を自動インストールする

上記の問題は vagrant-vbguest プラグインを使うことで解決できる。

まずは Vagrant に vagrant-vbguest プラグインをインストールしよう。

$ vagrant plugin install vagrant-vbguest
Installing the 'vagrant-vbguest' plugin. This can take a few minutes...
Installed the plugin 'vagrant-vbguest (0.10.0)'!

おもむろに先ほどエラーになった仮想マシンをリロードすると、Guest Additions が無いことを検出して自動的にインストールが始まる。

$ vagrant reload
==> default: Clearing any previously set forwarded ports...
...(省略)...
==> default: Machine booted and ready!
No installation found.
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
 * base: www.ftp.ne.jp
 * extras: www.ftp.ne.jp
 * updates: www.ftp.ne.jp
Package kernel-devel-3.10.0-229.11.1.el7.x86_64 already installed and latest version
Package gcc-4.8.3-9.el7.x86_64 already installed and latest version
Package 1:make-3.82-21.el7.x86_64 already installed and latest version
Package 4:perl-5.16.3-285.el7.x86_64 already installed and latest version
Nothing to do
Copy iso file /Applications/VirtualBox.app/Contents/MacOS/VBoxGuestAdditions.iso into the box /tmp/VBoxGuestAdditions.iso
mount: /dev/loop0 is write-protected, mounting read-only
Installing Virtualbox Guest Additions 5.0.0 - guest version is 
Verifying archive integrity... All good.
Uncompressing VirtualBox 5.0.0 Guest Additions for Linux............
VirtualBox Guest Additions installer
Removing installed version 5.0.0 of VirtualBox Guest Additions...
Removing existing VirtualBox non-DKMS kernel modules[  OK  ]
Copying additional installer modules ...
Installing additional modules ...
Removing existing VirtualBox non-DKMS kernel modules[  OK  ]
Building the VirtualBox Guest Additions kernel modules
Building the main Guest Additions module[  OK  ]
Building the shared folder support module[  OK  ]
Building the OpenGL support module[  OK  ]
Doing non-kernel setup of the Guest Additions[  OK  ]
Starting the VirtualBox Guest Additions [  OK  ]
Installing the Window System drivers
Could not find the X.Org or XFree86 Window System, skipping.
An error occurred during installation of VirtualBox Guest Additions 5.0.0. Some functionality may not work as intended.
In most cases it is OK that the "Window System drivers" installation failed.
==> default: Checking for guest additions in VM...
==> default: Configuring and enabling network interfaces...
==> default: Mounting shared folders...
    default: /vagrant => /Users/amedama/Documents/vagrant/centos7
==> default: Machine already provisioned. Run `vagrant provision` or use the `--provision`
==> default: flag to force provisioning. Provisioners marked to run always will still run.

仮想マシンにログインすると今度は適切に共有ディレクトリがマウントできていることも確認できる。

$ vagrant ssh
$ ls /vagrant
Vagrantfile

vagrant-vbguest プラグインはデフォルトでは必要な際に自動的に Guest Additions をインストールするが、明示的に実行したい場合には vagrant vbguest サブコマンドを実行すれば良い。

$ vagrant vbguest
GuestAdditions 5.0.0 running --- OK.

いじょう。

まとめ

Vagrant を VirtualBox プロバイダで使っていると、仮想マシンのカーネルが新しくなる度にエラーになって煩わしく感じることが多い。 その際、通常であれば Guest Additions を手動で再インストールする必要があるが、vagrant-vbguest プラグインを使うとその手間が大幅に軽減できる。